代码之家  ›  专栏  ›  技术社区  ›  miya

缓冲区溢出:为什么缓冲区分配会影响其他变量?

  •  0
  • miya  · 技术社区  · 2 年前
    
    void foo() {
        int value = 0;
        char buf[4];
        buf[4] = 1;
    
    
        printf("value: %d\n", value);
    }
    
    int main() {
        foo();
        return 0;
    }
    
    
    

    为什么“value”打印为1?

    我相信这与缓冲区溢出和小端序有关,但我发现这很难理解。

    1 回复  |  直到 2 年前
        1
  •  0
  •   gulpr    2 年前

    因为这是未定义的行为。

    只要更改优化选项就足够了,您将获得不同的结果。

    例如Godbolt:

    • 带-O0:1
    • 带有-Os:0

    但它不一定是这样的。它可能会以segfault结束,或者可能会发生其他事情。

    https://godbolt.org/z/TEbWbMvsa

    我理解这是不明确的行为。我只是想知道这是怎么回事 与小endian有关。当我越过buf[3]进入buf[4]时 开始更改内存中的下一个字节。我如何知道下一个字节 内存中的“值”是什么?

    你不可能知道。没有指定顺序。 value 可以被优化出来而根本不存储在堆栈上。您需要非常了解ABI和编译器才能预测它。

    在您的情况下:

    + 0x07: value byte 4  MSB
    + 0x06: value byte 3
    + 0x05: value byte 2
    + 0x04: value byte 1  LSB
    + 0x03: buf[3]
    + 0x02: buf[2]
    + 0x01: buf[1]
    + 0x00: buf[0]
    
    推荐文章