有返回值的函数其所有分枝都应显式返回
8.24 ID_notAllBranchReturn
如果有返回值的函数在某个分枝没有使用 return 语句显式返回,会导致标准未定义的行为。
示例:
int fun() {
if (condition1) {
return 1;
}
else if (condition2) {
} // Non-compliant, no return value
else {
return 3;
}
}
当条件符合 condition2 时,fun 函数的调用者将得到一个错误的返回值。
例外:
int main() {
printf("Hi~\n");
} // Compliant
标准规定未显式返回的 main 函数会返回 0,故 main 函数不受本规则约束。
依据
ISO/IEC 9899:1999 5.1.2.2.3(1)
ISO/IEC 9899:1999 6.9.1(12)-undefined
ISO/IEC 9899:2011 5.1.2.2.3(1)
ISO/IEC 9899:2011 6.9.1(12)-undefined
ISO/IEC 14882:2003 3.6.1(5)
ISO/IEC 14882:2003 6.6.3(2)-undefined
ISO/IEC 14882:2011 3.6.1(5)
ISO/IEC 14882:2011 6.6.3(2)-undefined
参考
CWE-394
MISRA C 2004 16.8
MISRA C 2012 17.4
MISRA C++ 2008 8-4-3
SEI CERT MSC52-CPP