exponenta event banner

Массив переменной длины с непозволительным размером

Размер массива переменной длины равен нулю или отрицателен

Описание

Этот дефект возникает, когда размер массива переменной длины равен нулю или отрицателен.

Риск

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

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

При объявлении массива переменной длины как локальной переменной в функции:

  • Если в качестве размера массива используется параметр функции, проверьте, что параметр является положительным.

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

Проверить положительное значение можно перед вызовом функции или объявлением массива в теле функции.

Примеры

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

int input(void);

void add_scalar(int n, int m) {
    int r=0;
    int arr[m][n];
    for (int i=0; i<m; i++) {
        for (int j=0; j<n; j++) {
            arr[i][j] = input();
            r += arr[i][j];
        }
    }
}

void main() {
    add_scalar(2,2);
    add_scalar(-1,2);
    add_scalar(2,0);
}

В этом примере второй и третий вызовы add_scalar привести к отрицательному и нулевому размеру arr.

Исправление - Сделать размер массива положительным

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

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

Группа: Программирование
Язык: C | C++
По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода
Синтаксис командной строки: NON_POSITIVE_VLA_SIZE
Воздействие: Высокое
ИДЕНТИФИКАТОР CWE: 687
Представлен в R2015b