4

チームメイトの 1 人が書いた古いコードを調べると、次のような非常に奇妙なコードが見つかりました。

if (...) {
    // some code

} else if (this == null) {
    System.out.println("I expected this to be dead code!");
}

変ですね。私の知る限り、this == null条件はとの両方trueの意味を知っているため、コンパイラーには明らかなはずです。しかし驚いたことに、それはデッド コードとしてマークされていませんでした。thisnull

このコードをEclipseとコマンドラインの両方で試しました。次のコマンドを実行して、すべての警告を有効にしました。

javac -Xlint:all MyClass.java

それでも警告は出ませんでした。

逆に、else ifブロックを次のように変更すると:

else if (false) {
    System.out.println("As expected, this is dead code");
}

予想通り、内部のステートメントはデッド コードとしてマークされました。

では、なぜこのような振る舞いをするのでしょうか? これは、this実際にnull. それは...ですか?

4

3 に答える 3

0

ライスの定理は、Java 式が評価されるかどうかのチェックfalseが決定不能であることを暗示しています。つまり、任意のコードが死んでいるかどうかを判断することは理論的に不可能です。

Java コンパイラはすべてのデッド コードを検出できるわけではないため、開発者は検出可能なデッド コードのインスタンスの非常に特定のセットに落ち着きました。

于 2014-07-16T22:48:23.950 に答える
0

コンパイラは、暗黙的に常に偽の状態を検出するのにむらがあるようです.JLSによって暗示または宣言されている場合でも、明らかに偽である場合でも、その事実を認識できない場合があります。is-null チェックは、チェックする "明白な条件" のセットを単純にリストするだけではキャッチするのが簡単ではないため、見過ごされている可能性があります。

于 2013-10-08T10:32:35.350 に答える