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。