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