Данное диагностическое правило основано на руководстве 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' на таких массивах и их передачей в другие функции.
Данная диагностика классифицируется как:
|