ПроблемаИспорченный размер массива переменной длины обнаруживает массивы переменной длины (VLA), размер которых из небезопасного источника.
РискЕсли атакующий изменил размер вашего VLA к неожиданному значению, это может заставить вашу программу отказывать или неожиданно вести себя.
Если размер неположителен, поведение 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Одна возможная коррекция должна проверять переменную размера прежде, чем создать массив переменной длины. Этот пример проверяет, больше ли размер, чем 0 и меньше чем 40, прежде, чем создать VLA
#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;
}