我正在编写一个生成C代码的编译器。生成的程序只包含main函数,它们使用大量内存,用malloc()分配。分配的大部分内存仅用于程序的一小部分,我认为在使用后释放它是个好主意,因为它不会再被使用。我很高兴,如果valgrind会向我报告在程序结束时内存不是free()d,即仍然可以访问的内存。我在Makefile中使用带有--error-exitcode = 1的valgrind来自动检查这种问题。
问题是:有没有办法让valgrind退出1,以防仍有可达的分配?
答案 0 :(得分:2)
间接丢失且仍然可以到达 块不算真实 “错误”,即使--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
现在将为您调用exit
,main
中的所有局部变量将在此时超出范围。
答案 2 :(得分:2)
当退出时存在可到达的块时,用于退出并出错的poroper选项:
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --errors-for-leak-kinds=all
因为有不同类型的泄漏具有不同的严重性,一个有趣的问题是:哪些泄漏应该算作真正的“错误”,哪些不应该?
此问题的答案会影响ERROR SUMMARY行中打印的数字,以及--error-exitcode选项的效果。首先,如果指定了--leak-check = full,则泄漏仅计为真正的“错误”。然后,选项--errors-for-leak-kinds =控制泄漏类型集合作为错误。默认值为--errors-for-leak-types =明确,可能
答案 3 :(得分:1)
或者你可以在你的makefile中有一个小的shell脚本来grep通过valgrind的输出日志并相应地退出。