gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:26:45 25 4
gpt4 key购买 nike

我对黑客、C、汇编、内存和所有这些东西知之甚少,所以我无法自己解决我的问题。

因此,缓冲区溢出会溢出到变量的其他地址并破坏它们。所以我测试了一下,确实如此。而且我认为,如果它可以溢出常量变量缓冲区溢出,那么一定是 super 强大的,我测试过,但它不会溢出常量变量。

这是为什么?

int a;
char buffer[8];

const int a;
char buffer[8];

变量“buffer”的地址在变量“a”的地址前面,按“buffer”的大小。分配给内存时,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]: %s\n",buffer2,buffer2);
printf("a [%p]: %d\n",&a,a);
printf("Buffer 1 [%p]: %s\n",buffer1,buffer1);

printf("\nCopy Buffer\n\n");
strcpy(buffer2,"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");

printf("Buffer 2 [%p]: %s\n",buffer2,buffer2);
printf("a [%p]: %d\n",&a,a);
printf("Buffer 1 [%p]: %s\n",buffer1,buffer1);

return 0;
}

最佳答案

想到三件事:

  1. 这是未定义的行为,所以所有的赌注都不成立。
  2. 编译器甚至不必查看a 是什么。如果我是编译器,我只会看那段代码并说“a 始终为零,所以我将继续并将 a 替换为 0。”问题是,当您说 printf("%p %d", &a, a); 时,编译器甚至不必获取 a 的内容。它知道它将永远为零。*所以它可以将该代码更改为 printf("%p %d", &a, 0);
  3. 即使a 不是const,编译器也可以在寄存器中“缓存”a 的值。它只需要查找一次值,然后它就知道 a 永远不会改变*,因此它可以重用之前查找的值。

*编译器会做出很多假设,比如“这段代码不会调用未定义的行为”。如果您调用未定义的行为,编译器可能会做出一些“错误”的假设。在这种情况下,它可能会这样做。

关于c++ - 缓冲区溢出不影响 const 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22795851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com