主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

MISRA C:2012 Rule 17.2

Functions shall not call themselves, either directly or indirectly

描述

规则定义

Functions shall not call themselves, either directly or indirectly 1 .

理由

函数的局部变量存储在调用堆栈中。如果一个函数直接或间接多次调用自身,可能会超过可用的堆栈空间,从而导致严重故障。除非递归被严格控制,否则很难确定所需的最大栈空间。

Polyspace 实现

检查项报告直接、间接或通过函数指针调用自身的每个函数。即使一个递归循环涉及多个函数,每个函数也会单独报告。

您可以使用代码复杂度度量递归次数计算递归周期的总数。

故障排除

如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

void foo1(int);
void foo2(int);

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

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

在此示例中,由于以下原因违反了规则:

  • 直接递归 foo1foo1

  • 间接递归 foo1foo2foo1

  • 间接递归 foo2foo1foo2

请注意,直接递归和间接递归的规则违反位置不同:

  • 当一个函数直接调用自身时,规则违反会在函数调用处显示。

  • 当多个函数涉及间接递归链时,对于链中的每个函数,函数体中的函数签名都会显示规则违规。

检查信息

组:函数
类别:必需
AGC 类别:必需

版本历史记录

在 R2014b 中推出

全部展开


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.