JD.CAST.DOWNCAST
サブタイプが ClassCastException の可能性あり
JD.CAST.DOWNCAST は、タイプ B のオブジェクトがタイプ C にキャストされたときにトリガーされます。ここで、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(): 'TestVar1' から '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;
}
}
}
この例では、25 行目の if (var2 instanceOf TestVar2) で InstanceOf を使用してオブジェクトをチェックし、続いて 26 行目のTestVar2 testVar2 = (TestVar2)v2; でオブジェクトを型キャストしているため、Klocwork はもはや欠陥を報告していません。
脆弱コード例 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(): 'TestVar' から '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;
}
}
}
この例では、24 行目の if (var1 instanceOf TestVar1) で InstanceOf を使用してオブジェクトをチェックし、続いて 25 行目のTestVar1 testVar1 = (TestVar1)var1; でオブジェクトを型キャストしているため、Klocwork はもはや欠陥を報告していません。