[英]C program buffer overflow issue
我有一個char數組大小為8的代碼。如果gcc用-fno-stack-protector
編譯代碼, stack smashing detected
smashing只有在字符串大小為12后才會被檢測到,比如12345678901234567890
。 如果我使用-fstack-protector
,大小為 9 的輸入將導致分段錯誤,如下所示。 我可以知道為什么僅在大小為 12 的字符串輸入時檢測到錯誤,而不是其他數字嗎?
我確實嘗試了具有不同字符數組大小的不同輸入,當溢出大小為 11 到 13(輸入大小 - 字符數組大小)時將檢測到錯誤。
代碼:
#include <stdio.h>
int i;
void readinput()
{
char c, buf[8];
int i;
printf("Enter a string: ");
for (i = 0; (c = getchar()) != '\n'; i++) buf[i] = c;
buf[i] = '\0';
printf("string = [%s]\n", buf);
}
int main(int argc, char *argv[])
{
readinput();
return 0;
}
該代碼不會檢查i
是否小於數組的長度,因此如果用戶輸入超過 7 個字符,它會出現未定義的行為。 為緩沖區溢出檢查啟用編譯器選項並非萬無一失,並非每個違規訪問都經過測試。 C 程序員負責,需要良好的實踐來嘗試避免此類問題。
這是修改后的版本:
#include <stdio.h>
void readinput(void) {
char buf[8];
size_t i;
int c;
printf("Enter a string: ");
for (i = 0; (c = getchar()) != EOF && c != '\n';) {
if (i + 1 < sizeof(buf))
buf[i++] = c;
}
buf[i] = '\0';
printf("string = [%s]\n", buf);
}
int main(int argc, char *argv[]) {
readinput();
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.