Все примеры проблем в моей текстовой книге показывают, что массивы буфера хранятся в стеке, что вызывает проблемы при перезаписываемом адресе. Однако буфер всегда находится в стеке? Я предположил, что массив будет написан где-то еще в памяти, а не в стеке.Является ли массив буфера, который всегда хранится в стеке?
ответ
Локальные переменные буферы, объявленные как постоянный размер (см. Нижеприведенный пример) или инициализированные немедленно, сохраняются в стеке.
char x[20];
или char x[] = "this buffer";
Даже если они затем передаются в функцию переменной останется сохраненной в стеке. Только дальше от выполняемой функции.
Если вы выделяете память для буфера, то она будет храниться в памяти кучи, а не в стеке.
char *x = (char *) malloc(LENGTH_OF_BUFFER);
Это когда heap spraying может стать необходимым для эксплуатации. Причина, по которой вы наблюдаете больше всего переполнения буфера в стеке, состоит в том, что это самый простой способ понять понятия эксплуатации.
Буферные массивы обычно хранятся в стеке. Однако их можно хранить в куче или в местах с фиксированной памятью - и все это предполагает, что вы имеете дело с языком (и архитектурой), который отличает стек и кучу.
Это зависит прежде всего от компилятора, где объявлен ваш буфер и как вызывается функция.
В C, в общем, локальные переменные выделяются в стеке, а также некоторые параметры, предоставляемые для вызовов функций (в соглашении о вызове cdecl *. Другие соглашения о вызовах могут подталкивать некоторые параметры через регистры или даже через прозрачное распределение кучи в некоторых случаях).
Некоторые языки и компиляторы будут выделять их по-разному. Например, в Delphi вы объявляете локальную переменную типа «строка», фактические данные будут храниться в куче, только указатель, выделенный для стека.
Наконец, программист всегда может решить явно выделить буферы в куче (или глобальной памяти).
- 1. Является ли массив примитивов Java хранимым в стеке или куче?
- 2. переполнение буфера в стеке
- 3. Локальные переменные: всегда ли они в стеке?
- 4. Где хранится хранилище в стеке?
- 5. строка Javascript хранится в стеке
- 6. Что хранится в куче и что хранится в стеке?
- 7. Объект C++ хранится в стеке или куче
- 8. Как получить переменную, которая хранится в стеке?
- 9. Как хранится память в стеке, куча?
- 10. C++ переменная экземпляра на стеке хранится в виде указателя
- 11. Как ссылка на кучи хранится в стеке?
- 12. Массив нестатического размера в стеке
- 13. текста из буфера обмена не является массив
- 14. Является ли memcpy OK в перераспределении буфера?
- 15. Динамический массив в стеке?
- 16. Передача параметров массива в стеке (переполнение буфера)
- 17. Распределение памяти в стеке и переполнение буфера, x86 ISA32
- 18. C++ объявляет массив байтов типа данных, который хранится в строке
- 19. Добавить постоянное значение в массив, который хранится в файле hdf5
- 20. Добавить в массив, который хранится в WordPress _options
- 21. Всегда ли возвращает массив jQuery?
- 22. Более удобный способ создания буфера char ** в стеке?
- 23. Является ли DependcenyProperty всегда унаследованным?
- 24. if-statement, который всегда является истинным
- 25. Как хранится массив в памяти?
- 26. Является ли UDP всегда ненадежным?
- 27. Преобразование буфера в желаемый массив?
- 28. Эта ссылка хранится в стеке вызовов в Java?
- 29. Добавить массив в массив хранится в куках
- 30. Удаляет массив, который хранится как статическая локальная переменная, и как?
Добро пожаловать на IS Stack Exchange. Некоторая дополнительная информация была бы полезна, например, какой язык программирования вы используете, потому что разные языки и даже разные компиляторы могут относиться к хранению переменных в массивах очень по-разному. –