strcpy_s,sprintf_s,wcscpy_s,swprintf_s,wcscat_s,加了_s就真的安全吗?
来源:互联网 发布:python怎么取最大 编辑:程序博客网 时间:2024/05/01 15:06
现在微软对以前的string类操作函数加了_s处理,号称string类操作函数的安全版,果真如此吗?前些时候使用strcpy_s的时候就出了问题。
大致代码如下:
char szAName[MAX_PATH] = {0};char* lpszBName= "d:";strcpy_s(szAName, MAX_PATH, lpszBName);int i = strlen(szAName);if(szAName[i-1] != '\\'){szAName[i] = '\\';}
strcpy_s
参数
strDestination
目标字符串缓冲区的位置。
numberOfElements
目标字符串缓冲区的大小(以字符而不是字节计算)。
strSource
以 null 结尾的源字符串缓冲区。
按道理来说szAName字符串应该是 "d:\",但结果却是 “d:\??????????????”后面是一大串乱码。
跟踪代码发现原来是strcpy_s在拷贝完成后用memset把余下的未使用部分全部初始化了,但是初始化的数字却不是0。
因为之前我们已经用0初始化过了szAName字符串,我们会认为我们未使用的部分会一直保持0,因为我们经常使用的cpy函数都是到'\0'结束的,但是_s函数却偷偷的重新初始化了我们未使用的余下部分导致出现错误,所以我们在使用这类函数的时候一定要注意,特别是要改变字符串末尾的‘\0’位置时,一定要在更改后在字符串的最后加上'\0',或者用strlen(lpszBName) + 1 来取代MAX_PATH,虽然这样会让_s变的没有意义,但也比出错强,而且一旦出错,很难被发现,因为这是不固定的错误,总而言之,不要被官方的说明文档忽悠了
(环境说明:VS2008)
0 0
- strcpy_s,sprintf_s,wcscpy_s,swprintf_s,wcscat_s,加了_s就真的安全吗?
- strcpy_s&wcscpy_s
- wcscpy wcscpy_s strcpy strcpy_s的区别
- wcscpy wcscpy_s strcpy strcpy_s的区别
- sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l
- sprintf_s 与sprintf的不同只是缓冲区的大小进行了安全处理吗?
- 此生真的就这样了吗?
- strcpy_s, wcscpy_s, _mbscpy_s 用注意overlap
- 代码的语义正确真的就够了吗?
- maxlength就安全了吗?
- Windows Vista真的只是加了新界面吗?
- Windows Vista真的只是加了新界面吗?
- Windows Vista真的只是加了新界面吗?
- Windows Vista真的只是加了新界面吗?
- Windows Vista真的只是加了新界面吗?
- Windows Vista真的只是加了新界面吗?
- Windows Vista真的只是加了新界面吗?
- Windows Vista真的只是加了新界面吗?
- linux系统的简述和优势,趋势所在!!
- BZOJ1880: [Sdoi2009]Elaxia的路线
- ROS里面的几个python写的工具
- 你中招了吗?加密勒索软件攻击趋势分析
- BZOJ1133: [POI2009]Kon
- strcpy_s,sprintf_s,wcscpy_s,swprintf_s,wcscat_s,加了_s就真的安全吗?
- 计算机--机器学习---机器learning技法sum
- libevent学习之跨平台Reactor接口的实现
- centos安装php模块之后还是提示not found解决方法
- 迈出从3K到1W的重要一步——掌握设计模式
- Java Web 学习笔记(四) 基于 SpringMVC+BootStrap 创建WebApp
- 【技术创业】Excuse me,这家伙的梦想竟然是拯救中国足球
- Linux环境下svn回滚单个文件的shell函数
- Android Studio修改项目目录结构