Array access out of bounds

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

Описание

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

Риск

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

Исправление

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

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

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

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

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

Часто детали результата (или подсказки исходного кода в Polyspace, когда Вы Кодируете) показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают эту историю события, можно искать предыдущие ссылки переменных, относящихся к дефектному использованию, щелкают правой кнопкой по опциям по исходному коду и находят связанные события. См. также Интерпретируют Результаты Bug Finder в Пользовательском интерфейсе Рабочего стола Polyspace или Интерпретируют Результаты Bug Finder в 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]); 
}

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

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

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