2015-10-07 3 views
0

Все примеры проблем в моей текстовой книге показывают, что массивы буфера хранятся в стеке, что вызывает проблемы при перезаписываемом адресе. Однако буфер всегда находится в стеке? Я предположил, что массив будет написан где-то еще в памяти, а не в стеке.Является ли массив буфера, который всегда хранится в стеке?

+0

Добро пожаловать на IS Stack Exchange. Некоторая дополнительная информация была бы полезна, например, какой язык программирования вы используете, потому что разные языки и даже разные компиляторы могут относиться к хранению переменных в массивах очень по-разному. –

ответ

0

Локальные переменные буферы, объявленные как постоянный размер (см. Нижеприведенный пример) или инициализированные немедленно, сохраняются в стеке.

char x[20]; или char x[] = "this buffer";

Даже если они затем передаются в функцию переменной останется сохраненной в стеке. Только дальше от выполняемой функции.

Если вы выделяете память для буфера, то она будет храниться в памяти кучи, а не в стеке.

char *x = (char *) malloc(LENGTH_OF_BUFFER);

Это когда heap spraying может стать необходимым для эксплуатации. Причина, по которой вы наблюдаете больше всего переполнения буфера в стеке, состоит в том, что это самый простой способ понять понятия эксплуатации.

1

Буферные массивы обычно хранятся в стеке. Однако их можно хранить в куче или в местах с фиксированной памятью - и все это предполагает, что вы имеете дело с языком (и архитектурой), который отличает стек и кучу.

1

Это зависит прежде всего от компилятора, где объявлен ваш буфер и как вызывается функция.

В C, в общем, локальные переменные выделяются в стеке, а также некоторые параметры, предоставляемые для вызовов функций (в соглашении о вызове cdecl *. Другие соглашения о вызовах могут подталкивать некоторые параметры через регистры или даже через прозрачное распределение кучи в некоторых случаях).

Некоторые языки и компиляторы будут выделять их по-разному. Например, в Delphi вы объявляете локальную переменную типа «строка», фактические данные будут храниться в куче, только указатель, выделенный для стека.

Наконец, программист всегда может решить явно выделить буферы в куче (или глобальной памяти).