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/