主要内容

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

指针访问越界

指针在超出其作用域范围外被解引用

描述

此缺陷发生在指针在超出其作用域范围外被解引用时。

当一个指针被赋予一个地址时,一个内存模块就会与该指针相关联。您无法使用指针访问该模块之外的内存。

风险

在指针的有效范围之外对其进行解引用是未定义行为。您可能会读取一个不可预测的值,或尝试访问一个不允许访问的位置,从而遇到段错误。

修复

修复方法取决于缺陷的根本原因。例如,您在循环中解引用了一个指针,并且发生了以下情况之一:

  • 循环的上限过大。

  • 您使用指针运算将指针向前移动,但指针递增值不正确。

要解决这个问题,您必须修改循环边界或指针递增值。

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

请参阅以下修复示例。

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

示例

全部展开

int* Initialize(void)
{
 int arr[10];
 int *ptr=arr;

 for (int i=0; i<=9;i++)
   {
    ptr++;
    *ptr=i;
    /* Defect: ptr out of bounds for i=9 */
   }

 return(arr);
}

ptr 被分配了地址 arr,该地址指向大小为 10*sizeof(int) 的内存模块。在 for-循环中,ptr 被递增 10 次。在循环的最后一次迭代中,ptr 指向分配给它的内存模块之外。因此,它无法被解引用。

更正 - 检查指针是否在范围内

一种可能的更正方法是将 ptr 的增量操作和解引用操作的顺序颠倒过来。

int* Initialize(void)
{
 int arr[10];
 int *ptr=arr;

 for (int i=0; i<=9;i++)
     {
      /* Fix: Dereference pointer before increment */
      *ptr=i;
      ptr++;
     }

 return(arr);
}

在最后一次递增之后,即使 ptr 指向分配给它的内存模块之外,也不会再被解引用。

结果信息

组:静态内存
语言:C | C++
默认值:On
命令行语法:OUT_BOUND_PTR
影响

版本历史记录

在 R2013b 中推出