strcpy_s,sprintf_s,wcscpy_s,swprintf_s,wcscat_s,加了_s就真的安全吗?


现在微软对以前的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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值