exponenta event banner

Доступ к массиву вне границ

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

Описание

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

Риск

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

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

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

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

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

Чтобы устранить проблему, необходимо изменить ограничение цикла или индекс массива.

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

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

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

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

Примеры

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

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

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

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

Группа: Статическая память
Язык: C | C++
По умолчанию: Вкл.
Синтаксис командной строки: OUT_BOUND_ARRAY
Воздействие: Высокое
CWE ID: 119, 131, 466
Представлен в R2013b