А.2. Поиск ошибок в динамической памяти

А.2. Поиск ошибок в динамической памяти

При написании программы зачастую неизвестно, сколько памяти потребуется ей во время выполнения. Например, строка, читаемая из файла, может иметь любую длину. Работа с динамической памятью осуществляется посредством функций malloc(), free() и их вариантов. Следует придерживаться таких правил:

? число запросов на выделение памяти (вызовов функции malloc()) должно в точности совпадать с чистом запросов на освобождение памяти (вызовов функции free());

? операции чтения и записи динамической памяти должны выполняться в рамках выделенной области, не выходя за ее пределы;

? к выделенной области нельзя обращаться после того, как она была освобождена.

Выделение и освобождение динамической памяти происходят на этапе выполнения программы, поэтому статический анализ исходных текстов редко позволяет выявить недочеты. Утилиты проверки памяти сначала загружают программу, а затем определяют, нарушаются ли перечисленные выше правила. Выявляются следующие ошибки:

? чтение памяти до того, как она была выделена;

? запись в память до того, как она была выделена;

? чтение данных по адресу, предшествующему началу выделенной области;

? запись данных по адресу, предшествующему началу выделенной области;

? чтение данных по адресу, стоящее после выделенной области;

? запись данных по адресу, стоящему после выделенной области;

? чтение памяти после того, как она была освобождена;

? запись в память после того, как она была освобождена;

? неудачная попытка освободить выделенную память;

? попытка повторно освободить ту же самую область памяти;

? попытка освободить память, которая не была выделена.

Полезно также предупреждать о выделениях областей размером 0 байтов, так как это обычно свидетельствует об ошибке программиста.

В табл. А.1 описаны возможности четырех диагностических средств. К сожалению, ни одно из них не выявляет все возможные ошибки. Кроме того, ни одно средство не позволяет обнаруживать попытки чтения или записи памяти до того, как она была выделена, хотя такая попытка наверняка приведет к нарушению сегментации. Обнаруживаются те ошибки, которые действительно происходят в процессе работы программы. Если передать программе такие входные данные, что выделять память не понадобится, ошибки обращения к памяти не будут найдены. Для максимально тщательной проверки программы рекомендуется передавать ей самые разные входные данные, чтобы протестировать все возможные пути ее выполнения. Желательно также тестировать программу всеми имеющимися средствами.

Таблица А.1. Возможности средств проверки динамической памяти (X — обнаружение, О — обнаружение в некоторых случаях):

Ошибка Проверка функции malloc() Утилита mtrace Библиотека ccmalloc Библиотека Electric Fence
Чтение памяти до того, как она была выделена
Запись в память до того, как она была выделена
Чтение данных по адресу, предшествующему началу выделенной области X
Запись данных по адресу, предшествующему началу выделенной области О О X
Чтение данных по адресу, стоящему после выделенной области X
Запись данных по адресу, стоящему после выделенной области X X
Чтение памяти после того, как она была освобождена X
Запись в память после того, как она была освобождена X
Неудачная попытка освободить выделенную память X X
Попытка повторно освободить ту же самую область памяти X X
Попытка освободить память. которая не была выделена X X
Выделение памяти нулевого размера X X
Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Понятие статической и динамической веб-страницы

Из книги автора

Понятие статической и динамической веб-страницы Ранее мы уже кратко говорили о том, что представляют собой статические и динамические веб-страницы. В данном же разделе мы рассмотрим этот вопрос более детально.Название статической страницы говорит само за себя: на такой


Делаем статистику динамической

Из книги автора

Делаем статистику динамической Итак, мы узнали, как подготовить внешний JavaScript-файл к динамической загрузке. Осталось понять, как теперь это использовать.Основное преимущество (или недостаток?) Omniture заключается в том, что JavaScript-файл (обычно s_code.js) располагается на нашем


Функции динамической загрузки

Из книги автора

Функции динамической загрузки dlЗагрузка библиотеки расширения PHP во время выполнения.Синтаксис:int dl(string library);dl("extensions/php_db.dll");Загружает PHP расширение определенное в library.get_loaded_extensionsОпределения перечня загруженных модулей.Синтаксис:array get_loaded_extensions(void);Возвращает массив,


2. Работа с динамической памятью. Нетипизированные указатели

Из книги автора

2. Работа с динамической памятью. Нетипизированные указатели Процедуры и функции работы с динамической памятью 1. Процедура New(var p: Pointer). Выделяет место в динамической области памяти для размещения динамической переменной рЛ, и ее адрес присваивает указателю


1.4. Сборка динамической библиотеки из командной строки

Из книги автора

1.4. Сборка динамической библиотеки из командной строки ПроблемаВы хотите использовать свои инструменты командной строки для сборки динамической библиотеки из набора исходных файлов С++, таких как перечисленные в примере 1.2.РешениеВыполните следующие шаги.1. Используйте


1.9. Сборка динамической библиотеки с помощью Boost.Build

Из книги автора

1.9. Сборка динамической библиотеки с помощью Boost.Build ПроблемаВы хотите использовать Boost.Build для сборки динамической библиотеки из набора исходных файлов С++, таких как перечисленные в примере 1.2.РешениеВ директории, где вы хотите создать динамическую библиотеку и, если


1.12. Сборка динамической библиотеки с помощью IDE

Из книги автора

1.12. Сборка динамической библиотеки с помощью IDE ПроблемаВы хотите использовать IDE для сборки динамической библиотеки из набора исходных файлов С++, таких как перечисленные в примере 1.2.РешениеОсновная процедура выглядит следующим образом.1. Создайте новый проект и


11.14. Реализация динамической матрицы

Из книги автора

11.14. Реализация динамической матрицы ПроблемаТребуется реализовать числовые матрицы, размерности которых (количество строк и столбцов) неизвестны на этапе компиляции.РешениеВ примере 11.28 показана универсальная и эффективная реализация класса динамической матрицы,


А.2.1. Программа для тестирования динамической памяти

Из книги автора

А.2.1. Программа для тестирования динамической памяти Программа malloc-use, приведенная в листинге А.2, позволяет тестировать операции выделения, освобождения и обращения к памяти. Единственный аргумент командной строки задает максимальное число выделяемых буферов. Например,


Режим с динамической компоновкой

Из книги автора

Режим с динамической компоновкой Особенности режима с динамической компоновкойКак было отмечено выше, с помощью кнопки быстрого доступа Режим" и связанной с ней клавиши F4 можно осуществлять переключение между двумя режимами окна задачника: традиционного режима с


Аргументы в пользу динамической типизации

Из книги автора

Аргументы в пользу динамической типизации Несмотря на все это, динамическая типизация не теряет своих приверженцев, в частности, среди Smalltalk-программистов. Их аргументы основаны прежде всего на реализме, речь о котором шла выше. Они уверены, что статическая типизация