2010-08-05 36 views
0

在WinCE的5.0 C++應用追捕堆棧溢出崩潰,將範圍縮小到一個任何人在WinCE上sscanf()堆棧使用有問題?

_stscanf(ASTRING,_T( 「%* S%02D \ n」 個),& aNumber的);

在模式對話框的長鏈末尾調用,值爲_T(「LEVEL 01」)。

分析我們的異常處理堆棧幀記錄和比較來自上一個存儲的棧幀的棧指針。在拋出異常點的SP似乎顯示了_stscanf()的堆棧使用量的瘋狂數量......

...足夠瘋狂,我覺得我需要驗證它。經過幾天的黑客攻擊後,我想出了一個測試例程,爲_stscanf()執行高水位類型堆棧使用測量。

我們爲兩個不同的CE目標交叉編譯:瑞薩/日立SH4上的CE 4.2和飛思卡爾iMX32(ARM1136內核)上的CE 5.0,以及桌面Windows模擬器。

堆棧使用的_stscanf()調用(約):

桌面60
CE 4.2 SH4 9252
ARM的9280

CE 5.0這是正確的,在CE堆棧9K? !! ??

其他任何人都遇到過這樣的事情嗎?

回答

0

發現罪魁禍首。

雖然我沒有成功檢查我的CE 4.2平臺生成器安裝中的swscanf()源,但CE 5.0 PB確實具有CRT的完整源代碼。

C:\ WINCE500 \ PRIVATE \ WINCEOS \ COREOS \ CORE \ CORELIBC \ CRTW32 \ STDIO \ input.c的第235行,這是一個爲UNICODE系統編譯時聲明爲堆棧變量的8K緩衝區。非Unicode等價物通過一個32字節的緩衝區。