exponenta event banner

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

Размер массива переменной длины (VLA) получен из небезопасного источника и может быть нулевым, отрицательным или слишком большим

Описание

Этот дефект возникает, когда размер массива переменной длины (VLA) получается из небезопасного источника. Чтобы считать все входные данные вне текущего периметра анализа небезопасными, используйте -consider-analysis-perimeter-as-trust-boundary.

Риск

Если злоумышленник изменил размер VLA на непредвиденное значение, это может привести к аварийному завершению работы программы или ее неожиданному поведению.

Если размер не является положительным, поведение VLA не определено. Ваша программа работает не так, как ожидалось.

Если размер не ограничен, VLA может привести к истощению памяти или переполнению стека.

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

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

Примеры

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

#include<stdio.h>
#inclule<stdlib.h>
#define LIM 40

long squaredSum(int size) {

	int tabvla[size];
	long res = 0;
	for (int i=0 ; i<LIM-1 ; ++i) {
		tabvla[i] = i*i;
		res += tabvla[i];
	}
	return res;
}
int main(){
	int size;
	scanf("%d",&size);
	//...
	long result = squaredSum(size);
	//...
	return 0;
}

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

Исправление - проверка размера VLA

Одной из возможных корректировок является проверка переменной размера перед созданием массива переменной длины. В этом примере перед созданием VLA проверяется, превышает ли размер 0 и меньше 40.

#include <stdio.h>
#include <stdlib.h>
#define LIM 40

long squaredSum(int size) {
	long res = 0;
	if (size>0 && size<LIM){
		int tabvla[size];
		for (int i=0 ; i<size || i<LIM-1 ; ++i) {
			tabvla[i] = i*i;
			res += tabvla[i];
		}
	}else{
		res = -1;
	}
	return res;
}
int main(){
	int size;
	scanf("%d",&size);
	//...
	long result = squaredSum(size);
	//...
	return 0;
}

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

Группа: Запятнанные данные
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: TAINTED_VLA_SIZE
Воздействие: среднее
CWE ID: 128, 131, 770, 789
Представлен в R2015b