Недавно я использовал опасную программу и нашел что-то интересное в разнице между версиями gcc
на архитектуре x86-64.Причины и преимущества этого улучшения по версии gcc> = 4.9.0 vs gcc version <4.9?
Примечание:
Неправомерное использование
gets
является не вопрос здесь.Если мы заменим
gets
на любые другие функции, проблема не изменится.
Это исходный код я использую:
#include <stdio.h>
int main()
{
char buf[16];
gets(buf);
return 0;
}
Я использую gcc.godbolt.org разобрать программу с флагом -m32 -fno-stack-protector -z execstack -g
.
В разобранном коде, когда gcc
с версии> = 4.9.0:
lea ecx, [esp+4] # begin of main
and esp, -16
push DWORD PTR [ecx-4] # push esp
push ebp
mov ebp, esp
/* between these comment is not related to the question
push ecx
sub esp, 20
sub esp, 12
lea eax, [ebp-24]
push eax
call gets
add esp, 16
mov eax, 0
*/
mov ebp, esp
mov ecx, DWORD PTR [ebp-4] # ecx = saved esp
leave
lea esp, [ecx-4]
ret # end of main
Но НКУ с версии < 4.9.0 просто:
push ebp # begin of main
mov ebp, esp
/* between these comment is not related to the question
and esp, -16
sub esp, 32
lea eax, [esp+16]
mov DWORD PTR [esp], eax
call gets
mov eax, 0
*/
leave
ret # end of main
Мой вопрос: Что такое cau ses этой разницы на разобранном коде и его преимуществах? Имеет ли это название для этой техники?
Примечание: [НЕ использовать 'gets()', это опасно] (http://stackoverflow.com/q/1694036/2173917). используйте вместо этого '' fgets() '] (https://linux.die.net/man/3/fgets). –
Это результат оптимизации –
Различные конфигурации компилятора. Используйте 'gcc -v' для сравнения конфигураций – LPs