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 は欠陥を報告しなくなります。