JD.CAST.DOWNCAST

可能存在针对子类型的 ClassCastException

当类型 B 的对象转换为类型 C 时,便会触发 JD.CAST.DOWNCAST,其中 B 和 C 是对象 A 的子类型。

漏洞与风险

这可能会导致 ClassCastException,因为一个基本类可能具有多个子类。

漏洞代码示例 1

复制
  class TestVar {}
  class TestVar1 extends TestVar {
   TestVar display() {
       return new TestVar1();
   }
  }
  class TestVar2 extends TestVar {
   TestVar display() {
       return new TestVar2();
   }
  } 
  public class DownCast {
   public void cast() {
       TestVar var = new TestVar1();
       TestVar2 var2 = (TestVar2)var.display();       
   }
  }

Klocwork 报告第 24 行出现 JD.CAST.DOWNCAST 缺陷,这表示“TestVar2 var2 = (TestVar2)var.display(): Suspicious cast of 'TestVar1' to 'TestVar2',其中 TestVar2 是 TestVar 的子类型。此对象可以保留其他子类型,这可能会导致 ClassCastException。”

修正代码示例 1

复制
  class TestVar {}
  class TestVar1 extends TestVar {
   TestVar display() {
       return new TestVar1();
   }
  }
  class TestVar2 extends TestVar {
   TestVar display() {
       return new TestVar2();
   }
  } 
  public class DownCast {
   public void cast() {
       TestVar var = new TestVar1();
       TestVar var2 = var.display();
       if (var2 instanceOf TestVar2){
         TestVar2 testVar2 = (TestVar2)var2;
       }          
   }
  }

在此示例中,Klocwork 不再报告缺陷,因为我们在第 25 行通过 InstanceOf 检查该对象:if (var2 instanceOf TestVar2),在此之后我们在第 26 行将该对象进行类型转换:TestVar2 testVar2 = (TestVar2)v2;。

漏洞代码示例 2

复制
  class TestVar {
   TestVar display() {
       return new TestVar();
   }
  }
  class TestVar1 extends TestVar {
   TestVar display() {
       return new TestVar1();
   }
  }
  public class DownCast {
   public void cast() {
       TestVar var = new TestVar();
       TestVar1 var1 = (TestVar1) var.display();
   }
  }

Klocwork 报告第 23 行出现 JD.CAST.DOWNCAST 缺陷,这表示“TestVar1 var1 = (TestVar1)var.display(): Suspicious cast of 'TestVar' to 'TestVar1',其中 TestVar1 是 TestVar 的子类型。此对象可以保留其他子类型,这可能会导致 ClassCastException。”

修正代码示例 2

复制
  class TestVar {
   TestVar display() {
       return new TestVar();
   }
  }
  class TestVar1 extends TestVar {
   TestVar display() {
       return new TestVar1();
   }
  }
  public class DownCast {
   public void cast() {
       TestVar var = new TestVar();
       TestVar var1 = var.display();
       if (var1 instanceOf TestVar1){
         TestVar1 testVar1 = (TestVar1)var1;
       }
   }
  }

在此示例中,Klocwork 不再报告缺陷,因为我们在第 24 行通过 InstanceOf 检查该对象:if (var1 instanceOf TestVar1),在此之后我们在第 25 行将该对象进行类型转换:TestVar1 testVar1 = (TestVar1)var1;。

相关检查器