【问题标题】:Uninitialised byte(s) Valgrind complaint - inexplicable未初始化的字节 Valgrind 投诉 - 莫名其妙
【发布时间】:2013-09-13 00:31:46
【问题描述】:

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

拥有两个 int 或两个 bool,或者一个 int 或 bool,不会引起任何抱怨。看起来好像有一个包含不同类型成员的类会导致 Valgrind 抱怨。这不仅仅是因为我明确要求检查。在使用类似于 dummyObject 的对象的较大程序中,我收到“条件跳转或移动取决于未初始化的值”错误。

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

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

【问题讨论】:

  • 它抱怨无法被编译器初始化的填充字节。
  • gcc 4.7.2 和 Valgrind 3.9.0 存在同样的问题。我对 C++ 很陌生,但这在我看来是 Valgrind 中的一个大问题。这是有人遇到同样的问题stackoverflow.com/questions/19364942

标签: c++ memory valgrind


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!使用#pragma 用零填充来打包结构确实可以消除抱怨(尽管我将改为抑制 valgrind 错误)。
猜你喜欢
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 2012-03-12
  • 2019-02-04
  • 2013-04-22
  • 1970-01-01
相关资源
最近更新 更多