簡體   English   中英

為什么這個字符串不會溢出緩沖區?

[英]How come this string doesn't overflow the buffer?

我在Mac和Linux上都運行了此代碼:

#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[]){

int value = 5;
char buffer_one[8], buffer_two[8];

strcpy(buffer_one, "one");
strcpy(buffer_two, "two");

printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[BEFORE] value is at %p and is %i (0x%08x)\n", &value, value, value);

printf("\n[STRCPY] copying %i bytes into buffer two\n\n", strlen(argv[1]));
strcpy(buffer_two, argv[1]); 

printf("[AFTER] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[AFTER] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[AFTER] value is at %p and is %i (0x%08x)\n", &value, value, value);
}

在Mac上,如果我作為命令行參數輸入“ 1234567890”,則90會像我期望的那樣溢出到緩沖區1中,因為8字節的緩沖區超出了2。

但是,如果我在Linux系統上運行它,則需要更多的字符來使緩沖區溢出。 為什么/為什么要在Linux中超過緩沖區?

另外,在兩個系統上,整個字符串仍將打印在緩沖區2中,而溢出的項目僅打印在緩沖區1中。 為什么會這樣? 剩下的角色怎么會不只是跳到下一個? 如果這個問題的措辭不好,請舉一個例子:

如果我在Mac上輸入1234567890,則1234567890將被打印在緩沖區2中,而90將被打印在緩沖區1中。 即使溢出,90仍如何容納在緩沖區2中。 (在Linux上是相同的概念,但是溢出需要超過10個字節)

在這兩種情況下,都有緩沖區溢出。 緩沖區溢出只是調用未定義的行為。 在某些情況下,它似乎可能工作得很好,不會造成崩潰或段錯誤。

例如,由於對齊原因,內存分配器(在這種情況下為堆棧分配)分配的內存可能比您請求的要多。 在這種情況下,您實際上可能能夠溢出緩沖區而沒有任何明顯的副作用,但這實際上是一件非常糟糕的事情,因為它隱藏了錯誤,而不是消除了錯誤。

在這種情況下,由於它涉及堆棧,因此您將覆蓋堆棧中超出分配給緩沖區的內容。 如果引入了更多的變量或開始調用函數,則可能開始注意到真正奇怪的副作用。 無論如何,這都是一個非常棘手的情況,並且您要非常小心,以避免緩沖區溢出。

暫無
暫無

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

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