Share via


警告 C6201

索引 'index-name' 超出有效索引范围 'minimum' 至 'maximum',可能堆栈分配的缓冲区 'variable'

此警告指示指定堆栈数组的整数偏移量超过该数组的最大边界。 它可能会导致堆栈溢出错误、未定义的行为或故障。

备注

此缺陷的一个常见原因是将数组大小用作数组索引。 由于 C/C++ 数组从零开始编制索引,因此数组的最大合法索引小于数组元素的数目。

代码分析名称:INDEX_EXCEEDS_MAX

示例

下面的代码生成警告 C6201。 将 i 设置为 14 时,for 循环条件超过buff 的有效索引范围,这是结束之后的一个元素:

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) 批注长度的数组。

此分析无法捕获所有可能的超界索引,因为并非所有算术都可以精确分析。 它已优化为报告一定可能会出现超界索引的情况。 没有警告并不意味着保证索引在边界内。