exponenta event banner

Индекс массива вне границ

Доступ к массиву осуществляется вне диапазона

Описание

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

Примеры

развернуть все

#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 приводит к красной ошибке.

Проверка также приводит к появлению красной ошибки, если 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 при доступе к внешнему массиву имеет зеленый цвет.

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

extern int arr[];

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

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

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