valgrindを使用してコードを検証すると、関数の1つで、引数としてポインターの配列を受け取る「条件付きジャンプまたは移動は初期化されていない値に依存します」と報告されます。
では、実行時に配列にジャンク値(条件付きブレークポイントを使用している可能性があります)が含まれているかどうかを確認するにはどうすればよいですか?たとえば、私はポインタにアクセスしないので、プログラムは壊れません。
ジャンクポインタを識別するためにチェックする条件は何ですか?
valgrindを使用してコードを検証すると、関数の1つで、引数としてポインターの配列を受け取る「条件付きジャンプまたは移動は初期化されていない値に依存します」と報告されます。
では、実行時に配列にジャンク値(条件付きブレークポイントを使用している可能性があります)が含まれているかどうかを確認するにはどうすればよいですか?たとえば、私はポインタにアクセスしないので、プログラムは壊れません。
ジャンクポインタを識別するためにチェックする条件は何ですか?
他の答えは正しいですが、valgrindを取得して、配列内のどのエントリが問題の原因であるかを正確に特定するのに役立てることもできます。
あなたがする必要があるのは、配列をループするコードをプログラムに追加し(もちろん、すでにそのようなループがあるかもしれません)、次にvalgrind/memcheck.h
このようなものをループに含めて追加することです:
if (VALGRIND_CHECK_VALUE_IS_DEFINED(entry)) {
printf("index %d undefined\n", index);
}
ここentry
で、は配列からの実際の値でありindex
、はarry内のその値のインデックスです。
有効なポインタとジャンク(初期化されていない)ポインタを区別することはできません。これらはすべて単なる数値です。
コード内のある時点で「ジャンク」ポインタを処理しているという事実は、その時点に到達する前に問題があることを示しています。
すべてのポインタを体系的にNULLに初期化する必要があります。メモリの割り当てを解除するときは、ポインタもNULLにリセットしてください。これは、たとえば、malloc/freeをラップする「コンストラクタ/デストラクタ」関数を使用して実行できます。そうして初めて、NULL値のポインターをテストして、問題が発生したかどうかを確認できます。
ジャンクをテストせず、配列を作成してから最初に値の使用を検討するまでのある時点で、ジャンク以外の値を配列に配置します。通常、アレイの作成時にこれを行います。
const char* strings[] = {0, "junk", "here"};
int some_values[10] = { 0 };
Valgrindは独自のトリックを使用して、ジャンクと思われるものを識別しますが、これらのトリックは標準の範囲外であり、通常のCコードでは使用できません(またはとにかく試してはいけません)。valgrindの機能に何らかの形でフックできたとしても、すべての実装で機能しないコード、またはvalgrindで実行した場合にのみ機能するコードになってしまいます。