0

3つの静的変数を持つ関数があります。奇妙ですが、3つの静的変数の1つが再初期化されることがあります。

static uchar * Foo( uchar c_par1, uchar c_par2, uchar c_par3 )
{
   static char        s_var1[10];
   static uchar       c_var2     = 0;
   static uchar       c_var3     = 0;
   .....
   return s_var1;
}

上記の場合、c_var2が再統合されることがあります。

これらの各変数のメモリ位置も出力しており、変更されることはないため、再統合されると確信しています。s_var1がc_var2を上書きする可能性があると思われましたが、これら2つの変数のメモリ位置はかなり離れています。

4

1 に答える 1

5

s_var1 が c_var2 を上書きするのではないかと疑っていましたが、これら 2 つの変数のメモリ位置は大きく離れています。

これは、どこかでグローバル バッファ オーバーフローのように聞こえます。

実行して、近くにnm -n a.outある変数を見つけます。次に、これらの変数によって引き起こされたオーバーフローを探します。 c_var2

またはAddress Sanitizerを使用すると、バグの正確な位置を簡単に知ることができます。

これをデバッグする別の方法: GDB でプログラムを実行し、 のアドレスにウォッチポイントを設定しますc_var2c_var2ウォッチポイントは、変更されるたびに起動する必要があります。

たとえば、どこかに遅延を追加した場合

プログラムがマルチスレッド化されている場合は、静的変数とスレッドがうまく連携しないことに注意してください。

マルチスレッド化されていない場合、遅延がどのように影響するかわかりません (信号も処理していない限り)。

于 2012-05-17T04:06:46.327 に答える