>
>
>
V2565. MISRA. A function should not cal…


V2565. MISRA. A function should not call itself either directly or indirectly.

Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.

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

Пример кода, на который анализатор выдаст предупреждения:

#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;
}

Данная диагностика классифицируется как:

  • MISRA-C-17.2
  • MISRA-CPP-7.5.4