[英]Why does strcat_s crash if writing over the bound of a char array?
我知道,有關該主題的帖子已經很多,但是我沒有發現任何令人滿意的東西。 甚至谷歌也不是我的朋友。
所以,首先我的代碼:
void secureCat() {
const int BUFFERSIZE = 5;
char buffer[BUFFERSIZE];
strcpy_s (buffer, BUFFERSIZE, "01");
cout << "1, buffer=" << buffer << endl;
errno_t rc = 0;
// still works
rc = strcat_s(buffer, BUFFERSIZE, "2");
cout << (rc == 0 ? "yippee" : "oh noooo") << endl;
cout << "2, buffer=" << buffer << endl;
// and now the crashing line
rc = strcat_s(buffer, BUFFERSIZE, "345");
cout << (rc == 0 ? "yippee" : "oh noooo") << endl;
cout << "3, buffer=" << buffer << endl;
}
我在裝有MS VS 2010的Windows上使用了此代碼,並遇到了以下問題:
strcat_s的第一個調用工作正常,這對我來說很清楚,因為新字符串的大小( "01"
+ "2"
+ NUL
字符)小於緩沖區大小。
但是,當超出緩沖區大小時,為什么第二個調用會崩潰? 據我了解MSDN,我應該得到一個錯誤代碼,並且緩沖區應該只包含NUL字符。 該示例中的行為更類似於strcat的行為:我覆蓋了自己的代碼,因此崩潰了。
BTW:我知道,那還有其他的方法來連接字符串,它是一個更好的風格在它之前做檢查。 因此,純粹出於對幕后關注的興趣。
謝謝羅伯特
[...]如果目標字符串太小,則會調用無效的參數處理程序,如Parameter Validation中所述 。
如果您遵循Parameter Validation鏈接 ,則可以閱讀(強調我的意思):
無效的參數處理程序例程
[...] 默認無效參數調用Watson崩潰報告,這將導致應用程序崩潰,並詢問用戶是否要將崩潰轉儲加載到Microsoft進行分析。 在調試模式下,無效的參數還會導致斷言失敗。
可以通過使用函數
_set_invalid_parameter_handler
將無效的參數處理程序設置為您自己的函數來更改此行為。 [...]
或者,您可能需要考慮StringCchCat()
函數 ,如果目標緩沖區太小,該函數將返回等於STRSAFE_E_INSUFFICIENT_BUFFER
的HRESULT
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.