☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

避免函数调用自身

8.44 ID_recursion
目录 › next › previous

函数直接或间接调用自身可实现递归算法,但调用栈的消耗情况不够直观,易导致栈溢出等错误。

应使用成本更易控制的方法代替递归调用,对于难以代替的特殊算法,应做到调用深度可控。另外,main 函数、析构函数等特殊函数不可调用自身,否则会导致未定义的行为。

C++ 模板元编程中的编译期递归调用可不受本规则限制。

示例:

size_t foo(size_t n) {
    return n + foo(n - 1);  // Non-compliant
}

例中 foo 函数无条件地调用自身是一种逻辑错误,导致无限的递归调用。

又如:

size_t bar(size_t n) {
    if (n > 1) {
        return n + bar(n - 1);  // Non-compliant
    }
    return n;
}

例中 bar 函数设置了递归条件,但仍是不可取的,当参数 n 较大时仍然可以造成栈溢出错误。

依据

ISO/IEC 14882:2011 5.2.2(9)

参考

CWE-674 MISRA C 2012 17.2 MISRA C++ 2008 7-5-4
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.