Array access out of bounds

Индекс массива за пределами границ во время доступа к массиву

Описание

Этот дефект возникает, когда индекс массива падает за пределы области значений [0...array_size-1] во время доступа к массиву.

Риск

Доступ к массиву за его пределами является неопределенным поведением. Можно считать непредсказуемое значение или попытаться получить доступ к расположению, которое не разрешено, и столкнуться с отказом сегментации.

Зафиксировать

Исправление зависит от первопричины дефекта. Например, вы получили доступ к массиву внутри цикла, и произошла одна из следующих ситуаций:

  • Верхняя граница цикла слишком велика.

  • Вы использовали индекс массива, который совпадает с индексом цикла, а не на один меньше, чем индекс цикла.

Чтобы исправить проблему, вы должны изменить связанный цикл или индекс массива.

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

Часто детали результата показывают последовательность событий, которые привели к дефекту. Вы можете реализовать исправление на любом событии в последовательности. Если сведения о результате не отображают историю событий, можно отследить их с помощью опций правого щелчка в исходном коде и просмотреть предыдущие связанные события. Смотрите также Результаты интерпретации Bug Finder в интерфейсе пользователя Polyspace Desktop.

См. примеры исправлений ниже.

Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.

Примеры

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

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

    /* Fix: Print fib[9] instead of fib[10] */
    printf("The 10-th Fibonacci number is %i .\n", fib[i-1]); 
}

The printf доступ к оператору fib[9] вместо fib[10].

Информация о результатах

Группа: Статическая память
Язык: C | C++
По умолчанию: On
Синтаксис командной строки: OUT_BOUND_ARRAY
Влияние: Высокий
ИДЕНТИФИКАТОР CWE: 119, 131, 466
Введенный в R2013b