4

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

2 つの int または 2 つの bool、または 1 つの int または bool を使用しても問題はありません。さまざまなタイプのメンバーを持つクラスを持つと、Valgrind が不平を言うように見えます。これは、単純に私の明示的なチェック要求によるものではありません。dummyObject に似たオブジェクトが使用される大規模なプログラムでは、「条件付きのジャンプまたは移動は初期化されていない値に依存します」というエラーが発生します。

私のコンパイラは、64 ビット Linux 上の g++ 4.7.3 であり、デバッグ フラグを使用して最適化を行わずにコンパイルします。または、違いはありません。

見逃しているものはありますか、それとも誤検知ですか?

4

1 に答える 1

2

型のサイズを確認すると、おそらくサイズがメンバーのサイズの合計と一致しないことがわかります。たとえば、私のシステムでは次のようになります。

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

異なるサイズを印刷する場合。違いは、オブジェクトがシステムから簡単にアクセスできるアドレスに整列されるようにするために使用されるパディングです。初期化されていないのはおそらくこのパディングです。

于 2013-09-13T00:39:23.267 に答える