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