CodeQL 文档

矛盾类型检查

ID: java/contradictory-type-checks
Kind: problem
Security severity: 
Severity: error
Precision: very-high
Tags:
   - correctness
   - logic
Query suites:
   - java-security-and-quality.qls

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

如果 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";
	}
}

如果 TigerMammal 的子类,则第二个 instanceof 检查永远无法评估为 true。显然,应交换这两个条件

String getKind(Animal a) {
	if (a instanceof Tiger) {
		return "Tiger!";
	} else if (a instanceof Mammal) {
		return "Mammal";
	} else {
		return "unknown";
	}
}

参考

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