2016-04-08 134 views
3

如果我使用-fsanitize=leak標誌編譯C++程序,這是否可以保證在運行時沒有內存泄漏?是否泄漏消毒劑保證沒有內存泄漏?

或者哪裏有一些更強的泄漏檢查工具(valgrind除外)?

+3

引用非常受歡迎的俄羅斯書籍「只有保險政策才能給予絕對保證」。 – SergeyA

回答

2

簡短的回答:第

不保證消毒劑將檢測每一個可能的泄漏。也沒有保證編譯器會警告所有泄漏。也不保證Valgrind會發現所有泄漏。

這些工具以不同的方式盡其所能,但它們都有侷限性(和錯誤)。

例如;

編譯器只能通過分析源代碼來檢測它可以檢測到的泄漏(並且它也有合理花費的時間上限)。

清潔劑只能檢測它被寫入測試的錯誤 - 然後,它只會在您實際執行的代碼中檢測到它們。因此,如果您的應用程序的特定運行只執行50%的代碼,並且泄漏位於另一半,則不會看到它。同樣,Valgrind只能檢測它被設計用於檢測的泄漏,它不能訪問源代碼,也沒有編譯器檢測的好處,它也只能看到實際運行的代碼中的泄漏。

所以沒有。不標記任何泄漏的工具不能證明沒有泄漏。這需要形式化的證明,不僅僅是代碼的正確性,還包括它所依賴的一切(比如標準庫),這對於真實世界的程序來說並不是一個解決的問題。

最好的辦法是運行一些不同的工具並修復他們發現的問題,並仔細地刻意編寫你的代碼,並且知道你在做什麼

+1

難以檢測到的一種泄漏(也許是不可能的)是自我參照循環。 – vu1p3n0x

1

......這是否保證在運行時沒有內存泄漏?

那麼,-fsanitize可能會要求從措辭過度期望。該功能並不真消毒從內存泄漏問題的代碼,但有助於檢測它們。


由於從GCC documentation

-fsanitize=leak 
     Enable LeakSanitizer, a memory leak detector. This option only 
     matters for linking of executables and if neither 
     -fsanitize=address nor -fsanitize=thread is used. In that case 
     the executable is linked against a library that overrides 
     "malloc" and other allocator functions. See 
     <https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer > 
     for more details. The run-time behavior can be influenced using 
     the LSAN_OPTIONS environment variable.