主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

数组访问越界

数组访问时数组索引超出范围

描述

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

风险

访问数组范围之外的数组是未定义的行为。您可能会读取一个不可预测的值,或尝试访问一个不允许访问的位置,从而遇到段错误。

修复

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

  • 循环的上限过大。

  • 您使用了与循环索引相同的数组索引,而不是比循环索引小 1 的数组索引。

要解决这个问题,您必须修改循环边界或数组索引。

数组索引可能超过数组边界的原因还有一个,即先将有符号整数转换为无符号整数。转换可能会导致索引值循环,最终导致数组索引超出数组边界。

通常,结果详细信息(或在 Polyspace as You Code 中显示的源代码提示)会显示导致缺陷的一系列事件。您可以在序列中的任何事件上实施此修复。如果结果详细信息未显示此事件历史记录,您可以使用源代码中的右键点击选项搜索与缺陷相关的变量的先前引用,并找到相关事件。另请参阅解释 Polyspace 桌面端用户界面中的 Bug Finder 结果解释 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
影响

版本历史记录

在 R2013b 中推出