安全字符函数与fd迷案
首先说明问题:
程序: TransparentGIF
情况:程序界面可以正常显示,但是打开文件对话框,选择文件后, 就会死亡. 系统对点告知在:
LRESULT CALLBACK CallCuteFrameOnFrameProc( CuteFrame* pCF, HWND& hwnd, UINT& uMsg, WPARAM& wParam, LPARAM& lParam ) { return pCF->OnFrameProc( hwnd,uMsg,wParam,lParam ); }
然后发现pCF内容一律变成 fdfdfdfd
明显被覆盖,开始检查问题, 一开始十分迷惑不解, 该对象是一个静态对象,并没有提前注销的问题. 后来在Release模式下问题就不显现(但是绝不是没有), 应该是debug的内存机制起得作用.
锁定pCF内容, 断点设置在其内容被更改( 方法: Debug--new breakpoint--data breakpoint, 设置锁定地址), 果然在打开文件对话框,按下确定以后,pCF瞬间被覆盖fd, 检查是哪一个函数修改: 发现本源在memset(memset.asm), 调用的母函数是_FUNC_NAME (tcscpy_s.inl), 继续回溯,发现是一个::wcscpy_s 安全复制宽字符函数, 为什么这个函数会把我的 pCF 对象给覆盖了?
后来发现我的一条语句这样写着:
::wcscpy_s( _wcCurGifPath, sizeof(_wcCurGifPath), ofn.lpstrFile );
其中ofn就是文件对话框的ofn, 明显的, 第二个参数被夸大了一倍, 正确的是: sizeof()/2
然后在被覆盖的pCF的内存中,向上查看,果然发现了_wcCurGifPath静静的躺在那里!
至此,问题解决. 虽然是一个非常小的问题,却困惑了我一天.
安全函数,要认真的写啊!