常量循环条件¶
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
循环可以包含多个退出条件,直接在循环条件中或作为 break
或 return
语句周围的保护。如果任何退出条件都无法得到满足,那么循环将永远不会终止。
建议¶
在编写旨在终止的循环时,请确保所有必要的退出条件都可以得到满足,并且循环终止是明确的。
示例¶
以下示例搜索具有给定名称的字段,并且打算在找不到该字段时抛出异常。但是,如果找不到该字段,双重循环结构意味着退出条件将永远无法满足,从而导致无限循环。
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);
}