основы и применение статического анализа кода при...
DESCRIPTION
Basics of static analysis lection 2TRANSCRIPT
Классический алгоритм статического анализа
потока данных
Граф потока управления
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 – множество возможно неинициализированных переменных
- объединение множеств