无论如何有一个valgrind消息“有条件的跳跃或移动取决于未初始化的值”可以是所谓的“误报”

时间:2011-12-08 14:07:10

标签: c++ c valgrind

我在这里找到的大多数问题都提供了一段代码,并由指向实际错误的人解答。我的问题是关于一般未初始化值的条件跳转。我可以理解,如果确定这个分配只执行一次并且在程序的生命周期中可能需要,那么在程序结束时不一定要清理一块内存。据我所知,当程序终止时,GType系统会留下很多不同的内存。这些不一致的块可以被视为“误报”。但是,“有条件的跳跃或未初始化的价值”是否会成为假阳性?我能想到的唯一一件事就是有人通过读取随机地址(随机地址本身就是棘手的部分)来实现(坏)随机化功能。另一个例子可能是硬件映射到存储器的一部分然后被读取,但这主要由驱动程序完成,而不是由普通用户应用程序完成。是否有其他可能导致这种假阳性的例子(最好是C)?

2 个答案:

答案 0 :(得分:6)

valgrind报告的是,它看到一个基于从一个位置读取的跳转,它知道它是由程序分配的,但是它没有看到初始化。如果对象由valgrind不知道的某些魔法初始化,则可能会发生这种情况。架构不断发展,也许你有一个valgrind不够了解的指令或注册类型。

此类非初始化的另一个困难来源是union。两个来源:

  • 默认情况下,对于这些仅初始化第一个成员,因此 当另一个领域超出该部分可能的第一个成员时 初始化。
  • 如果union的成员是struct他们可能有填充 不同地方的字节,因此成员的一部分可能是 如果您分配给其他成员,则未初始化。

在某些情况下,甚至阅读这些内容(例如通过unsigned char[])可能是合法的,所以如果你认为这样的错误(假阳性)是一个透视问题。

答案 1 :(得分:4)

绝对!我曾经有过

形式的C代码
// compute a and, possibly, b
if (a && b) {
    // do stuff
}

如果b为真,则保证初始化a。因此,b的未初始化值无法导致问题。但是,gcc在充分优化时,决定首先检查b的值。这是可以接受的,因为两项检查都没有任何副作用,但它仍然导致valgrind抱怨。