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。