快乐小胖兔的一窟

用自己的方式过一生 --- zyq654321

VC知识库BLOG 首页 新随笔 联系 聚合 登录
  23 Posts :: 0 Stories :: 95 Comments :: 2 Trackbacks

公告

Welcome you

留言簿(7)

随笔分类

随笔档案

文章档案

相册

网站联接

BLOG友情链接

搜索

最新评论

阅读排行榜

评论排行榜

2006年5月16日 #

       很多程序员在用了VC2005后都发现,微软对字符串的安全操作做了不少努力,比如使用了新的安全的字符串操作函数,对字符串的超界问题做出检测。在这里并不对这种机制做出评价(这要广大程序员自己体会),也不是详细得说如何使用安全函数的问题。在这里,以实际使用中碰到的一个小BUG为例,让大家养成一个好的习惯---看文档。

       VC2005中的一段程序

       TCHAR strFrom[MAX_PATH];

    ZeryMemory(strFrom, sizeof(strFrom));

_tcscpy_s(strFrom,MAX_PATH, _T("D:\\TEST\\"));

    SHFILEOPSTRUCT fileStruct;

fileStruct.wFunc = FO_DELETE;

    fileStruct.pFrom = strFrom;

   

    SHFileOperation(&fileStruct);

    这是一个调用SHELL的文件操作对TEST目录进行删除的操作,看上去应该是工作正常的。实际上,如果是release版本,也不会有什么问题。然而,一般程序员写完后,先编译的都是Debug版,这样问题就来了,这段程序怎么运行都不正常,如果是初学者或是不爱看文档的人估计就要花时间去查了。

    开始我也觉得奇怪,写法应该是没错了。于是去看SHFILEOPSTRUCT结构的说明,有一点引起我的注意:An additional NULL character must be appended to the end of the final name to indicate the end of pFrom。意思是说缓冲区中应该有附加的NULL,但上面的程序应该不会是这个问题啊,因为ZeryMemory已经为缓冲区全部置0了。实际上,这是_tcscpy_s的问题。(又是文档)_tcscpy_s会在Debug版本中在缓冲区中填上0xFD。呵呵,这样就查出为什么会出问题的了。

      题外话,即然说到0xFD被填进了缓冲区,就多说一些。大家都知道编译选项/GZ(非优化编译版本才可使用)被使用后,变量和内存区在初始化时会被填入一些值,比如用0xCC初始化自动变量,用0xFD初始化被保护的内存,其作用中便于进行错误的查找。

注:在VC2005中,/GZ选项已经不再使用(确切说是不建议使用),取而代之的是/RTC(运行期错误检查)。
发表于 2006-05-16 18:06 快乐小胖兔的一窟 阅读(2767) | 评论 (1)编辑 收藏