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

posted on   norsd  阅读(199)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏

导航

< 2008年7月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9
点击右上角即可分享
微信分享提示