Почему -fno-stack-protector меняет порядок, в котором хранятся эти строки? - PullRequest
1 голос
/ 04 мая 2019

У меня есть следующая функция:

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 .!..............

У меня сложилось впечатление, что все средства защиты стека помещаются в канареек стека, так почему бы изменить порядок распределения памяти следующим образом?

1 Ответ

1 голос
/ 04 мая 2019

Порядок «наращивания» стека относится к расположению различных кадров стека, когда у вас есть вложенные функции или блоки. Он также будет расти в этом направлении, динамически распределяя временные интервалы в стеке.

Однако расположение переменных в кадре стека совершенно произвольно; нет ничего, что требовало бы, чтобы он был в том же порядке, что и объявления переменных. Есть много причин, по которым компилятор может переупорядочивать переменные в кадре стека; например, переменные с меньшими требованиями к выравниванию могут быть перемещены вместе, чтобы минимизировать заполнение.

Тот факт, что эти строки переворачиваются при использовании -fno-stack-protector, вероятно, является лишь побочным эффектом различных путей кода через оптимизатор. Я сомневаюсь, что есть какая-то конкретная причина для этого, но это не должно иметь значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...