Чтение онлайн

на главную - закладки

Жанры

Программирование для Linux. Профессиональный подход

Самьюэл Алекс

Шрифт:

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

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

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

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

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

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

■ запись

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

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

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

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

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

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

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

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

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

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

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

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

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

Программа

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

■ Если ввести

a i b
, для элемента массива
А[i]
будет выделено
b
байтов. Индекс i должен быть неотрицательным числом, меньшим, чем аргумент командной строки. Число байтов также должно быть неотрицательным.

■ Если ввести

d i
, будет удален буфер
A[i]
.

■ Если ввести

r i p
, из буфера
A[i]
будет прочитан p– й символ (
A[i][p]
). Значение p должно быть целым.

■ Если ввести

w i p
, в позицию p буфера
A[i]
будет записан символ.

■ Для завершения работы программы введите

q
.

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

А.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 заставило программу завершиться сразу после обнаружения ошибки.

Поделиться:
Популярные книги

Черный маг императора 3

Герда Александр
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Пипец Котенку! 3

Майерс Александр
3. РОС: Пипец Котенку!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Пипец Котенку! 3

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Боги, пиво и дурак. Том 6

Горина Юлия Николаевна
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6

Болотник 2

Панченко Андрей Алексеевич
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 2

Ты всё ещё моя

Тодорова Елена
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Ты всё ещё моя

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Королевская Академия Магии. Неестественный Отбор

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Королевская Академия Магии. Неестественный Отбор

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода