天天看點

strcpy_s,sprintf_s,wcscpy_s,swprintf_s,wcscat_s,加了_s就真的安全嗎? strcpy_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)

繼續閱讀