30
Виды статического анализа

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

  • Upload
    m2rus

  • View
    229

  • Download
    3

Embed Size (px)

Citation preview

Виды статического анализа

Достигающие определения (reaching definition)• Достигающее определение (reaching definition) для данного оператора A – это

оператор B, в котором изменяется значение некоторой переменной х и существует путь из A в B, при котором отсутствует присвоение значений переменной x.

• int i = 0;• while (i)• {

• i ++;• i = i;• Null;

• }• Null;

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

• - подмножество множества всех переменных

S

Анализ жизни переменных (liveness analysis)• Переменная жива, если в ней находится значение, которое может

понадобиться далее по ходу выполнения программы.

• int i = 0;• while (i)• {

• i ++;• i = i;• Null;

• }• Null;

Обратный анализ

• - множество переменных в операторе S, которые используются до присвоения

• - множество переменных в операторе S, которым присваивается значение

Инициализированность переменных (Definite assignment analysis)Анализ используется для поиска переменных, значения которых используются до присвоения.Анализ входит в стандарты языков Java и C#.

int i; if (j < 0) return; else i = j; print(i);

• Any expression or statement e that does not affect the set of variables definitely assigned: after(e) = before(e)

• Let e be the assignment expression loc = v. Then before(v) = before(e), and after(e) = after(v) U {loc}.

• Let e be the expression true. Then true(e) = before(e) and false(e) = vars(e). In other words, if e evaluates to false, all variables are (vacuously) definitely assigned, because e does not evaluate to false.

• Since method arguments are evaluated left to right, before(argi + 1) = after(argi). After a method completes, out parameters are definitely assigned.

• Let s be the conditional statement if (e) s1 else s2. Then before(e) = before(s), before(s1) = true(e), before(s2) = false(e), and after(s) = after(s1) intersect after(s2).

• Let s be the while loop statement while (e) s1. Then before(e) = before(s), before(s1) = true(e), and after(s) = false(e).

• And so on.

- Пересечение множеств переменных

- "Standard ECMA-334, C# Language Specification". ECMA International. pp. Section 12.3 (pp.122–133). Retrieved December 2, 2008.-http://www.ecma-international.org/publications/standards/Ecma-334.htm

Available expression

Анализ направлен для определения для каждой точки программы множества выражений, не требующих перевычисления

Сonstant propagation (распространение констант)

int a = 30; int b = 9 - (a / 5); int c; c = b * 4;

if (c > 10) { c = c - 10; }

return c * (60 / a);

return 4;

Для каждой точки программы определяет переменные, имеющие константные значения.

Copy propagation

y = x z = 3 + y

z = 3 + x

Для каждой точки программы определяет переменные, значения которых совпадают со значениями других переменных

Points-to analysis (pointer analysis)

int x; int y; int* p = unknown() ? &x : &y;

Для каждой точки программы определение для всех указателей переменных (участков памяти), на которые они могут указывать.

Andersen’s algorithm

• Сложность – );• Andersen, Lars Ole (1994).

Program Analysis and Specialization for the C Programming Language (PhD thesis).

while(something()){

list.next = new List();list = list.next;a[i++] = malloc(1);

a[i++] = malloc(2); }

Steensgaard’s algorithm

• Bjarne Steensgaard (1996). "Points-to analysis in almost linear time". "POPL '96: Proceedings of the 23rd ACM SIGPLAN-SIGACT symposium on Principles of programming languages". ACM. pp. 32–41. ISBN 0-89791-769-3.

Alias analysis (анализ псевдонимов)Два указателя являются псемданимами, если они могут указывать на один и тот же участок памяти.

Escape analysis (анализ выходов)

Анализ переменных, значения которых доступны после выхода из функции.

Shape analysis

Алгоритмы проверки свойств структур данных, генерируемых в куче.

Shape analysis

• Mooly Sagiv; Thomas Reps, Reinhard Wilhelm (May 2002). "Parametric shape analysis via 3-valued logic". ACM Transactions on Programming Languages and Systems (TOPLAS) (ACM) 24 (3): 217–298. doi:10.1145/292540.292552.

Bounds analysis (анализ границ)

Анализ границ, в пределах которых находятся значения переменных.

char c[100];int i=0;for(; i<100; i++)

c[i] = 1;c[i] = 2;

char *c = malloc(100);int i=0;for(; i<100; i++)

c[i] = 1;c[i] = 2;

Array c;

for(int j=0; j<100; j++)c.Add(1);

int i=0;for(; i<100; i++)

c[i] = 1;c[i] = 2;

Array c;

for(int j=0; j<file.Read(4); j++)c.Add(1);

int i=0;for(; i<100; i++)

c[i] = 1;c[i] = 2;

Анализ инвариантов