共用方式為


警告 C6200

非堆疊緩衝區 'parameter-name' 的索引 ' min' 到 ' max ' 的有效索引範圍 ' min '

這個警告表示指定之 Nonstack 陣列中的整數位移超過該陣列的最大界限,導致未定義的行為,而且可能會當機。

備註

此瑕疵的其中一個常見原因是使用陣列的大小做為陣列的索引。 由於 C/C++ 陣列索引編制是以零起始,陣列中最大的合法索引小於陣列元素的數目。

程式碼分析名稱: INDEX_EXCEEDS_MAX_NONSTACK

範例

下列程式碼會產生此警告。 此問題源于 for 超過索引範圍的迴圈,嘗試在索引 13 (第 14 個元素) 是最後一個時,嘗試存取索引 14 (第 15 個元素) :

void f()
{
    int* buff = new int[14]; // array of 0..13 elements
    for (int i = 0; i <= 14; i++) // i exceeds the index
    {
        buff[i] = 0; // warning C6200
    }
    delete[] buff;
}

若要更正這兩個警告,請使用正確的陣列大小,如下列程式碼所示:

void f()
{
    int* buff = new int[14]; // array of 0..13 elements
    for (int i = 0; i < 14; i++) // i == 13 on the final iteration
    {
        buff[i] = 0; // initialize buffer
    }
    delete[] buff;
}

啟發學習法

程式碼分析不一定能證明陣列索引是否在範圍內。 例如,從複雜運算式計算索引時,可能會發生這種情況,包括呼叫其他函式的運算式。 在這些情況下,程式碼分析可能會回復到其他線索,以判斷陣列索引運算式可能落入的範圍。

例如,請考慮下列 rand() 在索引計算中使用的函式,做為程式碼分析無法分析之函式呼叫的待用函式:

#include <stdlib.h>

void f()
{
    int* buff = new int[14];
    for (int i = 1; i < 14; i++)
    {
        buff[rand()] = 0;       // no warning, nothing is known about the return value of rand()
        buff[rand() % 15] = 0;  // warning C6200, rand() % 15 is known to be in the range 0..14 and index 14 is out of bounds
        buff[rand() % 14] = 0;  // no warning, rand() % 14 is known to be in the range 0..13
    }
    delete[] buff;
}

程式碼分析不會因為 rand() 其傳回值沒有任何相關資訊而發出警告。 另一方面, rand() % 15 並提供 rand() % 14 傳回值 rand() 範圍和程式碼分析的提示,可以使用該資訊來判斷索引在第一個案例中超出界限,而不是第二個。