21. Инициализированность переменных
Свойство программы: при любом исполнении программы
переменная инициализирована в данной точке программы.
Путём в программе от точки d1 до точки d2 назовём путь в графе
потока управления программы.
Свойство программы: на любом пути из входа в программу до
точки программы D переменная в точке D становится
инициализирована.
29. Доминаторы
Узел d графа доминирует над узлом n, если все пути графа из
начального узла в узел n проходят через узел d.
30. Приводимые графы
Граф G является приводимым тогда и только тогда, когда мы можем
разделить дуги на две непересекающиеся группы, часто
именуемые прямыми и обратными дугами, такие, что
1. Прямые дуги образуют ациклический граф, в котором из
начального узла G может быть достигнут любой узел.
2. Обратные дуги состоят только из дуг, головы которых
доминируют над хвостами.
31.
32. Общий алгоритм
• Конечная решётка L
• In, Out ∈ L
• − верхняя грань элементов на L
• f – произвольная функция на L
Outdi = fdi(indi)
Indi = 푑푗 ∈ 푃푟푒푣(푑푖) 푂푢푡푑푗
33. Достигающие определения
In compiler theory, a reaching definition for a given instruction is an earlier instruction whose
target variable can reach the given one without an intervening assignment.
For example, in the following code:
d1 : y := 3
d2 : x := y
d1 is a reaching definition for d2.
In the following, example, however:
d1 : y := 3
d2 : y := 4
d3 : x := y
d1 is no longer a reaching definition for d3, because d2 kills its reach.
34. Достигающие определения
Элемент L – множество присвоений значений переменным,
которые могут достигнуть данной точки программы
- Объединение множеств
48. Общий алгоритм статического анализа
Set nodes; //множество вершин в программе
nodes = все вершины в программе
L in[sizeof(nodes)], out[sizeof(nodes)]; //множество значений из
решётки до и после вершин
while (nodes != ∅)
node = Peek(nodes); nodes -= node; //Забираем из множества
элемент
L old_out = out[node];
in[node] = 푛 ∈푃푟푒푣(푛표푑푒) 푂푢푡 푛 ;
out[node] = f(node, in[node]);
if(old_out != out[node])
nodes.Insert(node.NextNodes());
49. def i
def j = 1
푂푢푡 = { j }
while (something)
i=0
nothing
퐼푁 = ∅
퐼푁 = {∅}
푂푢푡 = {∅}
퐼푁 = {∅}
푂푢푡 ={ i }
퐼푁 = {i,j}
푂푢푡 ={I,j}
Элемент L - множество
инициализированных
переменных
− ?
• Свойство программы: на любом пути из входа в программу до точки
программы D переменная в точке D становится инициализирована.
50. def i
def j = 1
푂푢푡 = { i }
while (something)
i=0
nothing
퐼푁 = {∅}
퐼푁 = {∅}
푂푢푡 = {∅}
퐼푁 = {∅}
푂푢푡 ={∅ }
퐼푁 = {∅}
푂푢푡 ={∅}
Элемент L – множество
возможно
неинициализированных
переменных
- объединение множеств
• Свойство программы: на некотором пути из входа в программу до
точки программы D переменная в точке D становится не
инициализирована.
51. def i
def j = 1
푂푢푡 = { i }
while (something)
i=0
nothing
퐼푁 = {∅}
퐼푁 = {푖}
푂푢푡 = {i}
퐼푁 = {∅}
푂푢푡 ={∅ }
퐼푁 = {∅}
푂푢푡 ={∅}
Элемент L – множество
возможно
неинициализированных
переменных
- объединение множеств
• Свойство программы: на некотором пути из входа в программу до
точки программы D переменная в точке D становится не
инициализирована.
52. def i
def j = 1
푂푢푡 = { i }
while (something)
i=0
nothing
퐼푁 = {∅}
퐼푁 = {푖}
푂푢푡 = {i}
퐼푁 = {푖}
푂푢푡 ={∅ }
퐼푁 = {∅}
푂푢푡 ={∅}
Элемент L – множество
возможно
неинициализированных
переменных
- объединение множеств
• Свойство программы: на некотором пути из входа в программу до
точки программы D переменная в точке D становится не
инициализирована.
53. def i
def j = 1
푂푢푡 = { i }
while (something)
i=0
nothing
퐼푁 = {∅}
퐼푁 = {푖}
푂푢푡 = {i}
퐼푁 = {푖}
푂푢푡 ={∅ }
퐼푁 = {푖}
푂푢푡 ={푖}
Элемент L – множество
возможно
неинициализированных
переменных
- объединение множеств
• Свойство программы: на некотором пути из входа в программу до
точки программы D переменная в точке D становится не
инициализирована.