簡體   English   中英

JVM字節碼驗證程序的職責

[英]Responsibilities of JVM bytecode verifier

有人可以列出字節碼驗證器必須執行的主要任務,以保證程序的正確性嗎? JVM規范中是否定義了一組標准的最小職責? 我還想知道驗證是否跨越其他階段,如加載和初始化。

這在JVM規范中指定:第4.10章。 驗證類文件

該頁面的大部分內容描述了類型安全的各個方面。 要檢查程序是否類型安全,驗證程序需要確定每個程序點的操作數堆棧中駐留的操作數類型,並確保它們與相應指令所期望的類型相匹配。

它驗證的其他內容包括但不限於以下內容:

  • 分支必須在方法的代碼數組的范圍內。

  • 所有控制流指令的目標都是指令的開始。 在寬指令的情況下,寬操作碼被認為是指令的開始,並且給予由該寬指令修改的操作的操作碼不被認為是開始指令。 不允許分支到指令的中間。

  • 沒有指令可以訪問或修改索引大於或等於其方法指示它分配的局部變量數的局部變量。

  • 對常量池的所有引用必須是相應類型的條目。 (例如,指令getfield必須引用一個字段。)

  • 代碼不會在指令中間結束。

  • 執行不能脫離代碼的末尾。

  • 對於每個異常處理程序,由處理程序保護的代碼的起始點和結束點必須位於指令的開頭,或者在結束點的情況下,緊接在代碼的結尾之后。 起點必須在結束點之前。 異常處理程序代碼必須從有效指令開始,並且它不能從寬指令修改的操作碼開始。

作為最后一步,驗證程序還執行數據流分析,確保沒有指令引用任何未初始化的局部變量。

另外,您可能想看看James Gosling撰寫的Java語言環境白皮書。

![在此處輸入圖像說明

字節碼驗證器遍歷字節碼,構造類型狀態信息,並驗證所有字節碼指令的參數類型。

該圖顯示了Java語言源代碼通過Java編譯器到類加載器和字節碼驗證器的數據流和控制,從而顯示了包含解釋器和運行時系統的Java虛擬機。 重要的問題是Java類加載器和字節碼驗證器沒有對字節碼流的主要來源做出任何假設 - 代碼可能來自本地系統,或者它可能已經繞過地球一半。 字節碼驗證器充當一種網守:它確保傳遞給Java解釋器的代碼處於適合的狀態以便執行並且可以運行而不用擔心破壞Java解釋器。 在通過驗證程序的測試之前,不允許以任何方式執行導入的代碼。 完成驗證程序后,會知道許多重要屬性:

  • 沒有操作數堆棧溢出或下溢
  • 已知所有字節碼指令的參數類型總是正確的
  • 已知對象字段訪問是合法的 - 私有,公共或受保護

雖然所有這些檢查看起來都非常詳細,但是當字節碼驗證器完成其工作時,Java解釋器可以繼續進行,因為知道代碼將安全運行。 了解這些屬性會使Java解釋器更快,因為它不需要檢查任何內容。 沒有操作數類型檢查和堆棧溢出檢查。 因此,解釋器可以全速運行而不會影響可靠性。

它執行以下操作:

  • 沒有操作數堆棧溢出或下溢
  • 已知所有字節碼指令的參數類型總是正確的
  • 已知對象字段訪問是合法的 - 私有,公共或受保護

參考: http//java.sun.com/docs/white/langenv/Security.doc3.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM