簡體   English   中英

C 程序緩沖區溢出問題

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

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