Чтобы понять концепцию фрейма стека, я написал небольшую программу для себя. Во-первых, я покажу вам код, немного очерк о нем, а затем я представлю мой вопрос:Локальные переменные в стеке
Таким образом, программа:
int check_pw(char *password){
int valid = 0;
char buffer[10];
strcpy(buffer, password);
if(strcmp(buffer, "a") == 0){
valid = 1;
}
return valid;
}
int main(int argc, char *argv[]){
if(check_pw(argv[1])){
printf("OK\n");
}
else{
printf("Wrong password\n");
}
}
Я даю пароль в качестве аргумента командной строки. И если он равен «a», тогда это нормально. Итак, я думаю, это понятно.
Теперь эскиз как кадр стека функции check_pw
должна выглядеть следующим образом:
------------------------- LOW
| buffer |
-------------------------
| valid |
-------------------------
| old EBP |
-------------------------
| RET |
-------------------------
| password |
------------------------- HIGH
Теперь мой вопрос:
Я полагаю, что эскиз является правильным. Итак, тогда первая локальная переменная «valid» должна получить более высокий адрес памяти, чем вторая переменная «buffer», правильно?
Но когда я использую GDB как отладчик (я использую Ubuntu Lucid Lynx), установите свои контрольные точки в нужных местах и введите следующее: х/х & действует и х/х & буфер тогда я получаю адрес 0xbffff388 для «valid» и 0xbffff38c для «buffer» Итак, очевидно, что «буфер» имеет более высокий адрес, но почему?
Компилятор может выложить местных жителей в стек стека, но он хочет. –
Возможный дубликат [Порядок размещения локальных переменных в стеке] (http://stackoverflow.com/questions/1102049/order-of-local-variable-allocation-on-the-stack) - похоже, есть другие аналогичные вопросы в соответствующей боковой панели справа –
Может ли это быть также механизм защиты от уязвимости, такой как «переполнение буфера» или что-то в этом роде? Потому что тогда у меня не было бы возможности переполнить «действительную» переменную. – user3097712