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

相关检查器