JD.CAST.COL.MIGHT
可能存在针对集合的 ClassCastException
当同一集合(映射或列表)中存储多个类型且至少一个存储类型与用于类型转换的类型相关时,会发生 JD.CAST.COL.MIGHT。
漏洞与风险
这可能导致 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)); 放到了集合中。对于第 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)); 放到了集合中。对于第 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 不再报告缺陷。