簡體   English   中英

如果覆蓋char數組的邊界,為什么strcat_s崩潰?

[英]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:我知道,那還有其他的方法來連接字符串,它是一個更好的風格在它之前做檢查。 因此,純粹出於對幕后關注的興趣。

謝謝羅伯特

用於strcat_s()MSDN文檔如下:

[...]如果目標字符串太小,則會調用無效的參數處理程序,如Parameter Validation中所述

如果您遵循Parameter Validation鏈接 ,則可以閱讀(強調我的意思):

無效的參數處理程序例程

[...] 默認無效參數調用Watson崩潰報告,這將導致應用程序崩潰,並詢問用戶是否要將崩潰轉儲加載到Microsoft進行分析。 在調試模式下,無效的參數還會導致斷言失敗。

可以通過使用函數_set_invalid_parameter_handler將無效的參數處理程序設置為您自己的函數來更改此行為。 [...]


或者,您可能需要考慮StringCchCat()函數 ,如果目標緩沖區太小,該函數將返回等於STRSAFE_E_INSUFFICIENT_BUFFERHRESULT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM