INVARIANT_CONDITION.UNREACH
条件中导致无法访问的代码的不变表达式
INVARIANT_CONDITION.UNREACH 检查器会搜索选择或迭代语句中的真/假条件,这些条件会导致其分支中出现无法访问的代码问题。该检查器与无法访问的代码检查器(如 UNREACH.GEN 或 UNREACH.RETURN)不同,后者会报告无法访问的代码而不是导致无法访问的原因。INVARIANT_CONDITION.UNREACH 检查器仅报告导致无法访问的代码的条件。由于此类检查器会检测类似问题(尽管方式稍有不同),因此仅在关闭无法访问的代码检查器时打开 INVARIANT_CONDITION.UNREACH 这一做法很合理。
漏洞与风险
不变条件可能会导致意外的程序行为,这是因为编写的代码和设计预期不相符。不变条件也可能会在代码维护或代码评审时引起混淆。
代码示例
复制
enum status_codes {
ST_UNKNOWN = -1,
ST_SUCCESS,
ST_INVALIDARG,
ST_NOTFOUND,
ST_FATAL,
};
extern void report_warn();
extern void report_err();
void report_status(int code)
{
if (code < 0) {
exit(1);
}
if (code >= ST_FATAL) {
report_err();
} else {
report_warn();
if (code == ST_UNKNOWN) { // <== invariant condition
exit(2); // ( <== unreachable code )
}
}
}
Klocwork 将第 22 行的 code == ST_UNKNOWN 条件报告为 INVARIANT_CONDITION.UNREACH 问题,因为之前在第 15 行上进行的检查发现,变量 code 的值由此路径上的非负值保护。在 13 行通过此条件控制的代码分支无法访问。
要修正此问题,请更改检查条件的顺序。