缓冲区溢出不影响const变量?

我对黑客,集会,记忆和所有这些东西都不太了解,所以我没有自己解决我的问题。

所以,缓冲区溢出溢出到变量的其他地址并破坏它们。 所以我测试过,它确实如此。 我认为,如果它可以溢出常量变量缓冲区溢出必须超级供电和我测试,但它不会溢出const变量。

这是为什么?

int a;
char buffer[8];

const int a;
char buffer[8];

通过'缓冲区'的大小在变量'a'的地址前面具有变量'缓冲区'的地址。 分配给内存时const变量中是否有特殊的东西?

我的示例代码:

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

int main() {
    char buffer1[8];
    const int a=0;                      //vs int a=0;
    char buffer2[8];

    strcpy(buffer1,"one");
    strcpy(buffer2,"two");

    printf("Buffer 2    [%p]: %sn",buffer2,buffer2);
    printf("a           [%p]: %dn",&a,a);
    printf("Buffer 1    [%p]: %sn",buffer1,buffer1);

    printf("nCopy Buffernn");
    strcpy(buffer2,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");

    printf("Buffer 2    [%p]: %sn",buffer2,buffer2);
    printf("a           [%p]: %dn",&a,a);
    printf("Buffer 1    [%p]: %sn",buffer1,buffer1);

    return 0;
}

想到三件事:

  • 这是未定义的行为,所以所有投注都不在表格中。
  • 编译器甚至没有看什么a是。 如果我是一个编译器,我只会看看那个代码,并说“ a总是零,所以我会继续前进,用0代替a 。” 问题是,当你说printf("%p %d", &a, a); ,编译器甚至没有拿到的内容a 。 它知道它将永远是零,所以它可以将该代码更改为printf("%p %d", &a, 0);
  • 即使a没有const ,编译器将被允许“缓存”的值, a在寄存器中。 它只需要查看一次值,然后它知道a永远不会改变*,因此它可以重用它以前查找的值。
  • 编译器会做出很多假设,比如“这段代码不会调用未定义的行为”。 如果你调用未定义的行为,编译器可能会做出一些“错误”的假设。 在这种情况下,它可能会做什么。


    缓冲区溢出是UB,所以任何事情都可能发生。

    而且,你的编译器可以优化掉你的const变量,因为它在编译时确定了一个常量值。


    允许一个实现将一个const限定的对象放在一个不同的内存段中,这可能是为什么它不受影响(重点在于;因为缓冲区溢出的行为是未定义的,可能有多种原因)。

    在线C 2011标准,第6.7.3节,脚注132:

    该实现可能会将volatileconst对象放置在只读存储区域中。 此外,如果从未使用其地址,则该实现不需要为这样的对象分配存储空间。

    链接地址: http://www.djcxy.com/p/82501.html

    上一篇: buffer overflow not affecting const variable?

    下一篇: Does Declaring a Global Variable in C Alter the Entry Point?