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;。