在WinCE 5.0 C ++应用程序中查找堆栈溢出崩溃,将其缩小到
_stscanf(astring,_T(“%* s%02d \ n”),& aNumber);
在一长串模态对话框结束时调用,值为_T(“LEVEL 01”)。
分析我们的异常处理堆栈帧记录并比较堆栈指针与存储的最后一个堆栈帧。抛出异常点的SP似乎显示了_stscanf()的疯狂数量的堆栈使用....
......我觉得我需要验证它,这太疯狂了。经过几天的黑客攻击后,我想出了一个测试例程,它为_stscanf()执行高水印类型堆栈使用测量。
我们交叉编译两个不同的CE目标:Renesas / Hitachi SH4上的CE 4.2和Freescale iMX32(ARM1136内核)上的CE 5.0,以及桌面Windows模拟器。
_stscanf()调用的堆栈用法(约):
桌面60
SH4 9252上的CE 4.2
ARM 9280上的CE 5.0
那是对的,CE上的9K堆栈?!!! ??
其他人都遇到过这样的事情吗?
答案 0 :(得分:0)
找到了罪魁祸首。
虽然我在CE 4.2 Platform Builder安装中检查了swscanf()源代码失败,但CE 5.0 PB确实拥有CRT的完整源代码。
C:\ WINCE500 \ PRIVATE \ WINCEOS \ COREOS \ CORE \ CORELIBC \ CRTW32 \ STDIO \ input.c的第235行,在为UNICODE系统编译时声明为堆栈变量的8K缓冲区。非unicode等价物使用32字节缓冲区。