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

Проверка корректности освобождения ресурсов, локальных для функции на языке C
9
После обработки инструкций блока необходимо определить по-
стдоминатор, на который будет передано управление и который бу-
дет проанализирован далее. В силу ограниченности множества обра-
батываемых инструкций преобразованного представления ГПУ воз-
можна ситуация, при которой постдоминатор не может быть выяв-
лен. В этом случае необходимо выбрать для анализа первый блок из
списка постдоминаторов, а остальные сохранить в список непроана-
лизированых альтернативных путей исполнения. Вместе с каждым
сохраненным блоком должны быть сохранены текущие значения ло-
кальных переменных. Сохраненные блоки будут выбираться для ана-
лиза, если список постдоминаторов текущего блока пуст. Анализ ис-
пользования ресурса имеет смысл до тех пор, пока идентификатор
ресурса не утерян, поэтому при потере идентификатора ресурса ана-
лиз прекращается.
После анализа инструкций базового блока необходимо опреде-
лить, какому из его непосредственных постдоминаторов было бы пе-
редано управление при выполнении программы. Данный постдоми-
натор должен быть проанализирован после текущего блока. Для
определения следующего блока необходимо проанализировать ре-
зультат выполнения инструкций передачи управления в зависимости
от состояния локальных переменных.
Рассмотрим используемые инструкции передачи управления из
блока (см. рис. 3):
1) безусловная передача управления с помощью инструкции
return
. Данная инструкция может находится только в выходном бло-
ке, список постдоминаторов которого пуст, поэтому и блока ГПУ, на
который управление было бы передано, нет;
2) безусловная передача управления с помощью инструкции
goto
.
В данном случае список непосредственных постдоминаторов содер-
жит единственный элемент, который и является искомым блоком;
3) условная передача управления с помощью инструкций
if
и
switch
. Поскольку в рамках обработки инструкций реализована обра-
ботка операторов сравнения языка С, то становится возможным
определить тот блок, на который будет передано управление, если
известно значение выражений условия перехода или выбора.
Таким образом, для каждого базового блока определен список его
непосредственных постдоминаторов.
Программная реализация и результаты применения.
Про-
граммный комплекс, реализующий описанный алгоритм, основан на
языке C++ и состоит из следующих модулей: взаимодействия с GCC,
создания внутреннего представления ГПУ, поиска ошибок согласо-
вания выделения и освобождения ресурса, пользовательского интер-
фейса. Схема взаимодействия модулей представлена на рис. 6.
1,2,3,4,5,6,7,8 10,11,12
Powered by FlippingBook