Out of bounds array index

Массив получает доступ к внешней области значений

Описание

Эта проверка доступа к элементу массива определяет, находится ли элемент вне области значений массива. Проверка происходит только, когда вы считываете элемент массива с помощью индекса обозначения а не когда вы берете адрес элемента массива.

Примеры

расширить все

#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]. Переменная i имеет значение 10, когда оно выходит из for-цикл. Поэтому, когда printf оператор пытается получить доступ к fib[10] через iпроверка Out of bounds array index приводит к красной ошибке.

Проверка также вызывает красную ошибку, если printf использует *(fib+i) вместо fib[i].

Коррекция - Сохраните индекс массива меньше, чем размер массива

Одной из возможных коррекций является печать fib[i-1] вместо fib[i] после for-цикл.

#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 по умолчанию принимает, что к внешним массивам неопределенного размера можно безопасно получить доступ по любому индексу. Проверка Out of bounds array index доступа к внешнему массиву зеленого цвета.

Чтобы удалить это предположение по умолчанию, используйте опцию -consider-external-array-access-unsafe. При помощи этой опции проверка Out of bounds array index выполняется оранжевым цветом.

extern int arr[];

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

Проверяйте информацию

Группа: Статическая память
Язык: C | C++
Акроним: OBAI