- 配置/解除配置不相符,以及 new/delete 類型不相符
- 對堆積而言過大的配置
- calloc 溢位與 alloca 溢位
- 重複釋放與釋放後使用
- 全域變數溢位
- 堆積緩衝區溢位
- 對齊值的對齊無效
- memcpy 與 strncat 參數重疊
- 堆疊緩衝區溢位與下溢
- 傳回後使用堆疊與超出範圍後使用堆疊
- 記憶體在被標記為汙染後仍被使用
在編譯器中啟用 ASan
Address Sanitizer 已與 Visual Studio 專案系統、CMake 建置系統以及 IDE 整合。專案可以使用一個額外的編譯器選項/fsanitize=address,或在 Visual Studio 中設定專案屬性來啟用 AddressSanitizer:

此選項與 x64 的所有最佳化層級與組態相容。不過,它與
edit-and-continue、incremental linking 以及 /RTC 不相容,使用 ASan 編譯之前必須停用這些選項。$(VC_LibraryPath_VC_x64) 值是清單中的最後一個,以避免將其用於其他程式庫,如下所示:

ASan 執行階段需求
當遊戲在啟用 ASan 的情況下建置時,執行階段需要另外一個 DLL 才能啟用此功能。根據預設,在編譯器中啟用 ASan 時,它會將 DLL 複製到專案的輸出目錄,然後應將其部署至主機上可執行檔旁。 如有需要,可以在 Visual Studio 的$(VC_ExecutablePath_x64) 目錄中手動找到這些 DLL。視組建版本而定,XBOX 需要下列兩者之一:
執行階段偵錯工具支援
在附加偵錯工具的情況下執行已啟用 ASan 的遊戲時,如果發現錯誤,它會中斷進入偵錯工具並顯示詳細報告,讓您判斷錯誤發生的位置。 但是,如果您在未附加偵錯工具的情況下執行 (例如在自動化測試架構中),錯誤資訊會顯示在標準輸出中,而遊戲會終止。這很有幫助,但您可能需要更多狀態資訊才能找出當機的根本原因,這時就需要當機傾印支援。如果您在未附加偵錯工具的情況下執行,並且需要在當時解析符號,則需要將
llvm-symbolizer.exe 檔案與遊戲 EXE 一起部署。此檔案位於與上列 ASan 執行階段 DLL 相同的位置。執行階段當機傾印支援
從 Visual Studio 16.9.8 或 16.10.2 開始,ASan 可以設定為儲存包含與錯誤相關聯之中繼資料的當機傾印檔案。Visual Studio 中的偵錯工具可以剖析傾印檔案中儲存的中繼資料,以提供更多有關當機的內容。您可以針對每個組建設定此當機傾印儲存、儲存這些二進位成品,然後在 IDE 中以適當的原始碼索引進行檢視。 當機傾印文件位於此處: 設定當機傾印 (Microsoft Docs) 但上述連結的方法需要設定環境變數,而 XBOX 不支援此做法,因此實作了替代方法。若要將當機傾印支援新增至您的 XBOX 遊戲,只需定義一個函式回呼,將必要的當機傾印檔案名稱資訊提供給 ASan 即可,以下顯示三個範例。檔案名稱通常具有 .dmp 後置字元,以遵循 Visual Studio IDE 慣例
與先前的函式一樣,此覆寫在 XBOX 上為選用,但如果您想在未附加偵錯工具的情況下使用當機傾印收集 ASan 資訊,強烈建議使用。如果您提供傾印檔案名稱,但未提供傾印類型覆寫,則無法在 XBOX 上產生有效的當機傾印。
ASan 程式碼範例
此程式碼示範如何輕鬆地將這些函式新增至現有的程式碼基底,並視需要進行調整:已知問題
- Visual Studio 2019 (16.11) ASan 與 Game OS 不相容。
- 在 17.12 與 17.13 的初始版本中,ASan DLL 與 Game OS 不相容,且將無法載入。此問題已在 17.12.6 與 17.13.3 中修正。
- Game OS 的 ASan 支援出現迴歸,導致 Visual Studio 2022 在啟動時當機,此問題已在 Visual Studio 2022 17.14.29 與 Visual Studio 2026 18.4.1 中修正。
- 在 XBOX 上於偵錯工具下執行時,會定期發出下列例外狀況訊息,但可以放心忽略。
