Правило 17.2 MISRA C:2012

Функции не должны вызывать себя, ни один прямо или косвенно

Описание

Управляйте определением

Функции не должны вызывать себя, ни один прямо или косвенно.

Объяснение

Переменные, локальные для функции, хранятся в стеке вызовов. Если вызовы функции самостоятельно прямо или косвенно несколько раз, доступное стековое пространство может быть превышено, вызвав серьезный отказ. Если рекурсией плотно не управляют, трудно определить максимальное требуемое стековое пространство.

Обменивайтесь сообщениями в отчете

Сообщение в Отчете: Функция XX не должна вызывать себя ни один прямо или косвенно. Функция XX вызвана косвенно YY.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

void foo1( void ) {     /* Non-compliant - Indirect recursion foo1->foo2->foo1... */
    foo2();
    foo1();               /* Non-compliant - Direct recursion */
}

void foo2( void ) {
    foo1();
}

В этом примере правило нарушено из-за:

  • Прямая рекурсия foo1foo1.

  • Косвенная рекурсия foo1foo2foo1.

Проверяйте информацию

Группа: Функция
Категория: необходимый
Категория AGC: необходимый
Язык: C90, C99

Введенный в R2014b