[英]Static Analysis to detect Buffer Overrun on Visual Studio C++ 2012
[英]How to debug a buffer overrun in Visual C++ 9?
我有一個用Visual C ++ 9編寫的巨大的MMC管理單元。每當我在MMC中遇到F5時,mmc.exe崩潰了。 如果我附加調試器,我會看到以下消息:
mmc.exe中發生緩沖區溢出,破壞了程序的內部狀態。 按Break可調試程序或繼續終止程序。
有關更多詳細信息,請參閱幫助主題“如何調試緩沖區溢出問題”。
首先,沒有如何在任何地方調試緩沖區溢出問題主題。
當我檢查調用堆棧時,我發現可能有一些安全cookie用於防止堆棧分配的緩沖區溢出:
MySnapin.dll!__crt_debugger_hook() Unknown
MySnapin.dll!__report_gsfailure() Line 315 + 0x7 bytes C
mssvcr90d.dll!ValidateLocalCookies(void (unsigned int)* CookieCheckFunction=0x1014e2e3, _EH4_SCOPETABLE * ScopeTable=0x10493e48, char * FramePointer=0x0007ebf8) + 0x57 bytes C
msvcr90d.dll!_except_handler4_common(unsigned int * CookiePointer=0x104bdcc8, void (unsigned int)* CookieCheckFunction=0x1014e2e3, _EXCEPTION_RECORD * ExceptionRecord=0x0007e764, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame=0x0007ebe8, _CONTEXT * ContextRecord=0x0007e780, void * DispatcherContext=0x0007e738) + 0x44 bytes C
MySnapin.dll!_except_handler4(_EXCEPTION_RECORD * ExceptionRecord=0x0007e764, _EXCEPTION_REGISTRATION_RECORD * EstablisherFrame=0x0007ebe8, _CONTEXT * ContextRecord=0x0007e780, void * DispatcherContext=0x0007e738) + 0x24 bytes C
ntdll.dll!7c9032a8()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
ntdll.dll!7c90327a()
ntdll.dll!7c92aa0f()
ntdll.dll!7c90e48a()
MySnapin.dll!IComponentImpl<CMySnapin>::GetDisplayInfo(_RESULTDATAITEM * pResultDataItem=0x0007edb0) Line 777 + 0x14 bytes C++
// more Win32 libraries functions follow
我有很多代碼,不知道緩沖區溢出可能發生在哪里以及原因。 我找到了這個論壇的討論 ,特別是建議用更安全的版本,如wcscpy_s()替換所有類似wcscpy的函數。 我遵循了建議,並沒有讓我更接近問題的解決方案。
如何調試我的代碼並查找Visual Studio 2008發生緩沖區溢出的原因和位置?
添加/ RTC切換到編譯器。 這樣可以在運行時檢測緩沖區溢出和欠載。 當檢測到溢出時,程序將完全打破它發生的位置,而不是給你死后的消息。
如果這沒有幫助,那么調查你提到的wcscpy_s()調用。 驗證“元素數量”是否具有正確的值。 我最近修復了緩沖區溢出導致wcscpy_s()的錯誤使用。 這是一個例子:
const int offset = 10;
wchar_t buff[MAXSIZE];
wcscpy_s(buff + offset, MAXSIZE, buff2);
請注意,buff + offset具有MAXSIZE - 偏移元素,而不是MAXSIZE。
我剛剛解決了這個問題,我能夠解決它。 我首先在網上搜索沒有用,但我得到了這個帖子。
無論如何,我正在運行VS2005,我有一個多線程程序。 我不得不'猜測'哪個線程導致了問題,但幸運的是我只有一些。
所以,我所做的就是在那個線程中,我通過調試器,在高級函數中逐步執行代碼。 我注意到它總是發生在函數的同一個地方,所以現在是鑽井的問題。
我要做的另一件事是逐步打開callstack窗口,確保堆棧看起來沒問題,只是注意到堆棧何時出現問題。
我終於縮小到導致這個bug的行,但實際上並不是那條線。 這是它之前的界限。
那么我的原因是什么? 好吧,簡而言之,我試圖將一個NULL指針memcpy到一個有效的內存區域。
我很驚訝VS2005無法處理這個問題。
無論如何,希望有所幫助。 祝好運。
我假設你無法可靠地重現這一點。
我過去成功地使用了Rational Purify來解決各種內存問題,但它花費了多少錢而且我不確定它會如何與MMC交互。
除非有某種內置內存調試器,否則您可能必須嘗試以編程方式解決此問題。 您是否能夠刪除/禁用功能塊以查看問題是否自行顯現?
如果您“猜測”問題發生的位置,您也可以嘗試禁用/更改該代碼。 即使您將復制功能更改為_s
版本,您仍然需要能夠可靠地處理截斷的數據。
當我想在這樣的指針變量中遞增一個值時,我得到了這個溢出:
*out_BMask++;
代替
(*out_BMask)++;
其中out_BMask被聲明為int *out_BMask
如果你做了像我這樣的事情,那么我希望這會對你有幫助;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.