Книга: Программирование для Linux. Профессиональный подход
А.2.2. Проверка функции malloc()
А.2.2. Проверка функции malloc()
Функции выделения и освобождения памяти, имеющиеся в GNU-библиотеке языка С, способны обнаруживать факт записи в память до начала выделенной области, а также попытку освободить одну и ту же область дважды. Если задать переменную среды MALLOC_CHECK_
равной 2, программа malloc-use
аварийно завершит работу в случае выявления такого рода ошибки. Подобное изменение поведения не требует перекомпиляции программы.
Вот что произойдет, если записать символ перед началом массива;
% export MALLOC_CHECK_=2
% ./malloc-use 12
Please enter a command: a 0 10
Please enter a command: w 0 -1
Please enter a command: d 0
Aborted (core dumped)
Команда export
включила проверку функции malloc()
, а значение 2 заставило программу завершиться сразу после обнаружения ошибки.
Проверка функции malloc()
очень полезна, потому что программу не нужно перекомпилировать, однако возможности этой проверки весьма ограничены. В основном определяется, не были ли повреждены выделенные структуры данных. Таким образом, сразу же обнаруживаются попытки повторно удалить ту же самую область. Кроме того, выявляется факт записи данных непосредственно перед началом выделенного блока, поскольку его размер хранится именно там. К сожалению, проверка выполняется только тогда, когда программа вызывает функцию malloc()
или free()
, а не когда происходит обращение к памяти. То есть до обнаружения ошибки может произойти множество неправильных операций чтения и записи. В частности, в предыдущем примере ошибка записи была выявлена лишь при попытке освободить выделенную область.
- А.2.1. Программа для тестирования динамической памяти
- А.2.2. Проверка функции malloc()
- А.2.3. Поиск потерянных блоков памяти с помощью утилиты mtrace
- А.2.4. Библиотека ccmalloc
- А.2.5. Библиотека Electric Fence
- А.2.6. Выбор средств отладки
- А.2.7. Исходный текст программы, работающей с динамической памятью
- А.2. Поиск ошибок в динамической памяти
- 15. Библиотека языка Си и файлы ввода-вывода
- Аргументы функции в Python
- 3. Функции
- Новые функции API для работы с Blob и массивами
- 3.2.1.2. Начальное выделение памяти: malloc()
- 5. Null-значения и проверка условий
- Математические функции
- Размытые функции
- 7.3. Финансовые функции
- 4.3. Логические функции и таблицы истинности
- B1.7. Функции обработки ошибок