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

Диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

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

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

```cpp
#include <stdint.h>

uint64_t factorial(uint64_t n)
{
  return n > 1 ? n * factorial(n - 1) : 1;
}
```

По возможности, стоит заменить рекурсивный вызов циклом\. Вот как это можно сделать с предыдущим примером:

```cpp
#include <stdint.h>

uint64_t factorial(uint64_t n)
{
  uint64_t result = 1;
  for (; n > 1; --n)
  {
    result *= n;   
  }

  return result;
}
```