Повреждение памяти - Memory corruption

Повреждение памяти происходит в компьютерная программа когда содержимое место в памяти изменяются из-за программного поведения, выходящего за рамки намерений исходного программиста или программных / языковых конструкций; это называется нарушением безопасность памяти. Наиболее вероятная причина повреждения памяти - ошибка программирования. Когда поврежденное содержимое памяти используется позже в этой программе, это приводит либо к сбою программы, либо к странному и причудливому поведению программы. Около 10% сбоев приложений в системах Windows связаны с куча коррупция.[1]

Современные языки программирования, такие как C и C ++ обладают мощными функциями явного управления памятью и арифметика указателя. Эти функции предназначены для разработки эффективных приложений и системного программного обеспечения. Однако неправильное использование этих функций может привести к ошибкам, связанным с повреждением памяти.

Повреждение памяти - один из самых трудноизлечимых классов ошибок программирования по двум причинам:

  1. Источник повреждения памяти и его проявление могут находиться далеко друг от друга, что затрудняет сопоставление причины и следствия.
  2. Симптомы появляются в необычных условиях, что затрудняет последовательное воспроизведение ошибки.

Ошибки повреждения памяти можно условно разделить на четыре категории:

  1. С помощью неинициализированная память: Содержимое неинициализированной памяти обрабатывается как мусорные значения. Использование таких значений может привести к непредсказуемому поведению программы.
  2. Использование чужой памяти: для доступа и изменения памяти обычно используются указатели. Если такой указатель является нулевым указателем, висячий указатель (указывая на память, которая уже была освобождена), или на место в памяти вне текущего стека, или куча границы, это относится к памяти, которой тогда не владеет программа. Использование таких указателей - серьезный недостаток программирования. Доступ к такой памяти обычно вызывает исключения операционной системы, которые чаще всего приводят к сбою программы (если не используется подходящее программное обеспечение для защиты памяти).
  3. Использование памяти за пределами выделенной памяти (переполнение буфера ): Если массив используется в цикле с неправильным условием завершения, память за пределами массива может быть случайно изменена. Переполнение буфера - одна из самых распространенных программных ошибок, используемых компьютерными вирусами, вызывая серьезные компьютерная безопасность проблемы (например, возврат к libc атака, защита от разрушения стека ) в широко используемых программах. В некоторых случаях программы также могут некорректно обращаться к памяти до запуска буфера.
  4. Неправильное управление памятью кучи: Утечки памяти и освобождение не-кучи или нераспределенной памяти - наиболее частые ошибки, вызванные неправильным управлением памятью кучи.

Много отладчики памяти Такие как Очистить, Валгринд, Страхование ++, Тест Parasoft C / C ++, AddressSanitizer доступны для обнаружения ошибок повреждения памяти.

Смотрите также

Рекомендации

  1. ^ «Средство проверки приложений». Библиотека MSDN. Microsoft. 19 апреля 2011 г.. Получено 4 мая 2011.

внешняя ссылка