Проверка корректности освобождения ресурсов, локальных для функции на языке C - page 2

А.В. Медников, В.А. Крищенко
2
ствуют многочисленные средства, обнаруживающие утечки памяти
как на основе динамического (например, [2]), так и статического ана-
лиза (например, CppCheck). Поскольку эти средства ограничены по-
иском утечек памяти, то проблема обнаружения утечек иных ресур-
сов (например, файловых дескрипторов) является к настоящему мо-
менту нерешенной.
Таким образом, задача создания программного средства для про-
верки освобождения локальных ресурсов в программах на языке C и
разработки необходимых для этого алгоритмов является актуальной.
Жизненный цикл идентификатора ресурса.
Рассмотрим
цикл использования ресурса, такого как открытый файл или объект
синхронизации, с позиции прикладного процесса. Допустим, в
данный момент времени выполняется процесс, которому необхо-
димо использовать некоторый ресурс. Для этого процесс должен
завести некоторый контейнер для хранения идентификатора ресур-
са, причем в дальнейшем значение одного контейнера может копи-
роваться в другой. Разрабатываемый алгоритм ограничен провер-
кой контейнеров, являющихся локальными переменными, что ти-
пично для ресурсов, время использования которых ограничено не-
которой функцией.
После выделения контейнера процесс должен вызвать в термино-
логии стандартов POSIX системную функцию на выделение ему ре-
сурса операционной системой и записать ее результат в контейнер. В
случае успеха процесс получает корректный идентификатор выде-
ленного ресурса, в противном случае системная функция обычно
возвращает процессу значение идентификатора, считающееся некор-
ректным (часто это значение «–1»). Использование и освобождение
успешно выделенного ресурса осуществляется затем с помощью по-
лученного идентификатора.
Любое действие, совершаемое процессом над ресурсом, исполь-
зует идентификатор ресурса, поэтому с точки зрения прикладной
программы выделенный ресурс эквивалентен его идентификатору,
который хранится в некотором контейнере или контейнерах. Жиз-
ненный цикл идентификатора ресурса на протяжении всего времени
выполнения программы можно описать конечным автоматом, пред-
ставленным на рис. 1.
По приведенному автомату можно определить множество собы-
тий, приводящих к ошибкам при использовании ресурса.
Следующие ситуации рассматриваются как ошибочные:
1) попытка использования или освобождения ресурса с примене-
нием неинициализированного контейнера;
2) ресурс был корректно выделен, но идентификатор ресурса за-
тем утерян процессом, т. е. произошла утечка ресурса;
1 3,4,5,6,7,8,9,10,11,...12
Powered by FlippingBook