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

相关检查器