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