Построение срезов для программ на динамических языках - page 9

Построение срезов для программ на динамических языках
9
DEF_AT(v) := call_pos;
добавить_в_траекторию('$current_pos RETURN');
добавить_в_траекторию('$call_pos REFS $current_pos');
вернуться_к_выполнению_вызывающей_процедуры;
Каждой записи
FUNCALL
в траектории должна соответствовать
парная запись
RETURN
. Все записи, находящиеся между такой парой
записей, относятся к выполнению вызванной процедуры (и других
процедур, вызванных из нее).
Обработка траектории и построение ГПЗ.
Метод предполагает
последовательное считывание записей траектории выполнения про-
граммы и добавление дуг в составляемый граф программных зависи-
мостей (рис. 5).
Рис. 5.
Обработка траектории и построение ГПЗ
Обработка траектории начинается с инициализации ГПЗ с пу-
стым множеством дуг и множеством вершин, состоящим из одной
вершины
Entry
. Множество вершин (операторов) пополняется каж-
дый раз, когда в траектории встречается идентификатор оператора,
отсутствующего в графе.
Зависимости по данным обрабатываются проще всего: дуги таких
зависимостей
O
1
O
2
добавляются в ГПЗ при обработке записей
траектории вида
O
1
REFS O
2
.
Зависимости по управлению определяются на основе сериализо-
ванных ГПУ для каждой процедуры. Восстановление ГПУ по запи-
сям
CFG_START
,
CFG_END
,
O
1
JUMPSTO O
2
траектории описывает-
ся следующим алгоритмом:
N := emptyset;
E := emptyset;
while true:
record := прочитать_запись_траектории
if record = 'CFG_END':
break
1,2,3,4,5,6,7,8 10,11,12,13,14,15,16,17
Powered by FlippingBook