exponenta event banner

MISRA C:2012 Правило 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.

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

Группа: Функция
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b