JD.CAST.COL.MIGHT
コレクションの ClassCastException の可能性
JD.CAST.COL.MIGHT は、複数の型が同じコレクション (マップまたはリスト) に格納され、格納されている 1 つ以上の型が型キャストに使用される型に関連している場合に発生します。
脆弱性とリスク
コレクション内のオブジェクトの型が異なるため、これは ClassCastException の原因となる場合があります。
脆弱コード例 1
public class Test {
protected static final String NAME = "name";
protected static final String ID = "id";
private static final Map<String, Object> map = new HashMap<String, Object>();
public void setInfo(String name, int id) {
map.put(ID, new Integer(id));
map.put(NAME, name);
}
public static getInfo() {
Test test = new Test();
test.setInfo("me", 1);
Integer id = (Integer)map.get(ID));
String name = (String)map.get(NAME));
}
}
Klocwork は 21 行目で JD.CAST.COL.MIGHT の欠陥を報告します。これは次のことを示しています。コレクション要素の「java.lang.Integer」への疑わしい型変換である可能性があります。オブジェクトは「java.lang.String」としてコレクションに配置されました。-> 16: map.put(NAME, name); -> 21: Integer id = (Integer)map.get(ID)); And for line 22: コレクション要素の「java.lang.String」への疑わしい型変換である可能性があります。オブジェクトは「java.lang.Integer」としてコレクションに配置されました。->16: map.put(ID, new Integer(id)); -> 22: String name = (String)map.get(NAME));。
修正コード例 1
public class Test {
Map<String, Object> map = new HashMap<String, Object>();
public void setInfo(String str1, String str2) {
map.put("ID", str1);
map.put("NAME", str2);
}
public getInfo() {
Test test = new Test();
test.setInfo("might", "must");
for(Object obj : map.keySet()){
if(map.get(obj) instanceof String){
System.out.println("Name==>"+(String)map.get(obj));
}
}
}
}
コレクション内のオブジェクトは同じ型であるため、Klocwork は欠陥を報告しなくなります。
脆弱コード例 2
public class Test {
ArrayList<Object> list = new ArrayList<Object>();
public void setInfo() {
list.add("name");
list.add(new Integer(30));
}
public void display() {
System.out.println("==>"+(String) list.get(0));
System.out.println("==>"+(Integer) list.get(1));
}
}
Klocwork は 8 行目で JD.CAST.COL.MIGHT の欠陥を報告します。これは次のことを示しています。コレクション要素の「java.lang.String」への疑わしい型変換である可能性があります。オブジェクトは「java.lang.Integer」としてコレクションに配置されました。-> 5: list.add(new Integer(30)); -> 8: System.out.println("name==>"+(String) list.get(0)); And for line 9: コレクション要素の「java.lang.Integer」への疑わしい型変換である可能性があります。オブジェクトは「java.lang.String」としてコレクションに配置されました。->4: list.add("name"); -> 9: System.out.println("name==>"+(Integer) 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 は欠陥を報告しなくなります。