回答
gcc -S
將輸出將被傳遞給彙編器(並最終被鏈接到可執行文件中)的彙編代碼。如果你斜視正確的方式(並且耐心),你可以從中反向工作以確認給定的代碼位是否已經被包含在可執行文件中,或者被優化掉了。
顯然不是東西,你會做,除非你有懷疑的東西是怎麼回事,考慮到時間和所需的工作量......
我知道關於-S,但我希望有一個更直接的解決方案。 – user2373145
抱歉,您的期望不匹配究竟編譯器一樣。無論您是在尋找死代碼還是發現導致應該跳過的代碼的錯誤,編譯器都不能提供易於閱讀的信息。
利用編譯器將源代碼的每行轉換爲機器指令序列,編譯器可以輕鬆地告訴您它沒有包含與特定行對應的任何內容。當然,它不能告訴你一行代碼是否被轉換爲機器指令,但這些機器指令事實上不會被執行 - 代碼可訪問性是undecidable - 但我不認爲這就是你想要的。
問題是現代優化編譯器比這個複雜得多。一段代碼通常會在不同的假設下進行復制和編譯(專業化,部分評估,循環展開......)。或者,相反,代碼片段可以合併在一起(函數內聯,...)。源代碼和機器代碼之間沒有簡單的對應關係。 (這就是爲什麼調試器有時無法報告二進制指令的確切源代碼位置的原因。)
如果一大塊代碼被優化掉,那可能僅僅是因爲它是許多專用副本之一,並且特定的專業化從不發生(例如,有x==0
和x!=0
的單獨代碼,並且y==0
和y!=0
和x
和y
的單獨代碼從不爲0,因此x==0 && y==0
分支最終被丟棄)。它可能是由編譯時條件指令(例如編譯器優化的C宏)生成的;這經常發生在C代碼中,如果編譯器報告了所有這些實例,那將會產生大量誤報。
獲取有用的可能未使用的代碼或可能指示錯誤的程序代碼的報告需要靜態分析的類型與編譯器所做的不同。有些工具可以做到這一點,但它們通常不是將源代碼轉換爲優化機器代碼的相同工具。製作靜態分析工具既能發現潛在的問題,又能發現有用的東西,並且不會產生如此多的誤報以致於幾乎不可用,這並不容易。
- 1. 如何知道哪個已被竊聽?
- 2. 如何知道哪些條目已被點擊?
- 3. 如何知道哪些文件已被反病毒
- 4. 如何知道哪些元素已經被檢查
- 5. 如何知道數組中的哪些數據已被更改?
- 6. 如何知道哪些優化在gcc中打開?
- 7. 如何知道Try塊中哪些代碼行生成錯誤
- 8. 處理器如何優化代碼有哪些技巧?
- 9. django知道哪些字段已更新?
- 10. 我想知道,哪些列已被真正改變
- 11. Twitter是否知道哪些郵件已被下載以及如何?
- 12. 哪些更優化?
- 13. 如何知道哪些字段已更新
- 14. 如何知道哪些的privilages用戶已基於AccessRightMask值PrincipalObjectAccess
- 15. 如何知道已從JTextPane中刪除了哪些文本
- 16. 如何知道tableview中的哪個單元格已被選中
- 17. 如何讓servlet知道哪個鏈接已被訪問
- 18. 如何知道哪個標註已被點擊?
- 19. Android,如何知道ViewPager的哪個頁面已被點擊?
- 20. 哪些對象已被jQuery取代
- 21. 你知道哪些編碼樹?
- 22. EF 4.1代碼優先 - 確定哪些屬性已更改
- 23. 如何知道字符串中的哪些字符被分配?
- 24. 如何知道.jar文件中的哪些類被引用?
- 25. 如何知道哪些方法被稱爲從基類
- 26. 我如何知道哪些元素通過jquery被拖入?
- 27. 我如何知道哪些內容視圖被觸動?
- 28. CKEDITOR 3.0 - 如何知道哪些工具欄按鈕被點擊
- 29. 如何知道集合已被編輯?
- 30. 我如何知道ILMerge已被使用
爲什麼這會很高興知道?這是優化器的* job *,用於優化大塊代碼。它消除了複雜的抽象,輔助方法和人類編寫的各種事物,使代碼更易於閱讀和推理。爲什麼你覺得你需要再次猜測優化器?你有真正的問題嗎? –
@Cody Gray它可以暴露我正在編譯的代碼中的錯誤(甚至在編譯器中),它會滿足我的好奇心:) – user2373145