官宣:MSVC的Address Sanitizer正式釋出

官宣一則

特別感謝Aaron Gorenstein對本文內容的貢獻。特別感謝Kevin Cadieux和Jim Radigan的貢獻。

我們非常高興地宣佈:C++ Address Sanitizer(ASan)在Visual Studio 2019 v16。9中正式可用。感謝那些在早期的測試版本中參加體驗的開發者,是你們的反饋和建議幫助我們不斷地去改善此項功能。

Address Sanitizer

Address Sanitizer(ASan)是一款用來查詢和修復有關記憶體相關的Bug的強大技術,下面我們快速地來看下功能演示:

最初,它是為了LLVM/Clang編譯器設計和開發的。從VS2019 v16。1開始,我們將這項技術遷移到了Linux目標平臺,然後就是在v16。4中我們添加了對MSVC編譯器的支援。現在,在最新的v16。9中,我們修復了多達50多個使用者報告的Bug,並且進一步地提升了使用體驗。

我們認為,現在應該可以將此項技術用在正式的生產環境了。上一次我們的博文中,有提到v16。7中16。7版本中Windows平臺上的使用體驗,那個時候,我們官宣了它對x64和除錯版本的支援。

從那個時候開始,我們透過自動連結執行時庫(透過使用)來簡化了編譯模型以匹配LLVM編譯器。現在,大多數使用者只需要新增一個單一的標誌就可以獲得ASan了,而不需要指定額外的編譯及連結開關。我們還透過清理執行時生成的異常和修復程式碼行號的匹配問題,進一步地打磨了除錯體驗。

ASan可以幫助開發者發現記憶體有關的問題,這些問題的發現和解決,對於產品的質量來說十分重要。從經典的”記憶體釋放後繼續使用”到一些比較複雜少見的”區域性變數銷燬後繼續使用”,ASan都可以幫助你規避這類問題。如果需要了解更多資訊,請參考ASan的技術文件。

價值

我們非常感謝LLVM/Clang充分確立了ASan的核心技術和優勢。將這些好處帶給MSVC客戶,這真是令人興奮,並看到它如何可以幫助發現和調查許多錯誤。下面是一些例子:

> 為了驗證ASan功能,我們在啟用ASan選項的情況下運行了測試套件。該測試套件包括Electron,Qt Creator,Eigen,FLAC,postgresql,OpenSSL和大約30個其他專案。

> 我們使用ASan構建了MSVC編譯器本身,並運行了一些關鍵測試。這有助於我們識別C++工具鏈中的錯誤。此外,當我們分析開發社群報告的MSVC錯誤時,這還節省了我們識別問題的時間。

> Windows團隊正在使用ASan和OneFuzz對其程式碼庫進行模糊處理,他們的團隊在識別和修復Windows的ASan中的問題方面發揮了重要作用。

> 我們正在Microsoft內部(包括Windows和Office組織)擴大使用ASan。

我們將在以後的一些部落格文章中對上述主題進行更多介紹。我們還一直致力於對共享的OSS儲存庫上游的MSVC和Clang之間共享的ASan元件所做的更改。我們最新的PR已提交稽核,增加了對透過低階Windows API進行的跟蹤分配的支援。我們希望在將來的修復和增強中會有更多。我們的北極星將始終致力於和使用相同的OSS ASan元件。

此外,在16。9版中,我們具有與ASan的完整Visual Studio IDE整合。現在,你可以在Windows上一流的Visual Studio除錯經驗中獲得ASan技術的核心價值。

在開頭的圖片中,你將看到Visual Studio如何正確指向ASan檢測到的錯誤,並附有說明性彈出視窗,呼叫堆疊以及所有其他除錯資訊。我們已經記錄了偵錯程式整合的更多詳細資訊,並且高階使用者仍然可以在“輸出”視窗中找到基於文字的ASan報告。

除了本地開發生命週期之外,我們還添加了儲存ASan故障轉儲的功能,從而啟用了全新的雲和分散式測試方案,更多資訊請參考ASan文件。

總結

感謝老大哥技術的不斷更新換代,以前查詢記憶體錯誤十分辛苦,有了這玩意兒,應該會舒坦一些吧?

神州行,我看行。

最後

Microsoft Visual C++團隊的部落格是我非常喜歡的部落格之一,裡面有很多關於Visual C++的知識和最新的開發進展。大浪淘沙,如果你對Visual C++這門古老的技術還是那麼感興趣,則可以經常去他們那(或者我這)逛逛。

本文來自:《Address Sanitizer for MSVC Now Generally Available》

相關文章