私はコンパイラ理論の観点からもっと質問をしています。ヌルポインター分析がその影響を考慮できなかったのはなぜAssert.notNull()
ですか?
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ポインタ分析のメソッド呼び出しに参加しない理由は何でしょうか。
それは単にパフォーマンスの問題ですか、それともこれが一般的に行われるのを妨げる何かがありますか?または、他のコンパイラチェックとの整合性を保つために(デッドコード分析でもそのメソッドは考慮されませんでした)?