Valgrind一直在抱怨未初始化的字节,并且通过修改以寻找一个最小的例子,我最终得到了这个:
#include <valgrind/memcheck.h>
struct dummyObject{
int foo;
bool bar;
dummyObject():foo(1),bar(true) {}
};
int main(){
dummyObject dummy;
VALGRIND_CHECK_VALUE_IS_DEFINED(dummy);
return 0;
}
有两个整数或两个bool,或一个int或bool,不会引起任何抱怨。看起来好像有一个不同类型成员的班级导致Valgrind抱怨。这不仅仅是因为我明确要求检查;在一个更大的程序中,使用类似于dummyObject的对象,我得到“条件跳转或移动取决于未初始化的值”错误。
我的编译器是64位Linux上的g ++ 4.7.3,使用调试标志进行编译而没有优化 - 或者使用,它没有任何区别。
我有什么遗漏,还是假阳性?
答案 0 :(得分:3)
当您检查类型的大小时,您可能会发现大小与成员大小的总和不匹配。例如,在我的系统上,我得到:
sizeof(dummy)=8 sizeof(int)=4 sizeof(bool)=1
打印不同尺寸时。不同之处在于 padding 用于确保对象与系统可以轻松访问的地址对齐。这可能是未初始化的填充。