[英]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.