JD.CAST.SUSP.MUST
针对不同类型的 ClassCastException
当使用类型 A 的运算符实例检查对象,然后将对象转换为类型 B(其中类型 A 和类型 B 无关)时,触发 JD.CAST.SUSP.MUST。也就是说,Klocwork 无法发现 A 是 B 的子类型或 B 是 A 的子类型。
漏洞与风险
这通常是一种错误,因为转换不安全;对象实际上可以是 B 以外的其他类型。在某些情况下,当从 instanceof 到转换的路径不兼容时,这种错误会产生误报。
缓解与预防
选择实际要使用的类型(A 或 B),并且将 typecast 改为 A,或者检查转换为 B 的 instanceof。
漏洞代码示例 1
复制
public class Test {
void badCast(Object o) {
if (o instanceof String) {
Number n = (Number) o;
System.out.println("bad cast");
}
}
}
在第 4 行报告了 JD.CAST.SUSP.MUST;对象为已知,因为正在使用 instanceof <Type> 构造对其进行检查。
漏洞代码示例 2
复制
void setValue(Object a, Object value) {
if (a instanceof String) {
StringBuffer b = (StringBuffer) a;
b.append("=");
b.append(value);
}
}
针对第 12 行的转换报告 JD.CAST.SUSP.MUST:怀疑 a 从 String 转换为 StringBuffer,其中的类型不相关。-> 11:a instanceof String-> 12:(StringBuffer)a。