我從編譯器理論的角度提出了更多的問題。爲什麼空指針分析未能考慮Assert.notNull()
的影響?爲什麼Eclipse空指針分析未能識別斷言實用程序?
斷言方法是春天,它是爲實現:
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
的訪問將不會被標記爲空指針訪問(在這種微不足道的情況下,它將成爲死代碼)。然而,一個靜態方法不能被重載(不是沒有字節碼提示),那麼編譯器設計者的POV的基本原理是不會進入空指針分析的方法調用中?
這只是表現關心,還是有阻止這一般做的事情?或者使其與其他編譯器檢查一致(死代碼分析也沒有考慮該方法)?
問題是圖靈完整的一般,但更有限的解決方案几乎肯定是不切實際的。 –
是的,由於停機問題,機器不能完全檢查非平凡的代碼,但許多代碼仍然可以靜態地完成。我可能是錯的,但我相信如果分析器內聯了所有的(靜態)方法調用,它應該能夠更好地處理像我這樣的許多微不足道的情況,但是由於某種原因,它只是在方法調用中停止。我承認雖然編譯後,目標函數可以很容易地被替換,導致驗證無效。 –