泄漏消毒剂是否保证没有内存泄漏?

时间:2016-04-08 16:07:48

标签: c++ memory-leaks

如果我使用-fsanitize=leak标志编译c ++程序,这是否可以保证在运行时没有内存泄漏?

或者哪些更强大的泄漏检查工具(valgrind除外)?

2 个答案:

答案 0 :(得分:2)

简短回答:不。

无法保证消毒剂会检测到每一种可能的泄漏。也没有保证编译器会警告所有泄漏。也不保证Valgrind会发现所有泄漏。

这些工具以不同的方式尽力而为,但它们都有局限性(和错误)。

例如;

编译器只能通过分析源代码来警告它可以检测到的泄漏(并且它还有一个合理花费在其上的时间的上限)。

清理程序只能检测为了测试而编写的错误 - 然后,它只会在您实际执行的代码中检测到它们。因此,如果您的应用程序的特定运行仅运行50%的代码而泄漏在另一半中,则不会看到它。

同样,Valgrind只能检测它设计用于检测的泄漏,并且它无法访问源,也无法获得编译器检测的好处,它也只能看到实际运行的代码中的泄漏。

所以没有。没有标记任何泄漏的工具并不能证明没有泄漏。这需要正式证明不仅仅是代码的正确性,还需要它依赖的所有内容(例如标准库),这对于真实世界的程序来说并不是一个解决的问题。

最好的办法是运行一些不同的工具并修复他们发现的内容,并仔细和刻意地编写代码并知道你在做什么

答案 1 :(得分:1)

  

...这可以保证在运行时没有内存泄漏吗?

嗯,-fsanitize可能会要求措辞超出预期。该功能并非真正 清理 代码存在内存泄漏问题,但有助于检测它们。

来自GCC documentation

  
-fsanitize=leak
       Enable LeakSanitizer, a memory leak detector.  This option only
       matters for linking of executables and if neither
       -fsanitize=address nor -fsanitize=thread is used.  In that case
       the executable is linked against a library that overrides
       "malloc" and other allocator functions.  See
       <https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer >
       for more details.  The run-time behavior can be influenced using
       the LSAN_OPTIONS environment variable.