不应忽略重要的返回值
10.6.1 ID_returnValueIgnored
与状态判断、信息获取、资源分配有关的返回值不应被忽略。
示例:
void bar(string& s) {
s.empty(); // Non-compliant
}
例中 empty 函数返回字符串是否为空,如果忽略返回值会使函数调用失去意义。
C++17 nodiscard 属性表示返回值具有重要意义,标准库中以及由用户标注的具有 nodiscard 属性的返回值不应被忽略,如:
[[nodiscard]] int fun(); // Or use __attribute__((warn_unused_result)) in GCC
int main() {
fun(); // Non-compliant
int r = fun(); // Compliant, ‘r’ should be used in subsequent code
....
static_cast<void>(fun()); // Let it go?
}
如果确实不需要使用返回值,可对函数调用表达式进行显式 void 转换,但应给出合理的解释,审计工具不妨通过配置决定是否放过这种情况。
配置
allowVoidCastedDiscard: 是否允许通过 void 转换忽略返回值
依据
ISO/IEC 14882:2003 5.2.9(4)
ISO/IEC 14882:2011 5.2.9(6)
ISO/IEC 14882:2017 10.6.7
参考
MISRA C 2012 17.7
MISRA C++ 2008 0-1-7
SEI CERT EXP12-C