c - 使 valgrind 在未初始化的值上快速失败

标签 c valgrind memcheck

Valgrind memcheck 使用一系列启发式方法来避免对“无害”使用未初始化值的误报,因为这种使用在正确和不正确但功能正常的代码中都很常见。

特别是,它不会呕吐,直到您以一种严肃的、也许是“不可逆”的方式实际使用这样的值,例如,根据它的值跳跃。

这意味着有时错误发生在距离问题根源很远的地方,甚至无法确定涉及哪个值。是否有某种方法可以在运行时“检查”一个值,比如 use(x) 如果 x 未初始化,这将使 Valgrind 在该点发出错误?

最佳答案

您可以让您的use(x) 宏使用Valgrind VALGRIND_CHECK_VALUE_IS_DEFINED Client Request当场得到一个错误。

为此,包括 valgrind/memcheck.h 并将宏定义为

#define use(x) VALGRIND_CHECK_VALUE_IS_DEFINED(x)

并确保始终传递左值。

您还可以使用 --track-origins=yes 运行 memcheck 以进行更重的跟踪,以显示未初始化数据的来源。

另见 the Valgrind FAQ on uninitialised value errors ,这解释了两者,以及为什么 Valgrind 不提示复制未初始化的值。

关于c - 使 valgrind 在未初始化的值上快速失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56846012/

相关文章:

c - 在被调用函数中 malloc 数组但在调用函数中释放它是否可以?

c - 我正确加载我的字符数组吗?

ubuntu - 使用 libssh 时的内存泄漏

c++ - OOM 时不会崩溃的内存泄漏,或出现在 massif/valgrind 中

c - 如何在c中的数组中插入新元素

c - GPU上size_t的sizeof是多少?

c - 打印指针值时出现段错误

Python Api C 产生内存泄漏

linux - Valgrind 不会检测到明显的错误

java - 防止 valgrind 跟踪使用 execvp 创建的任何 java 子进程