簡體   English   中英

檢測到C snprintf sprintf堆棧粉碎

[英]C snprintf sprintf stack smashing detected

我具有以下功能,有時會達到“檢測到堆棧粉碎”的功能。 但是,當我將sprintf()修改為snprintf(nbytes_buf, sizeof(nbytes_buf), "%d", nbytes) ,問題就解決了。

“數據”永遠不會大於1024字節。 因此,我認為nbytes_buf [20]就足夠了。 但是當“數據”包含字符“>”時,我也遇到“檢測到堆棧粉碎”問題。

有人知道為什么嗎?

int a( const char *data )
{
    int nbytes;
    char nbytes_buf[20];

    nbytes = strlen(data);
    sprintf(nbytes_buf, "%d", nbytes);

    /* do something else */
    return 0;
}

如果使用sprintf() ,則緩沖區的大小應足夠大以包含整個結果字符串。 snprintf()將克服此問題,因為如果結果字符串的長度大於n-1個字符,則其余字符將被丟棄而不存儲。

因此,只有在使用sprintf()且字符串的大小大於n-1時,您才會收到錯誤"stack smashing detected" 如果使用snprintf() ,即使字符串的大小大於n-1也不會出現問題。

閱讀http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html snprintf()函數應與sprintf()等效,並增加了n參數,該參數說明了被引用的緩沖區的大小。 s。 如果n為零,則不寫任何內容,而s可以為空指針。 否則, 將丟棄* n-1st之后的輸出字節,而不是將其寫入數組,在實際寫入數組的字節的末尾寫入* nd空字節。

暫無
暫無

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

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