矛盾类型检查¶
ID: java/contradictory-type-checks
Kind: problem
Security severity:
Severity: error
Precision: very-high
Tags:
- correctness
- logic
Query suites:
- java-security-and-quality.qls
如果 instanceof
表达式出现在类型测试保证返回 false
的位置,这通常是由于拼写错误或逻辑错误。它还表明周围代码未经过充分测试,甚至可能已失效。
同样,保证失败的强制转换通常表示测试不充分或失效的代码。
建议¶
检查周围代码是否存在逻辑错误。
示例¶
在以下示例中,方法 getKind
首先检查其参数 x
是否为类 Mammal
的实例,然后检查其是否为类 Tiger
的实例。
String getKind(Animal a) {
if (a instanceof Mammal) {
return "Mammal";
} else if (a instanceof Tiger) {
return "Tiger!";
} else {
return "unknown";
}
}
如果 Tiger
是 Mammal
的子类,则第二个 instanceof
检查永远无法评估为 true
。显然,应交换这两个条件
String getKind(Animal a) {
if (a instanceof Tiger) {
return "Tiger!";
} else if (a instanceof Mammal) {
return "Mammal";
} else {
return "unknown";
}
}
参考¶
Java 语言规范:类型比较运算符 instanceof。