安全字符函数与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静静的躺在那里!
至此,问题解决. 虽然是一个非常小的问题,却困惑了我一天.
安全函数,要认真的写啊!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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的强缓存和协商缓存
· 一文读懂知识蒸馏