strcpy、wcscpy與_tcscpy關係 strcpy_s與strcpy比較
阿新 • • 發佈:2019-01-26
C++標準庫函式提供了字元和字串的操作函式,並提供了其UNICODE版本,如:
char *strcpy(char *strDestination, const char *strSource);
wchar_t *wcscpy(wchar_t *strDestination, const wchar_t *strSource);
wcscpy()即為strcpy()的寬字元版本,與_T類似的,Visual C++提供了類似的同名函式:
#ifdef UNICODE
#define _tcscpy wcscpy
#else
#define _tcscpy strcpy
#endif
_tcscpy
在編譯時會根據條件被替換,
如果是 非UNICODE 工程,它就被替換為 strcpy
UNICODE 工程被替換為 wcscpy
下是使用strcpy_s與strcpy的安全性比較
char szBuf[2] = {0};
strcpy_s(szBuf, 2, "12131"); //新的CRT函式
strcpy(szBuf, "12131"); //老的CRT函式
上述程式碼,明顯有緩衝區溢位的問題。 使用strcpy_s函式則會丟擲一個異常。而使用strcpy函式的結果則未定,因為它錯誤地改變了程式中其他部分的記憶體的資料,可能不會丟擲異常但導致程式資料錯誤,也可能由於非法記憶體訪問丟擲異常。
使用新的增強安全的CRT函式有什麼好處呢?簡單地說,新的函式加強了對引數合法性的檢查以及緩衝區邊界的檢查,如果發現錯誤,會返回errno或丟擲異常。老版本的這些CRT函式則沒有那麼嚴格的檢查與校驗,如果錯誤地傳輸了引數或者緩衝區溢位,那麼錯誤並不能被立刻發現,對於定位程式錯誤也帶來更大困難。
char *strcpy(char *strDestination, const char *strSource);
wchar_t *wcscpy(wchar_t *strDestination, const wchar_t *strSource);
wcscpy()即為strcpy()的寬字元版本,與_T類似的,Visual C++提供了類似的同名函式:
#ifdef UNICODE
#define _tcscpy wcscpy
#else
#define _tcscpy strcpy
#endif
_tcscpy
在編譯時會根據條件被替換,
如果是 非UNICODE 工程,它就被替換為 strcpy
UNICODE 工程被替換為 wcscpy
下是使用strcpy_s與strcpy的安全性比較
char szBuf[2] = {0};
strcpy_s(szBuf, 2, "12131"); //新的CRT函式
strcpy(szBuf, "12131"); //老的CRT函式
上述程式碼,明顯有緩衝區溢位的問題。 使用strcpy_s函式則會丟擲一個異常。而使用strcpy函式的結果則未定,因為它錯誤地改變了程式中其他部分的記憶體的資料,可能不會丟擲異常但導致程式資料錯誤,也可能由於非法記憶體訪問丟擲異常。
使用新的增強安全的CRT函式有什麼好處呢?簡單地說,新的函式加強了對引數合法性的檢查以及緩衝區邊界的檢查,如果發現錯誤,會返回errno或丟擲異常。老版本的這些CRT函式則沒有那麼嚴格的檢查與校驗,如果錯誤地傳輸了引數或者緩衝區溢位,那麼錯誤並不能被立刻發現,對於定位程式錯誤也帶來更大困難。