警告 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) 批注长度的数组。
此分析无法捕获所有可能的超界索引,因为并非所有算术都可以精确分析。 它已优化为报告一定可能会出现超界索引的情况。 没有警告并不意味着保证索引在边界内。