如果仍有可达的alloc,如何使valgrind报告错误

时间:2011-05-20 11:04:23

标签: c free valgrind exit exit-code

我正在编写一个生成C代码的编译器。生成的程序只包含main函数,它们使用大量内存,用malloc()分配。分配的大部分内存仅用于程序的一小部分,我认为在使用后释放它是个好主意,因为它不会再被使用。我很高兴,如果valgrind会向我报告在程序结束时内存不是free()d,即仍然可以访问的内存。我在Makefile中使用带有--error-exitcode = 1的valgrind来自动检查这种问题。

问题是:有没有办法让valgrind退出1,以防仍有可达的分配?

4 个答案:

答案 0 :(得分:2)

valgrind manual说:

  

间接丢失且仍然可以到达   块不算真实   “错误”,即使--show-reachable = yes   指定并打印;   这是因为这样的块不需要   由程序员直接修复。

我发现无法使valgrind报告“仍然可以访问”为错误。这似乎是你唯一的选择(除了修补valgrind)是捕获valgrind的输出并解析“仍然可到达”的行。

答案 1 :(得分:2)

通过Valgrind输出进行grepping的替代方法:修改编译器,使其发出:

int main() { return foo_main(); }
int foo_main() {  /* whatever you've emitted before */ }

假设您没有将已分配的块分配给全局变量(由于您只有一个函数,这没有任何意义),您只需将“仍然可达”转换为“绝对泄露”。

可能更好的转型:不要在你的主要电话中拨打exit(0);将其更改为return 0;。净效应应与上述相同 - __libc_main现在将为您调用exitmain中的所有局部变量将在此时超出范围。

答案 2 :(得分:2)

当退出时存在可到达的块时,用于退出并出错的poroper选项:

valgrind --tool=memcheck --leak-check=full --show-reachable=yes --errors-for-leak-kinds=all

来自Valgrind manual

  

因为有不同类型的泄漏具有不同的严重性,一个有趣的问题是:哪些泄漏应该算作真正的“错误”,哪些不应该?

     

此问题的答案会影响ERROR SUMMARY行中打印的数字,以及--error-exitcode选项的效果。首先,如果指定了--leak-check = full,则泄漏仅计为真正的“错误”。然后,选项--errors-for-leak-kinds =控制泄漏类型集合作为错误。默认值为--errors-for-leak-types =明确,可能

答案 3 :(得分:1)

或者你可以在你的makefile中有一个小的shell脚本来grep通过valgrind的输出日志并相应地退出。