CodeQL 文档

常量循环条件

ID: java/constant-loop-condition
Kind: problem
Security severity: 
Severity: warning
Precision: very-high
Tags:
   - correctness
   - external/cwe/cwe-835
Query suites:
   - java-security-and-quality.qls

点击以在 CodeQL 存储库中查看查询

循环可以包含多个退出条件,直接在循环条件中或作为 breakreturn 语句周围的保护。如果任何退出条件都无法得到满足,那么循环将永远不会终止。

建议

在编写旨在终止的循环时,请确保所有必要的退出条件都可以得到满足,并且循环终止是明确的。

示例

以下示例搜索具有给定名称的字段,并且打算在找不到该字段时抛出异常。但是,如果找不到该字段,双重循环结构意味着退出条件将永远无法满足,从而导致无限循环。

Object getField(Object obj, String name) throws NoSuchFieldError {
  Class clazz = obj.getClass();
  while (clazz != null) {
    for (Field f : clazz.getDeclaredFields()) {
      if (f.getName().equals(name)) {
        f.setAccessible(true);
        return f.get(obj);
      }
    }
  }
  throw new NoSuchFieldError(name);
}

解决方案是使用 if 语句将代码重写如下。

Object getField(Object obj, String name) throws NoSuchFieldError {
  Class clazz = obj.getClass();
  if (clazz != null) {
    for (Field f : clazz.getDeclaredFields()) {
      if (f.getName().equals(name)) {
        f.setAccessible(true);
        return f.get(obj);
      }
    }
  }
  throw new NoSuchFieldError(name);
}

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私