2017-06-27 12 views
0

C++で書かれたプログラムを実行しているときに、 Ubuntu 64ビット版Valgrind-3.11.0Valgrindサイズ4の無効な読み込みで、範囲外でもスタックでもない、mallocされた、または(最近)free'd

サイズ176のブロックが新たなオペレータとNのサイズが割り当てられたC++クラスのオブジェクトである8

Invalid read of size N. 
Address 0xblahblah is 88 bytes inside a block of size 176 alloc'd 

メッセージNが4,1の間で変化する異なるNと、次のようなエラー、範囲外のケースではないほど十分に小さいです。 なぜ、Valgrindは「積み重ねられていない」、「積み上げられていない」、「最近解放された」のような理由を教えてくれないのですか?

「スタックされていない」、「未割り当て」、「最近解放されました」などのメッセージがない場合、Valgrindがこれを無効な読み取りとして決定した理由を知っていますか?

+0

"Nのサイズは十分に小さいので、範囲外ではありません。"非連続。 Nのサイズは通常、レジスタサイズまで2の累乗です。アクセスが範囲外であるかどうかは関係ありません。 –

+0

@RaymondChenあなたのコメントをありがとうが、私はあなたのポイントを理解していない。 Nが8の場合、割り当てられた176バイトのブロック内にまだ88 + 8があるので、Valgrindは境界外アクセスのためにこれをエラーとして報告しないと決めました。 – nmc

+0

ああ、大丈夫です。範囲外ではないオフセットと組み合わせたNです。あなたはNを責めようとしたので、他の部分は見ていませんでした。おそらく、それは整列エラーを報告していますか? (さらに読むと、Nは最大48であり、アライメント理論と一致しません) –

答えて

0

Nは、基本となるプリミティブデータ型のサイズに対応します。大まかに言えば、1はcharまたはbool、4はintおよびfloat、8はint、double、またはポインタです。

XX bytes inside a block of size YY alloc'd 

まず、メモリがダイナミック(ヒープ上)でなく、自動(スタック上の〜)であることを意味します。次に、割り当てられたオブジェクトのサイズを知っています。オブジェクトごとのサイズを知っている場合(sizeofを使用してサイズを取得できます)、割り当てられたオブジェクトの数を調べることができます。

これ以前に他に重大なエラーがありますか?

コードでValgrindクライアントリクエストを使用していますか?

+0

ありがとうございます。私はValgrindクライアントリクエストを使用しません。 「重大なエラー」については、私が他の同僚と働いているので、答えが少し複雑です。私の同僚の一人は、私が見たことのない「無効な読み取り」の前に「条件付きジャンプまたは移動が初期化されていない値に依存している」と述べています。とにかく '初期化されていない値のアクセスエラー'を削除した後は、もう一度 '無効な読み取り'と思われます。しかし、私はまだ、「積み重ねられていない」、「mallocedされていません」、「最近解放されました」のような無効性の正確な理由がなく「無効な読み取り」につながる可能性は理解していません。 – nmc

関連する問題