未初始化的字节瓦尔格林德投诉 - 莫名其妙

Uninitialised byte(s) Valgrind complaint - inexplicable

本文关键字:林德投 莫名其妙 初始化 字节      更新时间:2023-10-16

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;
}

有两个整数或两个布尔值,或者一个整数或布尔值,不会引起任何抱怨。看起来好像有一个不同类型成员的班级会导致瓦尔格林德抱怨。这不仅仅是因为我明确要求检查;在使用类似于 dummyObject 的对象的大型程序中,我收到"条件跳转或移动取决于未初始化的值"错误。

我的编译器是 4.7.3 位 Linux 上的 g++ 64,使用调试标志进行编译,没有优化 - 或者,它没有区别。

是我遗漏了什么,还是误报?

当您检查类型的大小时,您可能会发现大小与成员大小的总和不匹配。例如,在我的系统上,我得到:

sizeof(dummy)=8 sizeof(int)=4 sizeof(bool)=1

打印不同尺寸时。区别在于填充用于确保对象与系统可以轻松访问它们的地址对齐。可能是这个填充是未初始化的。