簡體   English   中英

如何避免c中的緩沖區溢出

[英]How to avoid buffer overflow in c

我試圖設置此代碼以避免緩沖區溢出,但我不確定為什么它不起作用。 我對此很陌生,將不勝感激。

我試過使用斷言來確保它結束,但我希望斷言成功

void authenticate (void) 
{
    char buffer1[8];
    int i;
    for (i = 0; i < 16; i++)
    {
        assert (i < sizeof(buffer1));
        buffer1[i] = ‘x’;
    }
}

期望斷言通過但失敗。 想要在不完全重寫循環的情況下修復它。 謝謝!

這里似乎對assert確切功能存在一些誤解。 assert宏執行給定條件的運行時檢查。 如果該條件為假,則會導致程序中止。

在這種情況下, i的值在循環內的范圍從 0 到 15。 i的值小於 8 的迭代中,斷言通過。 但是一旦i變成 8 斷言失敗導致程序中止。 失敗的斷言不會導致程序跳過下一個循環迭代。

處理這個問題的正確方法是限制循環計數器不越界:

for (i=0; i<sizeof(buf); i++)

C 語言本身不像其他一些語言那樣執行邊界檢查。 這是使它快速的部分原因。 這也意味着該語言相信開發人員不會做諸如超出數組范圍的讀/寫之類的事情。 破壞這種信任會導致未定義的行為 因此,您需要確保不會發生這種情況。

還有一些工具,例如 valgrind,可以幫助識別內存管理不善。

斷言按預期失敗。 將計數器限制更改為 8 以通過。

    for (i = 0; i < 8; i++)

但也許你真的想要

    buf[7]=0;
    for (i = 0; i < 8; i++)

暫無
暫無

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

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