2010-02-18 62 views
13

有沒有什麼辦法可以在使用g++編譯的C++中進行數組邊界檢查?使用g ++編譯的C++中的運行時數組邊界檢查

理想情況下,不應以任何方式修改源代碼。使用std::vectorstd::tr1::arrayboost::array不是一種選擇,因爲代碼庫很大,而且這種轉換是不可行的。

回答

6

有一個名爲SGCheck(以前稱爲Ptrcheck)的Valgrind工具,它檢查堆棧數組邊界溢出。

valgrind --tool=exp-sgcheck <program> <arguments> 

該工具仍標記爲實驗性,並附帶有幾個limitations。其中之一是:

平臺:堆棧/全局檢查將無法正確工作的PowerPC,ARM 或S390X平臺上,只能在x86和AMD64目標。這是因爲 堆棧和全局檢查需要跟蹤函數調用並可靠地退出 ,並且在使用鏈接 寄存器函數返回的ABI上沒有明顯的方法。

1

GCC mudflap-fmudflap)可以做的邊界檢查爲C,但不能處理所有的C++代碼爲2012年中期(例如std::vector)的。它在2015年年中在GCC 4.9中被取消,由Address Sanitizer取代。擋泥板選項仍然存在,但什麼都不做。

還有就是MIRO補丁 - 中號 udflap 我mproved與- [R eferent ö bjects。有關更多信息,請參閱其homepage。此外,還有a paper about it

我已經試過MIRO了。它看起來非常好,但可能無法100%的C++代碼。我打算在開發過程中使用MIRO,然後將其關閉(並使用常規編譯器)進行發佈。如果你正在編寫你自己的代碼,使它與MIRO一起工作應該相當容易。

4

Google的AddressSanitizer是一個編譯器檢測模塊和運行時庫,它可以檢查對堆,堆棧和全局變量的超出界限的訪問等。它可用in Clang 3.1+in GCC 4.8+

要使用它,通過-fsanitize=address(或-faddress-sanitizer舊鐺3.1)的參數編譯器和鏈接器中(鏈接asan;無需顯式-lasan)。要在錯誤消息中獲得更好的堆棧跟蹤,請將-fno-omit-frame-pointer傳遞給編譯器。

它最初用於鉻測試,since 2012,它也是used by Firefox devs。有一個很好的blog post on how to get it running with Qt。您可能還需要閱讀更多內容on Wikipedia