53
Классический алгоритм статического анализа потока данных

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

  • Upload
    m2rus

  • View
    50

  • Download
    1

Embed Size (px)

DESCRIPTION

Basics of static analysis lection 2

Citation preview

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

Классический алгоритм статического анализа

потока данных

Page 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

truefalse

truefalse

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

Граф потока управления

i=0

i ==1

i=2

true

if(i=3)

i=4

truefalse

truefalse

d1

d2

d3

d4

d5

d6

truefalse

truefalse

d1

d2

d3

d4

d5

d6

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

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

Outdi = fdi(Indi)

Indi =

d1

d2

d3

d4

d5

d6

truefalse

truefalse

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

Инициализированность переменныхint i;if(something)

i=0; else

i=1;int j = i;

Def i

if(something)

i=0i=1

def j;j = i;

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

Инициализированность переменных

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

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

Инициализированность переменных

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

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

Инициализированность переменных

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅

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

Инициализированность переменных

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

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

Инициализированность переменных

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅

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

Инициализированность переменных

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅{i}

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

Инициализированность переменных

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅

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

Инициализированность переменных

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

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

Инициализированность переменных

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛={𝑖 }

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

Инициализированность переменных

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛={𝑖 }𝑂𝑢𝑡={𝑖 }

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

Инициализированность переменных

Def i

if(something)

nothingi=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

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

Инициализированность переменныхСвойство программы: при любом исполнении программы переменная инициализирована в данной точке программы.

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

Инициализированность переменных

Def i

if(something)

nothingi=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡=∅

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

Инициализированность переменныхOutdi = fdi(indi)

Indi =

fdi =

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

Инициализированность переменных

Def i

if(true)

nothingi=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡=∅

true false

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

Инициализированность переменныхСвойство программы: при любом исполнении программы переменная инициализирована в данной точке программы.

Путём в программе от точки d1 до точки d2 назовём путь в графе потока управления программы.

Свойство программы: на любом пути из входа в программу до точки программы D переменная в точке D становится инициализирована.

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

Инициализированность переменных

def i

while (something)

i=0

nothing

𝐼𝑁=∅

𝑂𝑢𝑡=∅𝐼𝑁=∅

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

Инициализированность переменных

def i

while (something)

i=0

nothing

𝐼𝑁=∅

𝑂𝑢𝑡=∅𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑁=∅

{i}

𝐼𝑁=∅

𝑂𝑢𝑡=∅

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

Инициализированность переменных

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { j }

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

Инициализированность переменных

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { j }

fin { i }

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

Инициализированность переменных

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { j }

fin { i }

fin { i }

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

Инициализированность переменных

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { j }

{i,j}

{I,j}

𝐼𝑁={ 𝑗 }

{i,j}

fin { i }

fin { i }

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

Инициализированность переменных

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { j }

{j}

{j}

{j}

{ i,j }

{i,j}

{I,j}

𝐼𝑁={ 𝑗 }

{i,j}

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

Доминаторы

Узел d графа доминирует над узлом n, если все пути графа из начального узла в узел n проходят через узел d.

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

Приводимые графы

Граф G является приводимым тогда и только тогда, когда мы можем разделить дуги на две непересекающиеся группы, часто именуемые прямыми и обратными дугами, такие, что1. Прямые дуги образуют ациклический граф, в котором из

начального узла G может быть достигнут любой узел.2. Обратные дуги состоят только из дуг, головы которых

доминируют над хвостами.

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

Общий алгоритм

• Конечная решётка L• In, Out L• элементов на L• f – произвольная функция на L

Outdi = fdi(indi)

Indi =

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

Достигающие определения

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.

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

Достигающие определения

Элемент L – множество присвоений значений переменным, которые могут достигнуть данной точки программы

- Объединение множеств

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{, i}

{}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{, i}

{, i}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{, i}

{, i}

{ }

{}

{}

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

Достигающие определения

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{, i}

{, i}

{ }

{}

{}

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

Общий алгоритм статического анализа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());

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

• Свойство программы: на любом пути из входа в программу до точки программы D переменная в точке D становится инициализирована.

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { j }

{}

{}

{}

{ i }

{i,j}

{I,j}

Элемент L - множество инициализированных переменных

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

• Свойство программы: на некотором пути из входа в программу до точки программы D переменная в точке D становится не инициализирована.

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁={∅ }

{ i }

{}

{}

{}

{ }

{}

{}

Элемент L – множество возможно неинициализированных переменных

- объединение множеств

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

• Свойство программы: на некотором пути из входа в программу до точки программы D переменная в точке D становится не инициализирована.

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁={∅ }

{ i }

{}

{i}

{}

{ }

{}

{}

Элемент L – множество возможно неинициализированных переменных

- объединение множеств

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

• Свойство программы: на некотором пути из входа в программу до точки программы D переменная в точке D становится не инициализирована.

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁={∅ }

{ i }

{}

{i}

{}

{ }

{}

{}

Элемент L – множество возможно неинициализированных переменных

- объединение множеств

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

• Свойство программы: на некотором пути из входа в программу до точки программы D переменная в точке D становится не инициализирована.

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁={∅ }

{ i }

{}

{i}

{}

{ }

{}

{}

Элемент L – множество возможно неинициализированных переменных

- объединение множеств