主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

数组索引越界

对数组的访问超出数组范围

描述

针对某个数组元素访问进行的此检查确定该元素是否在数组范围之外。只有当您使用索引表示法读取数组元素时,才会进行此检查;当您读取数组元素的地址时,不会进行此检查。

示例

全部展开

#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]);   
}

int main(void) {
  fibonacci();
}

在上方示例中,为数组 fib 指定的大小为 10。fib 的数组索引允许的值为 [0,1,2,...,9]。变量 ifor 循环中出来时值为 10。因此,当 printf 语句尝试通过 i 访问 fib[10] 时,数组索引越界检查会生成红色错误。

如果 printf 使用 *(fib+i) 而非 fib[i],该检查也会生成红色错误。

更正 — 使数组索引小于数组大小

一种可能的更正方法是在 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];
    }

  printf("The 10-th Fibonacci number is %i .\n", fib[i-1]);   
}

int main(void) {
  fibonacci();
}
extern int arr[];

int getFifthElement(void) {
   return arr[5];
}
int main(void){
	getFifthElement();
}

默认情况下,Code Prover 会假设可以通过任何索引安全地访问未定义大小的外部数组。针对外部数组访问进行的数组索引越界检查显示为绿色。

要删除此默认假设,请使用 -consider-external-array-access-unsafe 选项。使用此选项时,数组索引越界检查显示为橙色。

extern int arr[];

int getFifthElement(void) {
   return arr[5];
}
int arr[10];

int main(int arg, char* argv[]) {
    int *ptr = &arr[10];
    int val_ptr = *ptr;
    return 0;
}

在上方示例中,赋值给指针 ptr 的地址超出了为数组 arr 分配的内存。不过,此赋值不会触发数组索引越界检查。相反,只有当解引用指针时才会进行非法解引用指针检查,并且此检查将显示确定的错误(红色)。

检查信息

组:静态内存
语言:C | C++
缩写:OBAI