私は、C言語で変数を明示的に汚染することが可能かどうかを知りたいと思っています。初期化されていないものです。ここでGCC/Clangで変数を初期化しないように設定する方法はありますか?
擬似コード...
{
int *array;
array = some_alloc();
b = array[0];
some_free(array);
TAINT_MACRO(array);
/* the compiler should raise an uninitialized warning here */
b = array[0];
}
は、変数を汚染チェックするための一つの方法の一例ですが、GCCは、第二の使用ではなく、その後、「」初期化されていないVARに割り当てられたときに警告を上げています'a'。私が思い付くことができ
{
int a = 10;
printf("first %d\n", a);
do {
int b;
a = b;
} while(0);
printf("second %d\n", a);
}
唯一の解決策は、明示的に(未使用の警告が存在しないので、ボイドが追加される)、初期化されていないものと変数をシャドウすることです。
#define TAINT_MACRO_BEGIN(array) (void)(array); { void **array; (void)array;
#define TAINT_MACRO_END(array) } (void)(array);
{
int *array;
array = some_alloc();
b = array[0];
some_free(array);
TAINT_MACRO_BEGIN(array);
/* the compiler should raise an uninitialized warning here */
b = array[0];
TAINT_MACRO_END(array);
}
この方法は、既存のコードに含めるあまりにも多くのオーバーヘッドを追加します(ノイズおよび維持するために迷惑をたくさん追加されます)、その変数が初期化されていないコンパイラに伝えるためにいくつかの他の方法があった場合、私は思っていました。
私は静的チェッカーがあり、私はこれらを使用していることを知っていますが、私はコンパイル時に警告を与えることができ、このケースでは可能であると信じているバグの特定のクラス。
ポインタが1つの翻訳単位で解放され、別の翻訳単位で使用された場合はどうなりますか?コンパイラはそれをキャッチできません。 – Collin
'some_index'はあなたの最初の例では宣言されていません。私はすべてのコンパイラが初期化ではなく、それについて不平を言うことを期待しています。 – chux
2番目の例の警告が 'a = b;'で気に入らないのはなぜか分かりません。後で悪用される( 'printf(" second%d \ n "、a);) 。ほとんどのデバッグでは最初の警告で十分です。 – chux