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 不再报告缺陷。