основы и применение статического анализа кода при...

Post on 21-Jun-2015

50 views 1 download

description

Basics of static analysis lection 2

Transcript of основы и применение статического анализа кода при...

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

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

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

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

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

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

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

Outdi = fdi(Indi)

Indi =

d1

d2

d3

d4

d5

d6

truefalse

truefalse

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

i=0; else

i=1;int j = i;

Def i

if(something)

i=0i=1

def j;j = i;

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

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

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

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

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

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅

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

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

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

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅

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

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅{i}

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

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅

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

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

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

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛={𝑖 }

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

Def i

if(something)

i=0i=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

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

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

Def i

if(something)

nothingi=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

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

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

Def i

if(something)

nothingi=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡=∅

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

Indi =

fdi =

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

Def i

if(true)

nothingi=1

def j;j = i;

𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡=∅

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡={𝑖 }

𝐼𝑛=∅𝑂𝑢𝑡=∅

true false

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

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

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

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

def i

while (something)

i=0

nothing

𝐼𝑁=∅

𝑂𝑢𝑡=∅𝐼𝑁=∅

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

def i

while (something)

i=0

nothing

𝐼𝑁=∅

𝑂𝑢𝑡=∅𝐼𝑁=∅

𝑂𝑢𝑡=∅

𝐼𝑁=∅

{i}

𝐼𝑁=∅

𝑂𝑢𝑡=∅

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { j }

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { j }

fin { i }

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { j }

fin { i }

fin { i }

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { j }

{i,j}

{I,j}

𝐼𝑁={ 𝑗 }

{i,j}

fin { i }

fin { i }

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

def idef 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 idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{}

{}

{ }

{}

{}

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{, i}

{}

{ }

{}

{}

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{, i}

{, i}

{ }

{}

{}

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { }

{}

{, i}

{, i}

{ }

{}

{}

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

def idef 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());

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁=∅ { j }

{}

{}

{}

{ i }

{i,j}

{I,j}

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

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁={∅ }

{ i }

{}

{}

{}

{ }

{}

{}

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

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

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁={∅ }

{ i }

{}

{i}

{}

{ }

{}

{}

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

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

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁={∅ }

{ i }

{}

{i}

{}

{ }

{}

{}

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

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

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

def idef j = 1

while (something)

i=0

nothing

𝐼𝑁={∅ }

{ i }

{}

{i}

{}

{ }

{}

{}

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

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