主要内容

数组访问越界

在数组访问期间数组索引超出边界

描述

当数组访问期间数组索引超出范围 [0...array_size-1] 时,会出现此缺陷。

风险

访问数组边界之外的位置属于未定义行为。这意味着您可能会读取到不可预测的值,或者尝试访问不允许的位置,从而导致分段故障。

修复

修复方法取决于缺陷的根本原因。例如,您在循环内访问数组时发生了以下情况之一:

  • 循环的上界太大。

  • 使用的数组索引与循环索引相同,而非比循环索引小一。

要修复此问题,您必须修改循环边界或数组索引。

可能导致数组索引超出数组边界的另一个原因是先前将有符号整数转换为了无符号整数。这种转换可能导致索引值循环,最终使数组索引超出数组边界。

通常,结果详细信息(或 Polyspace® as You Code™ 中的源代码工具提示)会显示导致该缺陷的一系列事件。您可以在该系列中的任何事件上实施修复。如果结果详细信息未显示此事件历史记录,您可以通过在源代码中使用右键点击选项来搜索缺陷相关变量的先前引用,并查找相关事件。另请参阅Interpret Polyspace Bug Finder Results in Polyspace Platform User Interface解释 Polyspace Access Web 界面中的 Bug Finder 结果 (Polyspace Access)

请参阅下面的修复示例。

如果您不想修复该问题,可以在结果或代码中添加注释,以避免再次被审查。请参阅:

扩展检查项

当输入值未知并且只有一部分输入会导致问题时,默认的 Bug Finder 分析可能不会引发此缺陷。要检查由特定系统输入值引起的缺陷,请运行更严格的 Bug Finder 分析。请参阅Extend Bug Finder Checkers to Find Defects from Specific System Input Values

示例

全部展开

#include <stdio.h>

void fibonacci(void)
{
    int i;
    int fib[10];
 
    for (i = 0; i < 10; i++) 
       {
        if (i < 2) 
            fib[i] = 1;
         else 
            fib[i] = fib[i-1] + fib[i-2];
       }

    printf("The 10-th Fibonacci number is %i .\n", fib[i]);   
    /* Defect: Value of i is greater than allowed value of 9 */
}

为数组 fib 赋予的大小为 10。fib 的数组索引允许的值为 [0,1,2,...,9]。变量 ifor 循环结束时值为 10。因此,printf 语句尝试通过 i 访问 fib[10]

更正 - 使数组索引保持在数组边界内

一种可能的更正方法是在 for 循环后打印 fib[i-1] 而非 fib[i]

#include <stdio.h>

void fibonacci(void)
{
   int i;
   int fib[10];

   for (i = 0; i < 10; i++) 
    {
        if (i < 2) 
            fib[i] = 1;
        else 
            fib[i] = fib[i-1] + fib[i-2];
    }

    /* Fix: Print fib[9] instead of fib[10] */
    printf("The 10-th Fibonacci number is %i .\n", fib[i-1]); 
}

printf 语句访问 fib[9] 而非 fib[10]

结果信息

组:静态内存
语言:C | C++
默认值:On
命令行语法:OUT_BOUND_ARRAY
影响
PQL 名称:std.defects.OUT_BOUND_ARRAY

版本历史记录

在 R2013b 中推出