gpt4 book ai didi

c - 为什么 -fno-stack-protector 会颠倒这些字符串的存储顺序?

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

我有以下功能:

void f(){
char a[]="THIS IS A STR 1";
char b[]="THIS IS A STR 2";
char c[]="THIS IS A STR 3";
char d[]="THIS IS A STR 4";
}

当我正常编译和运行这个程序时,这些字符串在栈上的分配是这样的:

08 00 00 00 04 00 00 00 10 00 00 00 10 00 00 00 ................
10 71 c7 64 fc 7f 00 00 07 a9 90 7b 24 56 00 00 .q.d.......{$V..
54 48 49 53 20 49 53 20 41 20 53 54 52 20 31 00 THIS IS A STR 1.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 32 00 THIS IS A STR 2.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 33 00 THIS IS A STR 3.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 34 00 THIS IS A STR 4.
a0 69 d9 76 c8 7f 00 00 00 dc ad e1 c7 89 e9 11 .i.v............
30 71 c7 64 fc 7f 00 00 37 a9 90 7b 24 56 00 00 0q.d....7..{$V..``

堆栈向较小的内存地址增长(在本例中为“向上”),因此这些字符串的存储顺序对我来说似乎是相反的。

而当我使用 -fno-stack-protector 编译和运行时,我得到了“正确”的顺序。

00 00 00 2e 10 00 00 00 08 00 00 00 05 00 00 00 ................
80 20 05 0f ff 7f 00 00 88 58 bb 32 96 55 00 00 . .......X.2.U..
54 48 49 53 20 49 53 20 41 20 53 54 52 20 34 00 THIS IS A STR 4.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 33 00 THIS IS A STR 3.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 32 00 THIS IS A STR 2.
54 48 49 53 20 49 53 20 41 20 53 54 52 20 31 00 THIS IS A STR 1.
a0 20 05 0f ff 7f 00 00 a4 58 bb 32 96 55 00 00 . .......X.2.U..
88 21 05 0f ff 7f 00 00 00 00 00 00 02 00 00 00 .!..............

我的印象是所有堆栈保护器都放在堆栈金丝雀中,那么为什么它会像这样重新排序内存分配方式?

最佳答案

堆栈“增长”的顺序指的是嵌套函数或 block 时不同堆栈帧的位置。它也会朝这个方向增长,需要在堆栈上动态分配临时对象。

然而,堆栈帧中变量的位置是完全任意的;没有什么要求它与变量声明的顺序相同。编译器可能对堆栈帧中的变量重新排序的原因有很多;例如,对齐要求较小的变量可能会一起移动,以尽量减少填充。

当您使用 -fno-stack-protector 时这些字符串被反转的事实可能只是通过优化器的不同代码路径的副作用。我怀疑这有什么具体原因,但这应该无关紧要。

关于c - 为什么 -fno-stack-protector 会颠倒这些字符串的存储顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55977989/

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