避免函数调用自身
8.44 ID_recursion
函数直接或间接调用自身可实现递归算法,但调用栈的消耗情况不够直观,易导致栈溢出等错误。
应使用成本更易控制的方法代替递归调用,对于难以代替的特殊算法,应做到调用深度可控。另外,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