Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Это правило актуально только для C. Объявление массивов, имеющих неконстантный размер (variable-length array, VLA), может привести к переполнению стека и потенциальным уязвимостям в программе.
Рассмотрим следующий пример:
void foo(size_t n)
{
int arr[n];
// ....
}
Передача большого числа 'n' может привести к переполнению стека, так как массив станет слишком большим и займет больше памяти, чем есть на самом деле.
Логичным решением выглядит ограничение размера массива:
#define MAX_SIZE 128
void foo(size_t n)
{
size_t size = n > MAX_SIZE ? MAX_SIZE : n;
int arr[size];
if (size < n) // error
// ....
}
Однако в таком случае лучше использовать константу для упрощения логики программы:
#define SIZE 128
void foo()
{
int arr[SIZE];
// ....
}
Также это позволит избежать проблем, связанных с VLA, например, вычислением 'sizeof' на таких массивах и их передачей в другие функции.
Данная диагностика классифицируется как:
|