Повреждение памяти - Memory corruption
Эта статья поднимает множество проблем. Пожалуйста помоги Улучши это или обсудите эти вопросы на страница обсуждения. (Узнайте, как и когда удалить эти сообщения-шаблоны) (Узнайте, как и когда удалить этот шаблон сообщения)
|
Выполнение программы |
---|
Общие понятия |
Типы кода |
Стратегии компиляции |
Заметное время выполнения |
|
Известные компиляторы и инструментальные средства |
Повреждение памяти происходит в компьютерная программа когда содержимое место в памяти изменяются из-за программного поведения, выходящего за рамки намерений исходного программиста или программных / языковых конструкций; это называется нарушением безопасность памяти. Наиболее вероятная причина повреждения памяти - ошибка программирования. Когда поврежденное содержимое памяти используется позже в этой программе, это приводит либо к сбою программы, либо к странному и причудливому поведению программы. Около 10% сбоев приложений в системах Windows связаны с куча коррупция.[1]
Современные языки программирования, такие как C и C ++ обладают мощными функциями явного управления памятью и арифметика указателя. Эти функции предназначены для разработки эффективных приложений и системного программного обеспечения. Однако неправильное использование этих функций может привести к ошибкам, связанным с повреждением памяти.
Повреждение памяти - один из самых трудноизлечимых классов ошибок программирования по двум причинам:
- Источник повреждения памяти и его проявление могут находиться далеко друг от друга, что затрудняет сопоставление причины и следствия.
- Симптомы появляются в необычных условиях, что затрудняет последовательное воспроизведение ошибки.
Ошибки повреждения памяти можно условно разделить на четыре категории:
- С помощью неинициализированная память: Содержимое неинициализированной памяти обрабатывается как мусорные значения. Использование таких значений может привести к непредсказуемому поведению программы.
- Использование чужой памяти: для доступа и изменения памяти обычно используются указатели. Если такой указатель является нулевым указателем, висячий указатель (указывая на память, которая уже была освобождена), или на место в памяти вне текущего стека, или куча границы, это относится к памяти, которой тогда не владеет программа. Использование таких указателей - серьезный недостаток программирования. Доступ к такой памяти обычно вызывает исключения операционной системы, которые чаще всего приводят к сбою программы (если не используется подходящее программное обеспечение для защиты памяти).
- Использование памяти за пределами выделенной памяти (переполнение буфера ): Если массив используется в цикле с неправильным условием завершения, память за пределами массива может быть случайно изменена. Переполнение буфера - одна из самых распространенных программных ошибок, используемых компьютерными вирусами, вызывая серьезные компьютерная безопасность проблемы (например, возврат к libc атака, защита от разрушения стека ) в широко используемых программах. В некоторых случаях программы также могут некорректно обращаться к памяти до запуска буфера.
- Неправильное управление памятью кучи: Утечки памяти и освобождение не-кучи или нераспределенной памяти - наиболее частые ошибки, вызванные неправильным управлением памятью кучи.
Много отладчики памяти Такие как Очистить, Валгринд, Страхование ++, Тест Parasoft C / C ++, AddressSanitizer доступны для обнаружения ошибок повреждения памяти.
Смотрите также
Рекомендации
- ^ «Средство проверки приложений». Библиотека MSDN. Microsoft. 19 апреля 2011 г.. Получено 4 мая 2011.
внешняя ссылка
- Учебник по повреждению памяти Введение в методы эксплуатации и механизмы защиты