Address-Sanitizer(ASAN): 一個 C/C++ 記憶體偵錯的工具

LLVM 有一系列以 Sanitizer 結尾的偵錯工具(ASAN/TSAN/MSAN/DFSAN/LSAN)[1],每個工具各司其職,在此我們介紹其中的 ASAN[2]

Memory Corruption 一直是個非常難除錯非常讓人苦惱的問題, ASAN 正是一個幫助大家處理這樣問題的工具, ASAN 內建於 LLVM 3.1 和 gcc 4.8[3],其可偵測出以下的問題:

  • Use after free (dangling pointer dereference)
  • Heap buffer overflow
  • Stack buffer overflow
  • Global buffer overflow
  • Use after return

對 ASAN 演算法有興趣的夥伴可以參考官網頁面說明

使用方式 (Using ASAN)

1.    編譯時要加上使用 ASAN 的 flag (-fsanitize=address)
2.    執行檔中就直接插入了記憶體偵錯的程式碼
3.    直接跑執行檔,如果有偵測到錯誤會在輸出訊息中看到結果

以下是一個使用 ASAN 的範例

[其它的 flag ]
-O1 : 是為了得到較佳的效能
-fno-omit-frame-pointer: 是為了在錯誤訊息中能得到正確的 stack trace

從結果我們可以看出 ASAN 有偵測到 heap-use-after-free 的錯誤,接著提供了 pc/bp/sp 這幾個有用暫存器的值,再來是發生錯誤的 call stack 以及何處去 allocate 何處已經被 free 的 call stack,最後有一個這次偵測錯誤的總結。

ASAN on Android[4]

Android 在 Jelly Bean 支援了 Address-sanitizer。

開啟方式非常簡單,只要在 Android.mk 裡加上

執行包含新編譯的執行檔前,需要把 asanwrapper 以及 libasan_preload.so 分別放到 system/bin/ 以及 system/lib/,最後是要將執行產生的錯誤訊息利用一個 python 進行解析。

ASAN on firefox [5]

下載(Download Executable file with ASAN)
我們可以直接從下面連結取得有 ASAN 功能的 firefox:
1. mozilla-central optimized builds (recommended for testing)
2. mozilla-central debug builds (recommended for debugging if the optimized builds don’t do the job)

自行編譯(Build by myself)
必須要先建立包含下面內容的 .mozconfig,再進行編譯,我們就可以編譯出帶有 ASAN 的執行檔。

結語

以上就是對於 ASAN 簡單的介紹, ASAN 跟所有偵錯的工具一樣都要付出一些代價(更大的記憶體使用量、較差的效能),然而確實可以利用它找出一些用人眼或人腦會忽略的程式錯誤甚至是一些潛在的問題,因此需要善用這樣的工具讓我們的生活更好臭蟲更少(笑)。

參考資料

[1] http://clang.llvm.org/docs/
[2] https://code.google.com/p/address-sanitizer/wiki/AddressSanitizer
[3] http://gcc.gnu.org/gcc-4.8/changes.html
[4] https://code.google.com/p/address-sanitizer/wiki/Android
[5] https://developer.mozilla.org/en-US/docs/Building_Firefox_with_Address_Sanitizer

您可能也會喜歡

目前找不到相關文章

共 2 則讀者回應

  1. 參照: ASAN | 不分享空間

對此文章發表回應

你的電子郵件位址並不會被公開。 必要欄位標記為 *