簡體   English   中英

在源代碼,字節代碼,機器代碼等上執行靜態分析有哪些權衡?

[英]What are the tradeoffs of performing static analysis on source code, byte code, machine code, etc?

在各種代碼級別上執行靜態分析的各種權衡是什么? 例如對於Java,為什么有人會對Java源代碼與Jasmin代碼與Java字節碼進行靜態分析? 選擇是否限制或擴展了可以進行的各種類型的分析? 選擇是否會影響分析的正確性? 謝謝。

在各種代碼級別上執行靜態分析的各種權衡是什么? 例如,對於Java,為什么有人會對Java源代碼和Java字節碼執行靜態分析?

用戶的角度來看,我會說,除非你有非常具體的,易於形式化的屬性來分析(比如純安全屬性),否則請使用支持Java源代碼的工具。

從工具開發人員的角度來看,使用一個級別或另一個級別可能更容易。 我在這里介紹了我腦海中的不同之處。 (請注意,使用編譯器和/或體面的反編譯器,工具可以在一個層上運行,並將結果顯示在另一個層上。)

Java源代碼優點:

  • 結構化語言 ,即循環等,而不是任意跳轉。 (例如,這使得創建最弱的前提條件非常容易。)
  • 您可以在代碼中做出更多假設(字節碼程序更具表現力)。

字節碼的優點:

  • 語言規范(的字節碼指令的語義)是簡單了很多
  • 更加“固定”的機器規格(VM)
  • 您可以將分析擴展到遺留代碼和庫。
  • 分析允許其他語言針對JVM(Closure,Scala,JRuby ......)
  • 不需要可能復雜的解析器

機器代碼優點:

  • 您可以驗證實際為CPU提供的內容。 (如果您需要經過完全驗證的鏈,則無需使用經過驗證的編譯器或經過驗證的VM。)

最先進的工具,如Spec#等(C#的形式方法方言)通常會通過專門為正式分析設計的中間語言 (Spec#case中的BoogiePL(更好的MSIL和C#))。

選擇是否限制或擴展了可以進行的各種類型的分析?

最后......不,不是真的。 無論您選擇分析哪種( 圖靈完整 )語言,您都面臨着同樣的基本問題。 根據您分析的屬性,YMMV雖然如此。

如果您正在使用正式方法並考慮自己實現分析,我懷疑您會找到更好的字節碼工具支持。 如果您是用戶開發人員並希望在自己的代碼庫上執行分析,我懷疑您將從使用Java源代碼級別的工具中獲益更多。

選擇是否會影響分析的正確性?

取決於你的正確性意味着什么。 靜態分析通常是“防御性的”,因為你不會假設任何你不知道的事情是真的。 如果您將注意力限制在聲音驗證系統上,那么所有這些系統都將“同樣正確”。

IntelliJ對注釋進行靜態分析,例如Javadoc和字節代碼中沒有的參數名稱。 例如拼寫錯誤和名稱不一致。 代碼分析可確保您在任何問題的行中都有行號和位置。

分析字節代碼的好處是它更簡單,可能就是您所需要的。 您可能有行號,但您沒有該職位。 並且您可以分析您沒有源代碼的已編譯代碼,例如庫。

在各種代碼級別上執行靜態分析的各種權衡是什么? 例如對於Java,為什么有人會對Java源代碼與Jasmin代碼與Java字節碼進行靜態分析?

這樣想吧。 如果您從Jasmin或字節碼中得到否定結果(結果表明或暗示負面或有害屬性),您會怎么做? 您將如何以及時和具有成本效益的方式解決這個問題?

現在考慮的場景,其中的源代碼您擁有最有可能你的源代碼或代碼)回來報告說,需要解決負/有害屬性靜態分析?

您是否認為您將更難以解決映射到源代碼的這種有害方面,而不是對有害方面(可能類似或相關)執行相同但這次映射到字節碼或Jasmin?

問題是1)Jasmin應該是合法字節碼的一對一表示,2)字節碼是由真正的編譯器生成的。 在存在性能良好的編譯器的情況下 ,字節碼中的問題直接映射到源代碼引入的問題的可能性非常小。

無論在字節碼級別檢測到的問題是源代碼級別引入的問題還是編譯器/環境錯誤的結果,這些問題通常都是不可操作的(sp?) 你通常不能采取行動,至少不能直接采取行動。

在源代碼級別檢測到的問題,OTH,它們是有效的可操作的。 也就是說,你可以抓住它並修復它們(並通過推斷,從前者派生的字節代碼中刪除任何問題。)

有些東西可以在字節代碼級別檢測到,特別是在打包的情況下(即打包不必要的庫)。但是你幾乎不需要在字節代碼級別進行驗證。

除非您從事編譯器和語言設計(在這種情況下針對VM​​),為了提高效率和實用性,1)您認為編譯器是正確的,並且2)給定JVM規范的方式,您還假設編譯器在編譯時執行驗證,JVM在運行時進行驗證。

選擇是否限制或擴展了可以進行的各種類型的分析? 選擇是否會影響分析的正確性? 謝謝。

你如何定義正確性? 在這種情況下,什么是正確的? 它怎么會影響正確性呢? 我們是否在類型系統級別談論正確性? 部分和/或完全正確嗎? 關於公平,活力等屬性的正確性? 分析過程本身的正確性? 在滿足一項或多項要求方面的正確性?

定義你的條件dude :)

無論如何,您必須假設編譯器正在將代碼充分正確地轉換為目標指令集(同樣,除非您從事編譯器/語言設計業務。)

如果你假設你的代碼的“原生”表示是正確的(也就是說,它根據所需的目標平台和類型系統“映射”它),那么你將驗證領域縮小到你的來源要驗證的屬性的代碼。

另一個考慮因素是“抽象將失去高水平的信息”。 我們正在使用源代碼(高級),因為我們需要在源代碼中出現表達式。

源到二進制映射在源代碼可視化領域非常重要。

暫無
暫無

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

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