MISRA C:2012 Rule 17.2

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

Описание

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

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

Объяснение

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

Реализация Polyspace

Средство проверки сообщает о каждой функции, которая вызывает себя, прямо или косвенно. Даже если несколько функций вовлечены в один цикл рекурсии, о каждой функции индивидуально сообщают.

Можно вычислить общее количество циклов рекурсии с помощью метрики сложности кода Number of Recursions.

Дополнительное сообщение в отчете

Сообщение в Отчете: Функция XX вызвана косвенно YY.

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

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

Примеры

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

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

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

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

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

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

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

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

Группа: Функция
Категория: необходимый
Категория AGC: необходимый
Введенный в R2014b