0

私はコンパイラ理論の観点からもっと質問をしています。ヌルポインター分析がその影響を考慮できなかったのはなぜAssert.notNull()ですか?

コードブロックは、Assert.notNull()の後にエラーとして強調表示されたnull参照アクセスを示します

AssertメソッドはSpringからのものであり、次のように実装されます。

public static void notNull(Object object, String message) {
    if (object == null) {
        throw new IllegalArgumentException(message);
    }
}

public static void notNull(Object object) {
    notNull(object, "[Assertion failed] - this argument is required; it must not be null");
}

(この種のアサーションユーティリティを使用すると、アサーション後にその変数に最初にアクセスすると警告が発生し、警告のないコードを実行できなくなるため、これは非常に面倒になります。)

アサーションルーチンを完全にインライン化すると、へのアクセスaはnullポインタアクセスとしてマークされません(この些細なケースでは、デッドコードになります)。ただし、静的メソッドはオーバーライドできません(バイトコードをいじることなく)。したがって、コンパイラ設計者のPOVから、nullポインタ分析のメソッド呼び出しに参加しない理由は何でしょうか。

それは単にパフォーマンスの問題ですか、それともこれが一般的に行われるのを妨げる何かがありますか?または、他のコンパイラチェックとの整合性を保つために(デッドコード分析でもそのメソッドは考慮されませんでした)?

4

2 に答える 2

3

Eclipseのnullポインタ分析がアサーションユーティリティを認識できなかったのはなぜですか?

Eclipseのnullポインター分析は、分析しているメソッドのステートメントのみを考慮しているため、呼び出されたメソッドのセマンティクスは考慮されていません。Spring(そして、私は確かに、Eclipseコンパイラーの分析コードがアサーション・メソッドを特殊なケースとして扱うことを期待/望んでいません。)

これはかなり迷惑になります...

それでは、ヌル分析をオフにしてください。(これを行うには、Eclipseコンパイラー設定が必要です。)

または、値が常にとは限らないようにコードを変更しますnull。または、参照を逆参照する(動的に)到達不能なステートメントを削除しnullます。

正直なところ、あなたの例は非常に工夫されているので、実際のコードでそのようなことをしている人は誰も想像できません。コードの意味を変えない「修正」はありません。これは実際のコードには当てはまらないと思います...


考えてみると、ここでの問題は、Javaで初期化されていない変数や到達不能なステートメントを検出する問題とほぼ同じです。そして、EclipseはJava/JLSと同じソリューションを採用しています。


Eclipseが最先端の非ローカル分析コードを使用する必要があるという考えについては...私は同意しません。これにより、Eclipseのインタラクティブなコンパイルが非常に遅くなります。

これを実装しない理由は他にもあります。

  • 一般的な場合(停止性問題)では問題が解決できないという事実、
  • 理論的に解ける場合に解くのが技術的に難しい問題であるという事実、
  • 余分なコードを維持する必要があるという事実、および
  • 機能の有用性が限られているという事実。(私は真剣に、それらのユーザーが数秒で自分で解決できる小さなサブセットのユーザーの小さな刺激を修正するために何ヶ月も費やす価値があると本当に思いますか...コンパイラの設定を微調整することによって?)

しかし、それについて強く感じている場合は、分析コードを自由に開発およびテストして、Eclipseプロジェクトに貢献することができます。

于 2012-12-10T00:43:57.597 に答える
0

もちろん、これは質問というよりも議論です。

  1. コンパイルに使用するjarは、必ずしも実行に使用するjarではありません。特にAssertは、実稼働環境で異なる実装を行う候補になります。

  2. nullポインタエラーは、デッドコードエラー(ここ)よりも優れています。

  3. Eclipseコンパイラはバックグラウンドで継続的にコンパイルします。インテリジェンスは速度の低下で支払われるので、このチェックはfindbugsのようなツールの方が多いかもしれません。(すべてのライブラリ呼び出しを考えてみてください。実行時例外を介すると、制御フローが中断される可能性があります。)

于 2012-12-10T00:54:51.203 に答える