JD.CAST.COL.MUST
コレクションの ClassCastException
JD.CAST.COL.MUST は、コレクションに値を格納するために使用されるどの型も、即時キャストで使用される型に関連していない場合に発生します。
脆弱性とリスク
コレクション内のオブジェクトの型が異なるため、通常、これは、ClassCastException の原因となります。
脆弱コード例 1
コピー
public class Test {
protected static final String NAME = "name";
protected static final String ADDRESS = "address";
private static final Map<String, Object> map = new HashMap<String, Object>();
public void setInfo(String name, String addr) {
map.put(ADDRESS, addr);
map.put(NAME, name);
}
public static getInfo() {
Test test = new Test();
test.setInfo("me", “Delhi”);
System.out.println("Address==>"+(String)map.get(ADDRESS));
System.out.println("Name==>"+(Number)map.get(NAME));
}
}
Klocwork は 22 行目で JD.CAST.COL.MUST の欠陥を報告します。これは次のことを示しています。"コレクション要素の「java.lang.Number」への疑わしい型変換です。オブジェクトは「java.lang.String」としてコレクションに配置されました。-> 16: map.put(NAME, name); -> 21: System.out.println("Name==>"+(Number)map.get(NAME));"。
修正コード例 1
コピー
public class Test {
protected static final String NAME = "name";
protected static final String ADDRESS = "address";
private static final Map<String, Object> map = new HashMap<String, Object>();
public void setInfo(String name, String addr) {
map.put(ADDRESS, addr);
map.put(NAME, name);
}
public static getInfo() {
Test test = new Test();
test.setInfo("me", “Delhi”);
System.out.println("Address==>"+(String)map.get(ADDRESS));
System.out.println("Name==>"+(String)map.get(NAME));
}
}
オブジェクトは同じタイプであるため、Klocwork は欠陥を報告しなくなります。
脆弱コード例 2
コピー
public class Test {
ArrayList<Object> list = new ArrayList<Object>();
public void setInfo() {
list.add("name");
list.add(“address”);
}
public void display() {
System.out.println("name==>"+(String) list.get(0));
System.out.println("name==>"+(Number) list.get(1));
}
}
Klocwork は 9 行目で JD.CAST.COL.MUST の欠陥を報告します。これは次のことを示しています。コレクション要素の「java.lang.Number」への疑わしい型変換です。オブジェクトは「java.lang.String」としてコレクションに配置されました。->4: list.add("address"); -> 9: System.out.println("name==>"+(Number) list.get(1));"。
修正コード例 2
コピー
public class Test {
ArrayList<Object> list = new ArrayList<Object>();
public void setInfo() {
list.add("might");
list.add("must");
}
public void display() {
Test test = new Test();
test.setInfo();
for(Object obj : list) {
if(obj instanceof String) {
System.out.println("name==>"+(String) obj);
}
}
}
}
オブジェクトは同じタイプであるため、Klocwork は欠陥を報告しなくなります。