Повреждение памяти
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Выполнение программы |
---|
Общие понятия |
Типы кода |
Стратегии составления |
Известное время выполнения |
|
Известные компиляторы и наборы инструментов |
|
Повреждение памяти происходит в компьютерной программе , когда содержимое ячейки памяти изменяется из-за программного поведения, которое выходит за рамки намерений исходного программиста или программных/языковых конструкций; это называется нарушением безопасности памяти . Наиболее вероятными причинами повреждения памяти являются ошибки программирования (ошибки программного обеспечения). Когда поврежденное содержимое памяти используется позже в этой программе, это приводит либо к сбою программы, либо к странному и причудливому поведению программы. Почти 10% сбоев приложений в системах Windows происходят из-за повреждения кучи . [ 1 ]
Современные языки программирования, такие как C и C++, обладают мощными возможностями явного управления памятью и арифметики указателей . Эти функции предназначены для разработки эффективных приложений и системного программного обеспечения. Однако неправильное использование этих функций может привести к ошибкам повреждения памяти.
Повреждение памяти — один из наиболее трудноразрешимых ошибок программирования по двум причинам:
- Источник повреждения памяти и его проявления могут находиться далеко друг от друга, что затрудняет сопоставление причины и следствия.
- Симптомы появляются в необычных условиях, что затрудняет последовательное воспроизведение ошибки.
Ошибки повреждения памяти можно разделить на четыре категории:
- Использование неинициализированной памяти . Содержимое неинициализированной памяти рассматривается как мусорные значения. Использование таких значений может привести к непредсказуемому поведению программы.
- Использование чужой памяти. Обычно для доступа к памяти и ее изменения используются указатели. Если такой указатель является нулевым указателем, висячим указателем (указывающим на уже освобожденную память) или на ячейку памяти за пределами текущего стека или границ кучи , он ссылается на память, которая на тот момент не принадлежала программе. Использование таких указателей является серьезным недостатком программирования. Доступ к такой памяти обычно вызывает исключения операционной системы, которые чаще всего приводят к сбою программы (если не используется подходящее программное обеспечение для защиты памяти).
- Использование памяти, превышающей выделенную память ( переполнение буфера ): если массив используется в цикле с неверным условием завершения, память за пределами границ массива может быть случайно манипулирована. Переполнение буфера — одна из наиболее распространенных ошибок программирования, используемая компьютерными вирусами, вызывающая серьезные проблемы компьютерной безопасности (например, атака возврата в libc , защита от разрушения стека ) в широко используемых программах. В некоторых случаях программы также могут некорректно обращаться к памяти до начала буфера.
- Неправильное управление памятью в куче. Утечки памяти и освобождение некучей или нераспределенной памяти являются наиболее частыми ошибками, вызванными неправильным управлением памятью в куче.
Многие отладчики памяти, такие как Purify , Valgrind , Insure++ , Parasoft C/C++test , AddressSanitizer, доступны для обнаружения ошибок повреждения памяти.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Радич, К.; Шерер, Т.; Шарки, К.; Бэтчелор, Д.; Кеннеди, Джей Ти; Мэби, Д.; Коултер, Д.; Майкл, С. (28 апреля 2021 г.). «Проверщик приложений (книга качества приложений для Windows 7 и Windows Server 2008 R2) — приложения Win32» . Сеть разработчиков Microsoft . Проверено 9 февраля 2022 г.
Внешние ссылки
[ редактировать ]- Учебное пособие по повреждению памяти. Введение в методы эксплуатации и механизмы защиты.