现在的位置: 首页 > 综合 > 正文

安全字符函数与fd迷案

2012年03月22日 ⁄ 综合 ⁄ 共 760字 ⁄ 字号 评论关闭

首先说明问题:

程序: 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静静的躺在那里!
至此,问题解决. 虽然是一个非常小的问题,却困惑了我一天.
安全函数,要认真的写啊!

抱歉!评论已关闭.