缓冲区溢出不影响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:
该实现可能会将volatile
的const
对象放置在只读存储区域中。 此外,如果从未使用其地址,则该实现不需要为这样的对象分配存储空间。
上一篇: buffer overflow not affecting const variable?
下一篇: Does Declaring a Global Variable in C Alter the Entry Point?