作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在这里找到的大多数问题都提供一段代码,并由指出实际错误的人回答。我的问题是关于一般未初始化值的条件跳转。我可以理解,如果确定此分配仅完成一次并且在程序的生命周期内可能需要,则不必在程序结束时清理一 block 内存。据我所知,当程序终止时,GType 系统会留下大量未释放的内存。这些未释放的 block 可以被视为“误报”。但是“有条件的跳跃或移动未初始化的值”会是误报吗?我唯一能想出的是有人通过读取随机地址来实现(坏的)随机函数(其中随机地址本身是棘手的部分;)。另一个例子可能是硬件映射到内存的一部分然后被读取,但这主要是由驱动程序而不是由普通用户应用程序完成的。是否有任何其他示例(最好是 C)可能导致这种误报?
最佳答案
valgrind 报告的是,它看到一个基于读取的跳转,该位置从它知道它是由程序分配但尚未看到初始化的位置读取。如果对象是由 valgrind 不知道的某种魔法初始化的,则可能会发生这种情况。体系结构不断发展,也许您有 valgrind 不太了解的指令或寄存器类型。
这种非初始化的另一个困难来源是union
。两个来源:
union
的成员是 struct
他们可能有填充字节在不同的地方,所以成员的一部分可能是如果您分配给其他成员,则未初始化。在某些情况下,甚至读取这些东西(例如通过 unsigned char[]
)可能是合法的,所以如果你认为这些东西是错误(误报)或不是问题的观点。
关于c++ - 无论如何有一个 valgrind 消息 "Conditional jump or move depends on uninitialized value"可以是所谓的 'false positive',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8432202/
我是一名优秀的程序员,十分优秀!