如何通过GCC内存泄漏检测彻底消除代码中的潜在隐患?
- 内容介绍
- 文章标签
- 相关推荐
栓Q了... 别再等到凌晨两点去服务器上抓包了。把-fsanitize=address加到你的Makefile或者CMakeLists.txt里吧, 看着那一行行绿色的测试通过看着ASan没有任何报错的输出,那种安心感,才是程序员真正追求的“小确幸”嗯。彻底告别代码隐患,让你的程序像钢铁一样坚固,从这一行代码开始,太扎心了。。
那些令人抓狂的内存泄漏
每一个C/C++程序员大概都有过这种经历:深夜两点, 盯着屏幕上不断攀升的内存占用率,心里那种无力感简直让人抓狂。你明明觉得自己代码写得逻辑严密, 他破防了。 无懈可击,但程序跑久了就像个喝醉的汉子,越来越慢,再说说甚至直接崩溃。这时候,你不得不面对那个令人闻风丧胆的幽灵——内存泄漏,容我插一句...。
有垃圾回收机制帮我们擦屁股, 但在C/C++的底层江湖里每一块malloc或new出来的内存,都需要我们亲手free或delete。一旦忘了或者某个异常分支跳过了释放,内存就泄露了。以前,我们可能只能靠猜,靠笨重的打印日志, 有啥用呢? 甚至靠玄学来调试。但现在作为Linux下最主流的编译器,GCC其实早就给我们准备好了一套强大的“武器库”。今天 我们就来聊聊如何利用GCC的这些神兵利器, 特别是AddressSanitizer,来彻底根治代码隐患,摸鱼。。
GCC提供的利器:AddressSanitizer
GCC提供了AddressSanitizer工具,可以检测内存泄漏、缓冲区溢出等问题。.可以:.AddressSanitizer会在程序运行时检测内存泄漏,并在控制台输出详细的报告。.
改进一下。 ASan是一个编译期的工具, 也就是说它在编译的时候给你的代码“插桩”,加入了一些检测逻辑。它的速度非常快, 通常只会让程序慢2倍左右,而且对内存错误的检测极其灵敏,不仅能发现泄漏,还能发现越界访问、野指针访问等问题。
栓Q了... 别再等到凌晨两点去服务器上抓包了。把-fsanitize=address加到你的Makefile或者CMakeLists.txt里吧, 看着那一行行绿色的测试通过看着ASan没有任何报错的输出,那种安心感,才是程序员真正追求的“小确幸”嗯。彻底告别代码隐患,让你的程序像钢铁一样坚固,从这一行代码开始,太扎心了。。
那些令人抓狂的内存泄漏
每一个C/C++程序员大概都有过这种经历:深夜两点, 盯着屏幕上不断攀升的内存占用率,心里那种无力感简直让人抓狂。你明明觉得自己代码写得逻辑严密, 他破防了。 无懈可击,但程序跑久了就像个喝醉的汉子,越来越慢,再说说甚至直接崩溃。这时候,你不得不面对那个令人闻风丧胆的幽灵——内存泄漏,容我插一句...。
有垃圾回收机制帮我们擦屁股, 但在C/C++的底层江湖里每一块malloc或new出来的内存,都需要我们亲手free或delete。一旦忘了或者某个异常分支跳过了释放,内存就泄露了。以前,我们可能只能靠猜,靠笨重的打印日志, 有啥用呢? 甚至靠玄学来调试。但现在作为Linux下最主流的编译器,GCC其实早就给我们准备好了一套强大的“武器库”。今天 我们就来聊聊如何利用GCC的这些神兵利器, 特别是AddressSanitizer,来彻底根治代码隐患,摸鱼。。
GCC提供的利器:AddressSanitizer
GCC提供了AddressSanitizer工具,可以检测内存泄漏、缓冲区溢出等问题。.可以:.AddressSanitizer会在程序运行时检测内存泄漏,并在控制台输出详细的报告。.
改进一下。 ASan是一个编译期的工具, 也就是说它在编译的时候给你的代码“插桩”,加入了一些检测逻辑。它的速度非常快, 通常只会让程序慢2倍左右,而且对内存错误的检测极其灵敏,不仅能发现泄漏,还能发现越界访问、野指针访问等问题。

