5

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

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

4

4 回答 4

2

valgrind 手册说:

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

我发现没有办法让 valgrind 将“仍然可以访问”报告为错误。似乎您唯一的选择(除了修补 valgrind)是捕获 valgrind 的输出并解析“仍然可以访问”行。

于 2011-05-20T12:31:55.000 回答
2

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

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

假设您没有将分配的块分配给全局变量(这没有任何意义,因为您只有一个函数),您刚刚将“仍然可以访问”转换为“肯定泄漏”。

可能更好的转变:不要调用exit(0)你的 main;改为return 0;改为。最终效果应该和上面一样——__libc_main现在会调用exit你,到那时所有局部变量main都将超出范围。

于 2011-05-22T20:02:42.517 回答
2

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

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

来自Valgrind 手册

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

这个问题的答案会影响打印在 ERROR Summary 行中的数字,以及 --error-exitcode 选项的效果。首先,如果指定了 --leak-check=full,则仅将泄漏计为真正的“错误”。然后,选项 --errors-for-leak-kinds= 控制泄漏种类集以将其视为错误。默认值为 --errors-for-leak-kinds=defined,possible

于 2015-07-23T14:59:35.193 回答
1

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

于 2011-05-21T01:11:17.880 回答