警告 C6201
インデックス 'index-name' が、スタック割り当てバッファー 'variable' の有効なインデックス範囲 'minimum' から 'maximum' の範囲外です
この警告は、指定されたスタック配列への整数オフセットが、その配列の上限を超えていることを示しています。 スタック オーバーフロー エラー、未定義の動作、またはクラッシュが発生する可能性があります。
解説
この欠陥の一般的な原因の 1 つは、配列のサイズを、配列へのインデックスとして使用していることです。 C/C++ の配列インデックスは 0 から始まるため、配列への有効な最大インデックスは、配列要素の数より 1 つ少なくなります。
コード分析名: INDEX_EXCEEDS_MAX
例
次のコードでは、警告 C6201 が生成されます。 ループ条件が for
14 に設定i
されたときのbuff
有効なインデックス範囲を超えています。これは、末尾を 1 つ超える要素です。
void f()
{
int buff[14]; // array of 0..13 elements
for (int i = 0; i <= 14; i++) // i == 14 exceeds the bounds
{
buff[i] = 0; // initialize buffer
}
}
警告を修正するには、インデックスが境界内に留まれていることを確認します。 次のコードは、修正されたループ条件を示しています。
void f()
{
int buff[14]; // array of 0..13 elements
for (int i = 0; i < 14; i++) // i == 13 on the final iteration
{
buff[i]= 0; // initialize buffer
}
}
ヒューリスティック
この分析は、スタック割り当て配列に限定されます。 たとえば、Microsoft ソース コード注釈言語 (SAL) 注釈付きの長さで関数に渡される配列は考慮されません。
すべての算術を正確に分析できるわけではないため、この分析では、可能なすべての範囲外のインデックスをキャッチすることはできません。 これは、範囲外のインデックスが可能であることを保証できるケースを報告するように調整されています。 警告が存在しないということは、インデックスが境界内に存在することが保証されることを意味するわけではありません。