SlideShare a Scribd company logo
1 of 53
Классический алгоритм 
статического анализа 
потока данных
Граф потока управления 
i=0; 
if(i==1) 
A: 
i=2; 
while(true) 
{ 
if(i=3) 
goto A; 
} 
i=4 
i=0 
i ==1 
i=2 
true 
if(i=3) 
i=4 
true 
false 
true 
false
Граф потока управления 
i=0 
i ==1 
i=2 
true 
if(i=3) 
i=4 
true 
false 
true 
false 
d1 
d2 
d3 
d4 
d5 
d6 
true 
false 
true 
false 
d1 
d2 
d3 
d4 
d5 
d6
Прямое уравнение статического анализа 
потока данных 
Outdi = fdi(Indi) 
Indi = 푑푗 ∈ 푃푟푒푣(푑푖) 푂푢푡푑푗 
d1 
d2 
d3 
d4 
d5 
d6 
true 
false 
true 
false
Инициализированность переменных 
int i; 
if(something) 
i=0; 
else 
i=1; 
int j = i; 
Def i 
if(something) 
i=1 i=0 
def j; 
j = i;
Инициализированность переменных 
Def i 
if(something) 
i=1 i=0 
def j; 
j = i; 
퐼푁 = ∅
Инициализированность переменных 
Def i 
if(something) 
i=1 i=0 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅
Инициализированность переменных 
Def i 
if(something) 
i=1 i=0 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅
Инициализированность переменных 
Def i 
if(something) 
i=1 i=0 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = ∅
Инициализированность переменных 
Def i 
if(something) 
i=1 i=0 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅
Инициализированность переменных 
Def i 
if(something) 
i=1 i=0 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 ={i}
Инициализированность переменных 
Def i 
if(something) 
i=1 i=0 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = { 푖 } 
퐼푛 = ∅
Инициализированность переменных 
Def i 
if(something) 
i=1 i=0 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = { 푖 } 
퐼푛 = ∅ 
푂푢푡 = { 푖 }
Инициализированность переменных 
Def i 
if(something) 
i=1 i=0 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = { 푖 } 
퐼푛 = ∅ 
푂푢푡 = { 푖 } 
퐼푛 = { 푖 }
Инициализированность переменных 
Def i 
if(something) 
i=1 i=0 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = { 푖 } 
퐼푛 = ∅ 
푂푢푡 = { 푖 } 
퐼푛 = { 푖 } 
푂푢푡 = { 푖 }
Инициализированность переменных 
Def i 
if(something) 
i=1 nothing 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = { 푖 } 
퐼푛 = ∅ 
푂푢푡 = { 푖 }
Инициализированность переменных 
Свойство программы: при любом исполнении программы 
переменная инициализирована в данной точке программы.
Инициализированность переменных 
Def i 
if(something) 
i=1 nothing 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = { 푖 } 
퐼푛 = ∅ 
푂푢푡 = { 푖 } 
퐼푛 = ∅ 
푂푢푡 = ∅
Инициализированность переменных 
Outdi = fdi(indi) 
Indi = 푑푗 ∈ 푃푟푒푣(푑푖) 푂푢푡푑푗 
fdi = 푖푛푑푖 ∪ 푏푒푐표푚푒 푖푛푖푡 ∩ 푢푛푖푛푖푡 
퐼푛푑푖 = 
푑푗 ∈푃푟푒푣 (푑푗) 
푂푢푡푑푗
Инициализированность переменных 
Def i 
if(true) 
true false 
i=1 nothing 
def j; 
j = i; 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = ∅ 
퐼푛 = ∅ 
푂푢푡 = { 푖 } 
퐼푛 = ∅ 
푂푢푡 = { 푖 } 
퐼푛 = ∅ 
푂푢푡 = ∅
Инициализированность переменных 
Свойство программы: при любом исполнении программы 
переменная инициализирована в данной точке программы. 
Путём в программе от точки d1 до точки d2 назовём путь в графе 
потока управления программы. 
Свойство программы: на любом пути из входа в программу до 
точки программы D переменная в точке D становится 
инициализирована.
Инициализированность переменных 
def i 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푁 = ∅
Инициализированность переменных 
def i 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푁 = ∅ 
푂푢푡 = ∅ 
퐼푁 = ∅ 
푂푢푡 ={i} 
퐼푁 = ∅ 
푂푢푡 = ∅
Инициализированность переменных 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = { j }
Инициализированность переменных 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = { j } 
f(푖푛) = in ∪ { i }
Инициализированность переменных 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = { j } 
f(푖푛) = in ∪ { i } 
f(푖푛) = in ∪ { i }
Инициализированность переменных 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = { j } 
퐼푁 = {i,j} 
푂푢푡 ={I,j} 
퐼푁 = {푗} 
푂푢푡 = {i,j} 
f(푖푛) = in ∪ { i } 
f(푖푛) = in ∪ { i }
Инициализированность переменных 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = { j } 
퐼푁 = {j} 
푂푢푡 = {j} 
퐼푁 = {j} 
푂푢푡 ={ i,j } 
퐼푁 = {i,j} 
푂푢푡 ={I,j} 
퐼푁 = {푗} 
푂푢푡 = {i,j}
Доминаторы 
Узел d графа доминирует над узлом n, если все пути графа из 
начального узла в узел n проходят через узел d.
Приводимые графы 
Граф G является приводимым тогда и только тогда, когда мы можем 
разделить дуги на две непересекающиеся группы, часто 
именуемые прямыми и обратными дугами, такие, что 
1. Прямые дуги образуют ациклический граф, в котором из 
начального узла G может быть достигнут любой узел. 
2. Обратные дуги состоят только из дуг, головы которых 
доминируют над хвостами.
Общий алгоритм 
• Конечная решётка L 
• In, Out ∈ L 
• − верхняя грань элементов на L 
• f – произвольная функция на L 
Outdi = fdi(indi) 
Indi = 푑푗 ∈ 푃푟푒푣(푑푖) 푂푢푡푑푗
Достигающие определения 
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.
Достигающие определения 
Элемент L – множество присвоений значений переменным, 
которые могут достигнуть данной точки программы 
- Объединение множеств
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {∅ } 
퐼푁 = {∅} 
푂푢푡 = {∅} 
퐼푁 = {∅} 
푂푢푡 ={∅ } 
퐼푁 = {∅} 
푂푢푡 ={∅}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {∅} 
푂푢푡 = {∅} 
퐼푁 = {∅} 
푂푢푡 ={∅ } 
퐼푁 = {∅} 
푂푢푡 ={∅}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {푗} 
푂푢푡 = {∅} 
퐼푁 = {∅} 
푂푢푡 ={∅ } 
퐼푁 = {∅} 
푂푢푡 ={∅}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {푗} 
푂푢푡 = {푗} 
퐼푁 = {∅} 
푂푢푡 ={∅ } 
퐼푁 = {∅} 
푂푢푡 ={∅}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {푗} 
푂푢푡 = {푗} 
퐼푁 = {푗} 
푂푢푡 ={∅ } 
퐼푁 = {∅} 
푂푢푡 ={∅}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {푗} 
푂푢푡 = {푗} 
퐼푁 = {푗} 
푂푢푡 ={푖, 푗 } 
퐼푁 = {∅} 
푂푢푡 ={∅}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {푗} 
푂푢푡 = {푗} 
퐼푁 = {푗} 
푂푢푡 ={푖, 푗 } 
퐼푁 = {푗} 
푂푢푡 ={∅}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {푗} 
푂푢푡 = {푗} 
퐼푁 = {푗} 
푂푢푡 ={푖, 푗 } 
퐼푁 = {푗} 
푂푢푡 ={푗}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {푗, 푖} 
푂푢푡 = {푗} 
퐼푁 = {푗} 
푂푢푡 ={푖, 푗 } 
퐼푁 = {푗} 
푂푢푡 ={푗}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {푗, 푖} 
푂푢푡 = {푗, i} 
퐼푁 = {푗} 
푂푢푡 ={푖, 푗 } 
퐼푁 = {푗} 
푂푢푡 ={푗}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {푗, 푖} 
푂푢푡 = {푗, i} 
퐼푁 = {푗, i} 
푂푢푡 ={푖, 푗 } 
퐼푁 = {푗} 
푂푢푡 ={푗}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {푗, 푖} 
푂푢푡 = {푗, i} 
퐼푁 = {푗, i} 
푂푢푡 ={푖, 푗 } 
퐼푁 = {푗, 푖} 
푂푢푡 ={푗}
Достигающие определения 
def i 
def j = 1 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
푂푢푡 = {푗 } 
퐼푁 = {푗, 푖} 
푂푢푡 = {푗, i} 
퐼푁 = {푗, i} 
푂푢푡 ={푖, 푗 } 
퐼푁 = {푗, 푖} 
푂푢푡 ={푗, 푖}
Общий алгоритм статического анализа 
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());
def i 
def j = 1 
푂푢푡 = { j } 
while (something) 
i=0 
nothing 
퐼푁 = ∅ 
퐼푁 = {∅} 
푂푢푡 = {∅} 
퐼푁 = {∅} 
푂푢푡 ={ i } 
퐼푁 = {i,j} 
푂푢푡 ={I,j} 
Элемент L - множество 
инициализированных 
переменных 
− ? 
• Свойство программы: на любом пути из входа в программу до точки 
программы D переменная в точке D становится инициализирована.
def i 
def j = 1 
푂푢푡 = { i } 
while (something) 
i=0 
nothing 
퐼푁 = {∅} 
퐼푁 = {∅} 
푂푢푡 = {∅} 
퐼푁 = {∅} 
푂푢푡 ={∅ } 
퐼푁 = {∅} 
푂푢푡 ={∅} 
Элемент L – множество 
возможно 
неинициализированных 
переменных 
- объединение множеств 
• Свойство программы: на некотором пути из входа в программу до 
точки программы D переменная в точке D становится не 
инициализирована.
def i 
def j = 1 
푂푢푡 = { i } 
while (something) 
i=0 
nothing 
퐼푁 = {∅} 
퐼푁 = {푖} 
푂푢푡 = {i} 
퐼푁 = {∅} 
푂푢푡 ={∅ } 
퐼푁 = {∅} 
푂푢푡 ={∅} 
Элемент L – множество 
возможно 
неинициализированных 
переменных 
- объединение множеств 
• Свойство программы: на некотором пути из входа в программу до 
точки программы D переменная в точке D становится не 
инициализирована.
def i 
def j = 1 
푂푢푡 = { i } 
while (something) 
i=0 
nothing 
퐼푁 = {∅} 
퐼푁 = {푖} 
푂푢푡 = {i} 
퐼푁 = {푖} 
푂푢푡 ={∅ } 
퐼푁 = {∅} 
푂푢푡 ={∅} 
Элемент L – множество 
возможно 
неинициализированных 
переменных 
- объединение множеств 
• Свойство программы: на некотором пути из входа в программу до 
точки программы D переменная в точке D становится не 
инициализирована.
def i 
def j = 1 
푂푢푡 = { i } 
while (something) 
i=0 
nothing 
퐼푁 = {∅} 
퐼푁 = {푖} 
푂푢푡 = {i} 
퐼푁 = {푖} 
푂푢푡 ={∅ } 
퐼푁 = {푖} 
푂푢푡 ={푖} 
Элемент L – множество 
возможно 
неинициализированных 
переменных 
- объединение множеств 
• Свойство программы: на некотором пути из входа в программу до 
точки программы D переменная в точке D становится не 
инициализирована.

More Related Content

What's hot

04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепцииFedor Tsarev
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиMikhail Kurnosov
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадZheka Kozlov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...Омские ИТ-субботники
 

What's hot (6)

04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции04 динамическое программирование - основные концепции
04 динамическое программирование - основные концепции
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
2017-02-04 01 Евгений Тюменцев. Выразительные возможности языков программиро...
 

Similar to основы и применение статического анализа кода при разработке лекция 2

Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
 
О-символика
О-символикаО-символика
О-символикаDEVTYPE
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки PythonPython Meetup
 
Tech Talks @NSU: Теоретические основы программирования: проекции Футамуры-Тур...
Tech Talks @NSU: Теоретические основы программирования: проекции Футамуры-Тур...Tech Talks @NSU: Теоретические основы программирования: проекции Футамуры-Тур...
Tech Talks @NSU: Теоретические основы программирования: проекции Футамуры-Тур...Tech Talks @NSU
 

Similar to основы и применение статического анализа кода при разработке лекция 2 (6)

Vzaimno obratnye funkcii
Vzaimno obratnye funkciiVzaimno obratnye funkcii
Vzaimno obratnye funkcii
 
Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"Николай Паламарчук "Functional Programming basics for PHP developers"
Николай Паламарчук "Functional Programming basics for PHP developers"
 
О-символика
О-символикаО-символика
О-символика
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Недостатки Python
Недостатки PythonНедостатки Python
Недостатки Python
 
Tech Talks @NSU: Теоретические основы программирования: проекции Футамуры-Тур...
Tech Talks @NSU: Теоретические основы программирования: проекции Футамуры-Тур...Tech Talks @NSU: Теоретические основы программирования: проекции Футамуры-Тур...
Tech Talks @NSU: Теоретические основы программирования: проекции Футамуры-Тур...
 

основы и применение статического анализа кода при разработке лекция 2

  • 2. Граф потока управления i=0; if(i==1) A: i=2; while(true) { if(i=3) goto A; } i=4 i=0 i ==1 i=2 true if(i=3) i=4 true false true false
  • 3. Граф потока управления i=0 i ==1 i=2 true if(i=3) i=4 true false true false d1 d2 d3 d4 d5 d6 true false true false d1 d2 d3 d4 d5 d6
  • 4. Прямое уравнение статического анализа потока данных Outdi = fdi(Indi) Indi = 푑푗 ∈ 푃푟푒푣(푑푖) 푂푢푡푑푗 d1 d2 d3 d4 d5 d6 true false true false
  • 5. Инициализированность переменных int i; if(something) i=0; else i=1; int j = i; Def i if(something) i=1 i=0 def j; j = i;
  • 6. Инициализированность переменных Def i if(something) i=1 i=0 def j; j = i; 퐼푁 = ∅
  • 7. Инициализированность переменных Def i if(something) i=1 i=0 def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅
  • 8. Инициализированность переменных Def i if(something) i=1 i=0 def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅
  • 9. Инициализированность переменных Def i if(something) i=1 i=0 def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = ∅
  • 10. Инициализированность переменных Def i if(something) i=1 i=0 def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅
  • 11. Инициализированность переменных Def i if(something) i=1 i=0 def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 ={i}
  • 12. Инициализированность переменных Def i if(something) i=1 i=0 def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = { 푖 } 퐼푛 = ∅
  • 13. Инициализированность переменных Def i if(something) i=1 i=0 def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = { 푖 } 퐼푛 = ∅ 푂푢푡 = { 푖 }
  • 14. Инициализированность переменных Def i if(something) i=1 i=0 def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = { 푖 } 퐼푛 = ∅ 푂푢푡 = { 푖 } 퐼푛 = { 푖 }
  • 15. Инициализированность переменных Def i if(something) i=1 i=0 def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = { 푖 } 퐼푛 = ∅ 푂푢푡 = { 푖 } 퐼푛 = { 푖 } 푂푢푡 = { 푖 }
  • 16. Инициализированность переменных Def i if(something) i=1 nothing def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = { 푖 } 퐼푛 = ∅ 푂푢푡 = { 푖 }
  • 17. Инициализированность переменных Свойство программы: при любом исполнении программы переменная инициализирована в данной точке программы.
  • 18. Инициализированность переменных Def i if(something) i=1 nothing def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = { 푖 } 퐼푛 = ∅ 푂푢푡 = { 푖 } 퐼푛 = ∅ 푂푢푡 = ∅
  • 19. Инициализированность переменных Outdi = fdi(indi) Indi = 푑푗 ∈ 푃푟푒푣(푑푖) 푂푢푡푑푗 fdi = 푖푛푑푖 ∪ 푏푒푐표푚푒 푖푛푖푡 ∩ 푢푛푖푛푖푡 퐼푛푑푖 = 푑푗 ∈푃푟푒푣 (푑푗) 푂푢푡푑푗
  • 20. Инициализированность переменных Def i if(true) true false i=1 nothing def j; j = i; 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = ∅ 퐼푛 = ∅ 푂푢푡 = { 푖 } 퐼푛 = ∅ 푂푢푡 = { 푖 } 퐼푛 = ∅ 푂푢푡 = ∅
  • 21. Инициализированность переменных Свойство программы: при любом исполнении программы переменная инициализирована в данной точке программы. Путём в программе от точки d1 до точки d2 назовём путь в графе потока управления программы. Свойство программы: на любом пути из входа в программу до точки программы D переменная в точке D становится инициализирована.
  • 22. Инициализированность переменных def i while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푁 = ∅
  • 23. Инициализированность переменных def i while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푁 = ∅ 푂푢푡 = ∅ 퐼푁 = ∅ 푂푢푡 ={i} 퐼푁 = ∅ 푂푢푡 = ∅
  • 24. Инициализированность переменных def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = { j }
  • 25. Инициализированность переменных def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = { j } f(푖푛) = in ∪ { i }
  • 26. Инициализированность переменных def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = { j } f(푖푛) = in ∪ { i } f(푖푛) = in ∪ { i }
  • 27. Инициализированность переменных def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = { j } 퐼푁 = {i,j} 푂푢푡 ={I,j} 퐼푁 = {푗} 푂푢푡 = {i,j} f(푖푛) = in ∪ { i } f(푖푛) = in ∪ { i }
  • 28. Инициализированность переменных def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = { j } 퐼푁 = {j} 푂푢푡 = {j} 퐼푁 = {j} 푂푢푡 ={ i,j } 퐼푁 = {i,j} 푂푢푡 ={I,j} 퐼푁 = {푗} 푂푢푡 = {i,j}
  • 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 – множество присвоений значений переменным, которые могут достигнуть данной точки программы - Объединение множеств
  • 35. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {∅ } 퐼푁 = {∅} 푂푢푡 = {∅} 퐼푁 = {∅} 푂푢푡 ={∅ } 퐼푁 = {∅} 푂푢푡 ={∅}
  • 36. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {∅} 푂푢푡 = {∅} 퐼푁 = {∅} 푂푢푡 ={∅ } 퐼푁 = {∅} 푂푢푡 ={∅}
  • 37. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {푗} 푂푢푡 = {∅} 퐼푁 = {∅} 푂푢푡 ={∅ } 퐼푁 = {∅} 푂푢푡 ={∅}
  • 38. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {푗} 푂푢푡 = {푗} 퐼푁 = {∅} 푂푢푡 ={∅ } 퐼푁 = {∅} 푂푢푡 ={∅}
  • 39. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {푗} 푂푢푡 = {푗} 퐼푁 = {푗} 푂푢푡 ={∅ } 퐼푁 = {∅} 푂푢푡 ={∅}
  • 40. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {푗} 푂푢푡 = {푗} 퐼푁 = {푗} 푂푢푡 ={푖, 푗 } 퐼푁 = {∅} 푂푢푡 ={∅}
  • 41. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {푗} 푂푢푡 = {푗} 퐼푁 = {푗} 푂푢푡 ={푖, 푗 } 퐼푁 = {푗} 푂푢푡 ={∅}
  • 42. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {푗} 푂푢푡 = {푗} 퐼푁 = {푗} 푂푢푡 ={푖, 푗 } 퐼푁 = {푗} 푂푢푡 ={푗}
  • 43. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {푗, 푖} 푂푢푡 = {푗} 퐼푁 = {푗} 푂푢푡 ={푖, 푗 } 퐼푁 = {푗} 푂푢푡 ={푗}
  • 44. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {푗, 푖} 푂푢푡 = {푗, i} 퐼푁 = {푗} 푂푢푡 ={푖, 푗 } 퐼푁 = {푗} 푂푢푡 ={푗}
  • 45. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {푗, 푖} 푂푢푡 = {푗, i} 퐼푁 = {푗, i} 푂푢푡 ={푖, 푗 } 퐼푁 = {푗} 푂푢푡 ={푗}
  • 46. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {푗, 푖} 푂푢푡 = {푗, i} 퐼푁 = {푗, i} 푂푢푡 ={푖, 푗 } 퐼푁 = {푗, 푖} 푂푢푡 ={푗}
  • 47. Достигающие определения def i def j = 1 while (something) i=0 nothing 퐼푁 = ∅ 푂푢푡 = {푗 } 퐼푁 = {푗, 푖} 푂푢푡 = {푗, i} 퐼푁 = {푗, i} 푂푢푡 ={푖, 푗 } 퐼푁 = {푗, 푖} 푂푢푡 ={푗, 푖}
  • 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 становится не инициализирована.