INVARIANT_CONDITION.UNREACH

条件中的不变表达式会导致代码无法访问

INVARIANT_CONDITION.UNREACH 检查器会搜索选择或迭代语句中的真/假条件,这些条件会导致其分支中出现无法访问的代码问题。该检查器与无法访问的代码检查器(如 UNREACH.GENUNREACH.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 行通过此条件控制的代码分支无法访问。

要修正此问题,请更改检查条件的顺序。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。