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

関連チェッカー