Данное диагностическое правило основано на руководстве AUTOSAR (AUTomotive Open System ARchitecture) по разработке программного обеспечения.
Функции не должны вызывать себя ни напрямую, ни косвенно. Рекурсия может привести к сложно отлавливаемым ошибкам. Одной из них может быть переполнение стека при очень глубокой рекурсии.
Пример кода, на который анализатор выдаст предупреждения:
#include <stdint.h> uint64_t factorial(uint64_t n) { return n > 1 ? n * factorial(n - 1) : 1; }
По возможности, стоит заменить рекурсивный вызов циклом. Вот как это можно сделать с предыдущим примером:
#include <stdint.h> uint64_t factorial(uint64_t n) { uint64_t result = 1; for (; n > 1; --n) { result *= n; } return result; }
Данная диагностика классифицируется как:
|