JD.CAST.SUSP.MUST

さまざまな型の ClassCastException

JD.CAST.SUSP.MUST は、オブジェクトが型 A に対する演算子のインスタンスでチェックされた後、型 A と型 B が無関係であるにもかかわらず、型 A に変換される場合に起動されます。すなわち、Klocwork は、A が B の派生型であることや、B が A の派生型であることを調べることができません。

脆弱性とリスク

型変換は安全でないため、通常、これはエラーです。実際にはオブジェクトは B 以外の型である可能性があります。場合によっては、instanceof から cast へのパスに矛盾があると、このエラーは誤検知を生じる可能性があります。

軽減と防止

実際に使用する型 (A または B) を選択し、A に型変換するか、B への instanceof をチェックしてください。

脆弱コード例 1

コピー
  public class Test {
      void badCast(Object o) {
          if (o instanceof String) {
              Number n = (Number) o;
              System.out.println("bad cast");
          }
      }
  }

JD.CAST.SUSP.MUST が 4 行目で報告されています。このオブジェクトは 'instanceof <Type> 構文でチェックされているため、認識済みとなっています。

脆弱コード例 2

コピー
   void setValue(Object a, Object value) {
     if (a instanceof String) {
       StringBuffer b = (StringBuffer) a;
       b.append("=");
       b.append(value);
     }
   }

JD.CAST.SUSP.MUST が 12 行目の型変換に対して報告されています。'String' から 'StringBuffer' への 'a' の型変換は疑わしい型変換です。これは無関係な型です。-> 11: a instanceof String-> 12: (StringBuffer)a。

関連チェッカー