JD.CAST.SUSP.MIGHT
可能存在针对不同类型的 ClassCastException
当使用类型 A 的运算符实例检查对象,然后将对象转换为类型 B(其中类型 A 和类型 B 无关)时,触发 JD.CAST.SUSP.MIGHT。也就是说,Klocwork 无法发现 A 是 B 的子类型或 B 是 A 的子类型。
漏洞与风险
这可能是一种错误,因为转换不安全;对象可以是 B 以外的其他类型。在某些情况下,当从 instanceof 到转换的路径不兼容时,这种错误会产生误报。
缓解与预防
选择实际要使用的类型(A 或 B),并且将 typecast 改为 A,或者检查转换为 B 的 instanceof。
漏洞代码示例
复制
public class Test {
void mayBeBadCast(Object o) {
if (!(o instanceof String)) {
Number n = (Number) o;
System.out.println("May be bad cast");
}
}
}
针对第 4 行报告 JD.CAST.SUSP.MIGHT,因为我们不确定对象类型:在转换中使用该类型不安全。使用“! (a instanceof <Type>)”构造使“a”的类型不确定。