1
УДК 004.052
Проверка корректности освобождения ресурсов,
локальных для функции на языке C
© А.В. Медников, В.А. Крищенко
МГТУ им. Н.Э. Баумана, Москва, 105005, Россия
Если перемененные, хранящие идентификатор полученного ресурса, являются ло-
кальными для некоторой функции, то ресурс должен быть свободен до момента
ее завершения, иначе его освобождение произойдет только при уничтожении про-
цесса. Оно также должно осуществляться в соответствии с жизненным циклом
идентификатора ресурса. Для проверки корректности освобождения локальных
ресурсов предложен алгоритм, основанный на статическом анализе ГПУ функции.
Он позволяет обнаруживать утечку таких локальных для функции ресурсов, а
также попытку повторного освобождения, использования после освобождения и
попытку освобождения невыделенного ресурса. Программная реализация предло-
женного алгоритма использует ГПУ функции на языке C, полученный компилято-
ром GCC. Разработанное программное обеспечение может обнаруживать ошиб-
ки, связанные с освобождением локальных ресурсов.
Ключевые слова:
обнаружение утечки ресурсов, ошибки использования ресурсов,
обработка ошибок, статический анализ, C, GCC, ГПУ.
Если процесс не освобождает своевременно ресурс, выделенный
ему операционной системой, то момент освобождения такого ресурса
откладывается до завершения процесса. Для системных служб данная
ситуация не является приемлемой: типичная сетевая служба функци-
онирует от момента запуска сервера до его выключения.
Язык программирования С является одним из наиболее попу-
лярных при создании сетевых служб. При этом он не предоставляет
программисту ни аналога подхода RAII [1] для автоматического
освобождения ресурсов, локальных для функции, ни синтаксиса для
обработки исключений. Обработка ошибок на языке C выполняется
при помощи условного оператора, часто в связи с оператором пере-
хода как ближайшего аналога блока
try ... finally
в других языках
программирования. В результате, освобождение ресурсов в про-
грамме на языке C возложено на программиста, и с ростом числа
используемых в функции ресурсов возрастает и количество потен-
циальных ошибок.
Если все переменные, хранящие идентификатор такого ресурса,
локальны для функции, то можно утверждать, что ресурс должен
быть освобожден к моменту ее завершения, иначе наблюдается ситу-
ация утечки ресурса. Автоматизация проверки этого критерия позво-
лит повысить качество создаваемого ПО. В настоящий момент суще-