3

Visual Studio 2012 のコード分析機能を使用しようとしています。既存のプロジェクトでそれらを実行したところ、Knuth の減算 PRNG (別名 RAN3) の独自の実装を含む部分でバッファー オーバーランの警告 ( C6385 / C6386 ) が見つかりました。 . ただし、問題がないように見えるため、なぜこれが発生するのか理解できません(範囲外の読み取り/書き込みは見られません)。そのため、その部分の短い同等物(以下)を作成しましたが、それでも同じ警告が表示され、それらの原因を特定できません。

int main() {
  unsigned int k = 1U, seed = 12345U, randomNumbers[55];

  randomNumbers[54] = seed;
  for(unsigned int i = 1U; i <= 54U; ++i) {
    unsigned int ii = ((21U * i) % 55U) - 1U;
    randomNumbers[ii] = k;
    k = seed - k;
    seed = randomNumbers[ii];
  }

  return 0;
}

上記のコードでは、7 行目に C6386 警告が表示され、9 行目に C6385 警告が表示されました。このコードの何が問題なのですか? 何か不足していますか?

4

3 に答える 3

1

g++ 4.8 および clang++ 3.3 は、警告またはエラーなしでこれをコンパイルします (-Wall -Werror を使用)。実際、C++11std::arrayとそのatメソッドを使用して境界チェックを行うことができます。

#include <array>

int main() {
  unsigned int k = 1U, seed = 12345U;
  std::array<int,55> randomNumbers;

  randomNumbers.at(54) = seed;

  for(unsigned int i = 1U; i <= 54U; ++i) {
    unsigned int ii = ((21U * i) % 55U) - 1U;
    randomNumbers.at(ii) = k;
    k = seed - k;
    seed = randomNumbers.at(ii);
  }

  return 0;
}

あなたが主張したように、範囲外のアクセスは発生しません。あなたのコードは問題ないと思います。VS は、行がunsigned int であるためオーバーフローする((21U * i) % 55U) - 1U)可能性があることを心配しています。unsigned int の代わりに int を使用しても、VS は文句を言いますか?0 - 1ii

(Python を使用すると、インデックス マッピングは問題ないようです。

>>> sorted([21*n % 55 - 1 for n in range(1,55)])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53]

特に unsigned int を使用して -1 に「到達」しないため、範囲外エラーは発生しないはずです。)

于 2013-07-20T13:08:45.027 に答える
0

ii の値を出力し、54 を超えているかどうかを確認します。この行で計算 unsigned int ii = ((21U * i) % 55U) - 1U;

于 2013-07-20T13:07:31.740 に答える