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”的类型不确定。