Inter-Prozedurale
Zeigeranalyse
Skalierung durch Deklarativität
➊ Nutzen, Einsatzgebiete, Beispiele
➋ Intra- und kontext-s...
➊
Warum Zeigeranalyse?
Nutzen, Einsatzgebiete, Beispiele
Was ist das?
Zeigeranalyse
Was ist das?
Zeiger
class
IntObj
{




public
int
value;
}
public
class
Binky()
{




public
static
void
main(String[]
args)
{








IntObj
...
Vorlesung Compilerbau,Wintersemester 2008/09
Definition„Zeigeranalyse“
Einfach? Man schaue sich die letzte Zuweisung an …
7...
Vorlesung Compilerbau,Wintersemester 2008/09
Definition„Zeigeranalyse“
Zeigeranalyse: worauf zeigen die Zeiger eines Progra...
Vorlesung Compilerbau,Wintersemester 2008/09
Einsatz: Methodenaufruf
Methodenaufruf in OO-Programmen: Java, C++ (nur virtu...
Vorlesung Compilerbau,Wintersemester 2008/09
Einsatz: Alias-Analyse
Zeigeralias verbreitet in C, C++, Java
Zeiger verweise...
Vorlesung Compilerbau,Wintersemester 2008/09
Einsatz: Fehlererkennung
Ziel: Auffinden von„verdächtigen“ Codefragmenten
Zugri...
Vorlesung Compilerbau,Wintersemester 2008/09
Einsatz: SQL Injection
„Schmutzige“ (tainted) Verwendung von Eingaben in SQL ...
Vorlesung Compilerbau,Wintersemester 2008/09
Einsatz: Pufferüberlauf
Problem: Eingaben (oder Ergebnisse), die Pufferplatz üb...
➊
Warum Zeigeranalyse?
Nutzen, Einsatzgebiete, Beispiele
➋
Von Programmen zu Analysen
Intra- und Interprozedural
Vorlesung Compilerbau,Wintersemester 2008/09
Intra-Prozedurale Analyse
Intra-Prozedural: innerhalb einer Prozedur
keine Au...
Vorlesung Compilerbau,Wintersemester 2008/09
Aufrufgraphen
Inter-Prozedural: auch Datenfluß zwischen mehreren Prozeduren
Te...
Vorlesung Compilerbau,Wintersemester 2008/09
Beispiel Aufrufgraph
18
Name + Signatur
 class
A
{

 

A
val;

 

int
f(A
a){...
Vorlesung Compilerbau,Wintersemester 2008/09
Kontext-Sensitive Analyse
mehrere Aufrufe der gleichen Funktion
unterschiedli...
Vorlesung Compilerbau,Wintersemester 2008/09
Kontext-Sensitive Analyse
Idee:„Klonen“
20
➁ Interprozedurale, kontext-sensit...
Vorlesung Compilerbau,Wintersemester 2008/09
Kontext-Sensitive Analyse
Problem 1: Rekursive Prozeduren / Funktionen
Lösung...
Vorlesung Compilerbau,Wintersemester 2008/09
Kontext-Sensitive Analyse durch Klonen
Problem 2: Exponentielle Explosion des...
Vorlesung Compilerbau,Wintersemester 2008/09
Kontext-Sensitive Analyse durch Klonen
Anzahl der Klone in Top 20 Java Progra...
Vorlesung Compilerbau,Wintersemester 2008/09
Kontext-Sensitive Analyse durch Klonen
Hoffnungslos? – typisches Program ~1014...
➋
Von Programmen zu Analysen
Intra- und Interprozedural
➌
Skalierung durch
Binary Decision Diagrams
Vorlesung Compilerbau,Wintersemester 2008/09
Aufrufgraph als boolesche Funktion
Aufrufgraph repräsentiert als Relation:
ca...
Vorlesung Compilerbau,Wintersemester 2008/09
Binary Decision Diagrams (Beispiel)
28
➂ Skalierung durch Binary Decision Dia...
Vorlesung Compilerbau,Wintersemester 2008/09
!"#
!$#
!%# !%#
!$# !$# !$#
&# &# &# &# &# &# &#
!"#
!$#
!%# !%#
!$# !$# !$#
...
Vorlesung Compilerbau,Wintersemester 2008/09
Reduziertes BDD II (Beispiel)
30
➂ Skalierung durch Binary Decision Diagrams ...
Vorlesung Compilerbau,Wintersemester 2008/09
Reduziertes BDD III (Beispiel)
31
➂ Skalierung durch Binary Decision Diagrams...
Vorlesung Compilerbau,Wintersemester 2008/09
Reduziertes BDD IV (Beispiel)
Eliminierung von redundanten Knoten
1- und 0-Na...
Vorlesung Compilerbau,Wintersemester 2008/09
Reduziertes BDD V (Beispiel)
33
!"#
!$#
!"#
!$#
!%#
&#
!'#
'#
&#()*(#
'#()*(#...
Vorlesung Compilerbau,Wintersemester 2008/09
Geordnete, reduzierte BDDs (ROBDDs)
Binary Decision Diagram (BDD) :=
gerichte...
Vorlesung Compilerbau,Wintersemester 2008/09
Variablenordnung in BDDs
Problem: Größe & Form hängt von Reihenfolge der Vari...
Vorlesung Compilerbau,Wintersemester 2008/09
Variablenordnung in BDDs
36
➂ Skalierung durch Binary Decision Diagrams (BDDs...
Vorlesung Compilerbau,Wintersemester 2008/09
Variablenordnung in BDDs
Schlimmer:
Bestimmen der optimalen Variablenordnung ...
➌
Skalierung durch
Binary Decision Diagrams
➍
Deklarative Spezifikation mit
Datalog
Vorlesung Compilerbau,Wintersemester 2008/09
Manuelle Zeigeranalyse mit BDDs
Implementierung komplex, fehleranfällig, schw...
Vorlesung Compilerbau,Wintersemester 2008/09
Spezifikationssprache: Datalog
Datalog: (rekursive) Logik über Relationen mit ...
Vorlesung Compilerbau,Wintersemester 2008/09
Extraktion von Fakten
Zurück zum Beispielprogram (intra-prozedural):
42
o1:
p...
Vorlesung Compilerbau,Wintersemester 2008/09
Zeiger zwischen Heapobjekten
Ableitbar aus Belegung von Objektvariablen (vPoi...
Vorlesung Compilerbau,Wintersemester 2008/09
Zugriff auf Heapzeiger
Ableitbar aus Belegung von Objektvariablen (vPointsTo) ...
Vorlesung Compilerbau,Wintersemester 2008/09
Alias-Auflösung
Ableitbar aus Belegung von Objektvariablen (vPointsTo) &
Heapz...
Vorlesung Compilerbau,Wintersemester 2008/09
Vollständiger Analysalgorithmus
Das wars … damit haben wir einen Zeigeranalys...
Vorlesung Compilerbau,Wintersemester 2008/09
Gleich schnell?
Übersetzung der Datalog Spezifikation in BDDs
Datalog → relati...
Vorlesung Compilerbau,Wintersemester 2008/09
Gleich schnell?
48
➃ Deklarative Spezifikation mit Datalog
Optimierungsstufen
Vorlesung Compilerbau,Wintersemester 2008/09
Gleich schnell?
49
➃ Deklarative Spezifikation mit Datalog
Vorlesung Compilerbau,Wintersemester 2008/09
Gleich schnell?
50
➃ Deklarative Spezifikation mit Datalog
➍
Deklarative Spezifikation mit
Datalog
Fragen?
Vorlesung Compilerbau,Wintersemester 2008/09
Literatur zur Interprozeduralen Zeigeranalyse
Basiswissen:
Aho, Lam, Sethi, U...
Inter Prozedurale Zeigeranalyse
Nächste SlideShare
Wird geladen in …5
×

Inter Prozedurale Zeigeranalyse

588 Aufrufe

Veröffentlicht am

Veröffentlicht in: Bildung
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
588
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
6
Aktionen
Geteilt
0
Downloads
2
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

Inter Prozedurale Zeigeranalyse

  1. 1. Inter-Prozedurale Zeigeranalyse Skalierung durch Deklarativität ➊ Nutzen, Einsatzgebiete, Beispiele ➋ Intra- und kontext-sensitive interprozedurale Zeigeranalyse ➌ Skalierung durch Binary Decision Diagrams (BDDs) ➍ Deklarative Spezifikation mit Datalog ➎ Tools: bddbddb Tim Furche (Folien basieren auf PDLI-Tutorial von J. Whaley) !"# !$# !"# !$# !%# &# !'# '#
  2. 2. ➊ Warum Zeigeranalyse? Nutzen, Einsatzgebiete, Beispiele
  3. 3. Was ist das? Zeigeranalyse
  4. 4. Was ist das? Zeiger
  5. 5. class
IntObj
{ 



public
int
value; } public
class
Binky()
{ 



public
static
void
main(String[]
args)
{ 







IntObj

x;

//
Allocate
the
pointers
x
and
y 







IntObj

y;

//
(but
not
the
IntObj
pointees) 







 







x
=
new
IntObj();


//
Allocate
an
IntObj
pointee 



























//
and
set
x
to
point
to
it 







 







x.value
=
42;


//
Dereference
x
to
store
42
in
its
pointee 







 







y.value
=
13;


//
CRASH
‐‐
y
does
not
have
a
pointee
yet 







 







y
=
x;

//
Pointer
assignment
sets
y
to
point
to
x's
pointee 







 







y.value
=
13;


//
Deference
y
to
store
13
in
its
(shared)
pointee 



} }



  6. 6. Vorlesung Compilerbau,Wintersemester 2008/09 Definition„Zeigeranalyse“ Einfach? Man schaue sich die letzte Zuweisung an … 7 ➀ Zeigeranalyse: Nutzen, Einsatzgebiete, Beispiele ❛❛Worauf zeigt ein Zeiger/Objektvariable? p
=
q; r
=
p.val; p
=
q; r
=
p.f(); ...
f(){return
this.val} p
=
q; r
=
p.f(p); ...
f(){if
p.equals(“Caesar”)
 










return
p
 







else
 










return
this.val} Alias Inter-Prozedural Kontext-sensitiv Unentscheidbar (im allgemeinen) nicht approximierbar mit beschränktem Qualitätsverlust lange keine skalierbaren Algorithmen für (kontext-sensitive) Zeigeranalyse
  7. 7. Vorlesung Compilerbau,Wintersemester 2008/09 Definition„Zeigeranalyse“ Zeigeranalyse: worauf zeigen die Zeiger eines Programs kontext-sensitiv – berücksichtigt unterschiedliche Aufrufkontexte Unifikations-basiert vs. Inklusions-basiert 8 ➀ Zeigeranalyse: Nutzen, Einsatzgebiete, Beispiele n
=
f(o); m
=
f(p); ...
f(i){return
i}; !" #" $" %" !" #" $" %" kontext-insensitiv kontext-sensitiv n
=
o; m
=
p; m
=
q; n
=
m; !" #" $" %" %" !" #" $" %" %" Unifikations-basiert Inklusions-basiert
  8. 8. Vorlesung Compilerbau,Wintersemester 2008/09 Einsatz: Methodenaufruf Methodenaufruf in OO-Programmen: Java, C++ (nur virtual) Zeigeranalyse: liefert präzisen Typ des Objekts hier: o Typ T, sein präziser Typ ist T2 falls Typ eindeutig: unbedingter Sprung zur Methode hier: Sprung zum Code von m in T2 Ersparnis: Analyse des Typs von o zur Laufzeit & Verwendung der Methodentabelle wichtiger Bestandteil in Compilern für C++, Java (insbes. auch JIT) 9 ➀ Zeigeranalyse: Nutzen, Einsatzgebiete, Beispiele T
o
=
new
T1(); o
=
l.transform(o); o.m(); T
l(T
o){return
new
T2()}
  9. 9. Vorlesung Compilerbau,Wintersemester 2008/09 Einsatz: Alias-Analyse Zeigeralias verbreitet in C, C++, Java Zeiger verweisen auf das gleiche (Heap-) Objekt Änderungen an dem Objekt betreffen Wert alle beteiligten Zeiger Erkennung von Zeigeralias nötig, z.B., für Propagation von Konstantenwerten (u.U. sogar Einsparen von Variablen) über Zeiger statische Berechnung von Sprungadressen (bei Verwendung von Funktionszeigern) 10 ➀ Zeigeranalyse: Nutzen, Einsatzgebiete, Beispiele p.val
=
1; q.val
=
2; x
=
p.val; q
=
new
Value(); p
=
q; q
=
new
Value(); p
=
new
Value(); x
=
2 x
=
1 p Alias von q
  10. 10. Vorlesung Compilerbau,Wintersemester 2008/09 Einsatz: Fehlererkennung Ziel: Auffinden von„verdächtigen“ Codefragmenten Zugriff auf bereits freigegebenen Speicher → Aliasanalyse „schmutzige“ Verwendung von Eingaben → z.B. SQL Injection Pufferüberlauf beim Zugriff auf Arrays → dynamische Bereichstests aber: verhältnismäßig teuer → statische Analyse zur Minimierung der Bereichstests 11 ➀ Zeigeranalyse: Nutzen, Einsatzgebiete, Beispiele q
=
new
Value(); p
=
q; delete
p; delete
q;
  11. 11. Vorlesung Compilerbau,Wintersemester 2008/09 Einsatz: SQL Injection „Schmutzige“ (tainted) Verwendung von Eingaben in SQL Anfragen Benutzereingabe (z.B. aus Webformular) wird direkt verwendet zur Konstruktion von eingebetteten Datenbankanfragen (z.B. über JDBC) z.B. Variablen $n und $p für Benutzername und Passwort 12 ➀ Zeigeranalyse: Nutzen, Einsatzgebiete, Beispiele SELECT
balance
FROM
Account WHERE
name
=
‘$n’
and
password
=
‘$p’ SELECT
balance
FROM
Account WHERE
name
=
‘Julius
Caesar’
‐‐’
and
password
=
‘...’ Angreifer: als Benutzername einen Ausdruck mit Symbolen oder Wörtern, die in SQL spezielle Bedeutung haben z.B. Kommentarzeichen‘‐‐’
  12. 12. Vorlesung Compilerbau,Wintersemester 2008/09 Einsatz: Pufferüberlauf Problem: Eingaben (oder Ergebnisse), die Pufferplatz überschreiten typisch: String als Zeichen-Array mit fixer Größe k, Eingabe > k Lösung: dynamische Überprüfung der Puffer/Array Grenzen in Java automatisch durch Compiler garantiert Problem: naives Einfügen bei allen Arrayzugriffen sehr teuer Lösung: Zeigeranalyse, um festzustellen, wo Überlauf möglich z.B. bei Benutzereingaben, nicht begrenzten Schleifen, etc. 13 ➀ Zeigeranalyse: Nutzen, Einsatzgebiete, Beispiele
  13. 13. ➊ Warum Zeigeranalyse? Nutzen, Einsatzgebiete, Beispiele
  14. 14. ➋ Von Programmen zu Analysen Intra- und Interprozedural
  15. 15. Vorlesung Compilerbau,Wintersemester 2008/09 Intra-Prozedurale Analyse Intra-Prozedural: innerhalb einer Prozedur keine Aufrufe anderer Prozeduren / Methoden / etc. Pointer- bzw. Objektvariablen zeigen auf Heap-Objekte; liegen auf Stack Heap-Zeiger zeigen auf andere Heap-Objekte 16 o1:
p


=
new
A(); o2:
q


=
new
A(); 
 p.f
=
q; 
 r


=
p.f; 
 s


=
r; !" #$" %" #&" '" (" )" ➁ Interprozedurale, kontext-sensitive Zeigeranalyse Heap-Objekt Objektvariable
  16. 16. Vorlesung Compilerbau,Wintersemester 2008/09 Aufrufgraphen Inter-Prozedural: auch Datenfluß zwischen mehreren Prozeduren Technik: Aufrufgraph aufstellen Aufrufgraph := Graph (N, E) für ein Programm P, so dass es für jede Prozedur p in P einen Knoten np ∈ N gibt es für jeden Aufrufpunkt c in P einen Knoten nc ∈ N gibt falls ein Aufrufpunkt c eine Prozedur p aufrufen kann gibt es eine Kante von nc nach np 17 ➁ Interprozedurale, kontext-sensitive Zeigeranalyse
  17. 17. Vorlesung Compilerbau,Wintersemester 2008/09 Beispiel Aufrufgraph 18 Name + Signatur
 class
A
{ 
 

A
val; 
 

int
f(A
a){return
1} 
 

A
f(A
a)
{ c1:




return
a.f(val);
 
 

} 
 

static
void
main()
{
 
 



val
=
new
B(); 
 



val.val
=
this; c2:




val.f(new
A());
 
 

} 
 } 
 class
B
extends
A
{ 
 

A
f(A
a){ c3:




return
val.f(a);
 
 

} 
 } ➁ Interprozedurale, kontext-sensitive Zeigeranalyse !"#$% !"#$ !"#$ %"#$ &'$ &($ &)$ ! *+, + Intra + Inter
  18. 18. Vorlesung Compilerbau,Wintersemester 2008/09 Kontext-Sensitive Analyse mehrere Aufrufe der gleichen Funktion unterschiedliche Parameter (u.a. Kontexte) kontext-insensitive Analyse kann Parameter nicht propagieren bei mehreren Aufrufen der gleichen Funktion einfach & billig zu realisieren (Aufrufgraph) kontext-sensitive Analyse präziser, hier z.B. Eliminierung der Aufrufe durch Parameterpropag.: X[i]
=
16; bis 2004: kein„präziser“, sklalierbarer Alg. 19 ➁ Interprozedurale, kontext-sensitive Zeigeranalyse 
 for(i=0;
i<1012;
i++)
{ c1:


t1
=
g(0); c2:


t2
=
g(4); c3:


t3
=
g(9); 
 

X[i]
=
t1+t2+t3; 
 } 
 int
g(int
v)
{ c4:


return
f(v); 
 } 
 int
f(int
v)
{ 
 

return
(v
+
1); 
 }
  19. 19. Vorlesung Compilerbau,Wintersemester 2008/09 Kontext-Sensitive Analyse Idee:„Klonen“ 20 ➁ Interprozedurale, kontext-sensitive Zeigeranalyse 
 for(i=0;
i<1012;
i++)
{ c1:


t1
=
g(0); c2:


t2
=
g(4); c3:


t3
=
g(9); 
 

X[i]
=
t1+t2+t3; 
 } 
 int
g(int
v)
{ c4:


return
f(v); 
 } 
 int
f(int
v)
{ 
 

return
(v
+
1); 
 } 
 for(i=0;
i<1012;
i++)
{ c1:
 

t1
=
g1(0); c2:
 

t2
=
g2(4); c3:
 

t3
=
g3(9); 
 

X[i]
=
t1+t2+t3; 
 } 
 int
g1(int
v)
{ c4.1:


return
f1(v);
} 
 int
g2(int
v)
{ c4.2:


return
f2(v);
} 
 int
g3(int
v)
{ c4.3:


return
f3(v);
} 
 int
f1(int
v)
{ 
 

return
(v
+
1);} 
 int
f2(int
v)
{ 
 

return
(v
+
1);} 
 int
f3(int
v)
{ 
 

return
(v
+
1);}
  20. 20. Vorlesung Compilerbau,Wintersemester 2008/09 Kontext-Sensitive Analyse Problem 1: Rekursive Prozeduren / Funktionen Lösung: stark-verbundenen Zusammenhangskomponenten kollabieren 21 A! G! B! C! D! E! F! A! G! B! C! D! E! F! E! F! E! F! G! G! ➁ Interprozedurale, kontext-sensitive Zeigeranalyse
  21. 21. Vorlesung Compilerbau,Wintersemester 2008/09 Kontext-Sensitive Analyse durch Klonen Problem 2: Exponentielle Explosion des Aufrufgraphen 22 ➁ Interprozedurale, kontext-sensitive Zeigeranalyse
  22. 22. Vorlesung Compilerbau,Wintersemester 2008/09 Kontext-Sensitive Analyse durch Klonen Anzahl der Klone in Top 20 Java Programmen auf Sourceforge: 23 ➁ Interprozedurale, kontext-sensitive Zeigeranalyse
  23. 23. Vorlesung Compilerbau,Wintersemester 2008/09 Kontext-Sensitive Analyse durch Klonen Hoffnungslos? – typisches Program ~1014 Pfade, nur 1 Byte pro Klon 256 TBi Speicher > 12fache der Größe der“Library of Congress” so viel Speicher verbraucht so viel Energie wie ~120 Haushalte Sequentielles Lesen von Festplatte: ~70 Tage Trotzdem: Es geht mit folgender Beobachtung: Viele der Pfade sind weitgehend identisch, Kontexte sehr ähnlich Datenstruktur, die die hoch-redundante Aufrufgraph Relation kompakt kompakt (“exponentially more succinct”) darstellen kann Lösung: Binary Decision Diagram (Binäre Entscheidungsdiagramm) 24 ➁ Interprozedurale, kontext-sensitive Zeigeranalyse
  24. 24. ➋ Von Programmen zu Analysen Intra- und Interprozedural
  25. 25. ➌ Skalierung durch Binary Decision Diagrams
  26. 26. Vorlesung Compilerbau,Wintersemester 2008/09 Aufrufgraph als boolesche Funktion Aufrufgraph repräsentiert als Relation: calls(A,B), calls(A,C), calls(A,D), calls(B,D), calls(C,D) Relation repräsentiert als boolesche Funktion A = 00, B = 01, C = 10, D = 11 (Aufzählung der Domain) 27 ➂ Skalierung durch Binary Decision Diagrams (BDDs) B D C A !"#$% &#% !"# !$# !%# !&# '# (# (# (# (# (# (# (# (# "# "# (# (# "# (# "# (# (# "# "# "# (# "# (# (# (# (# "# (# "# (# (# "# "# (# (# (# "# "# "# "# "# (# (# (# (# "# (# (# "# (# "# (# "# (# (# "# (# "# "# "# "# "# (# (# (# "# "# (# "# (# "# "# "# (# (# "# "# "# "# (# B D C A 00 1001 11
  27. 27. Vorlesung Compilerbau,Wintersemester 2008/09 Binary Decision Diagrams (Beispiel) 28 ➂ Skalierung durch Binary Decision Diagrams (BDDs) !"#$% &#% !"# !$# !%# !&# '# (# (# (# (# (# (# (# (# "# "# (# (# "# (# "# (# (# "# "# "# (# "# (# (# (# (# "# (# "# (# (# "# "# (# (# (# "# "# "# "# "# (# (# (# (# "# (# (# "# (# "# (# "# (# (# "# (# "# "# "# "# "# (# (# (# "# "# (# "# (# "# "# "# (# (# "# "# "# "# (# !"# !$# !%# !%# !$# !$# !$# &# &# &# '# &# &# &# &# !"# !$# !%# !%# !$# !$# !$# &# '# '# '# &# &# &# '# !'# !"#$%&'" ("#$%&'"
  28. 28. Vorlesung Compilerbau,Wintersemester 2008/09 !"# !$# !%# !%# !$# !$# !$# &# &# &# &# &# &# &# !"# !$# !%# !%# !$# !$# !$# &# &# &# &# !'# '#'# '# '# '# &#()*+,# '#()*+,# Reduziertes BDD (Beispiel) Eliminierung von nicht-eindeutigen Knoten gleiche Variable & gleiche 1- und 0-Nachfolger 29 ➂ Skalierung durch Binary Decision Diagrams (BDDs)
  29. 29. Vorlesung Compilerbau,Wintersemester 2008/09 Reduziertes BDD II (Beispiel) 30 ➂ Skalierung durch Binary Decision Diagrams (BDDs) !"# !$# !%# !%# !$# !$# !$# !"# !$# !%# !%# !$# !$# !$# &# !'# '# &#()*(# '#()*(#
  30. 30. Vorlesung Compilerbau,Wintersemester 2008/09 Reduziertes BDD III (Beispiel) 31 ➂ Skalierung durch Binary Decision Diagrams (BDDs) !"# !$# !%# !%# !"# !%# !%# !$# !$# &# !'# '# &#()*(# '#()*(#
  31. 31. Vorlesung Compilerbau,Wintersemester 2008/09 Reduziertes BDD IV (Beispiel) Eliminierung von redundanten Knoten 1- und 0-Nachfolger selber Knoten 32 !"# !$# !%# !%# !"# !%# !$# !$# &# !'# '# &#()*(# '#()*(# ➂ Skalierung durch Binary Decision Diagrams (BDDs)
  32. 32. Vorlesung Compilerbau,Wintersemester 2008/09 Reduziertes BDD V (Beispiel) 33 !"# !$# !"# !$# !%# &# !'# '# &#()*(# '#()*(# ➂ Skalierung durch Binary Decision Diagrams (BDDs)
  33. 33. Vorlesung Compilerbau,Wintersemester 2008/09 Geordnete, reduzierte BDDs (ROBDDs) Binary Decision Diagram (BDD) := gerichteter, azyklischer Graph mit Wurzel bestehend aus einer oder zwei Blättern (keine ausgehenden Kanten), die mit 0 bzw. 1 gelabelt sind; jeder andere Knoten ist ein Variablenknoten u mit genau 2 ausgehenden Kanten low(u) und high(u) und einer Variablen var(u) als Label Geordnetes BDD := auf allen Pfaden von der Wurzel kommen Variablen in gleicher Ordnung vor Reduziertes BDD := unique – var(u) = var(v) ∧ low(u) = low(v) ∧ high(u) = high(v) u = v non-redundant – ∀ u: low(u) ≠ high(u) 34 ➂ Skalierung durch Binary Decision Diagrams (BDDs)
  34. 34. Vorlesung Compilerbau,Wintersemester 2008/09 Variablenordnung in BDDs Problem: Größe & Form hängt von Reihenfolge der Variablen ab 35 ➂ Skalierung durch Binary Decision Diagrams (BDDs) !"# !$# !%# &# "# !'# !"# !$# !%# &# "# !'# !$# !'# x1 ∧ x2 ∨ x3 ∧ x4 x1 < x2 < x3 < x4 x1 < x3 < x2 < x4
  35. 35. Vorlesung Compilerbau,Wintersemester 2008/09 Variablenordnung in BDDs 36 ➂ Skalierung durch Binary Decision Diagrams (BDDs) x1 x3 0 x3 1 x5 0 x5 1 x5 0 x5 1 x7 0 x7 1 x7 0 x7 1 x7 0 x7 1 x7 0 x7 1 x8 1 0 0 x6 0 x6 1 x4 0 x4 1 x4 0 x4 1x2 0 x2 1 x2 0 x2 1 x2 0 x2 1 x2 0 x2 1 1 10 0 1 0 1 0 1 0 1 0 1 0 1 0 1 10 0 1 0 1 0 1 10 0 1 10 x1 x2 1 x3 0 0 1 1 x4 1 x5 0 0 1 x6 1 x7 0 0 1 x8 1 0 0 1 0 Gleiche Funktion:
  36. 36. Vorlesung Compilerbau,Wintersemester 2008/09 Variablenordnung in BDDs Schlimmer: Bestimmen der optimalen Variablenordnung für eine gegebene boolesche Funktion ist NP-vollständig Bestimmen selbst einer um einen konstanten Faktor c > 1 schlechteren Ordnung ist noch NP-vollständig (also APX-hart) In der Praxis: Zahlreiche, effiziente Heuristiken große Zahl von BDD-Libraries → http://en.wikipedia.org/wiki/Binary_decision_diagram Kanonisches ROBDD zu jeder booleschen Funktion f(x1, …, xn) gibt es genau ein ROBDD mit Variablenordnung x1 < … < xn daher: effizienter Equivalenztest 37 ➂ Skalierung durch Binary Decision Diagrams (BDDs)
  37. 37. ➌ Skalierung durch Binary Decision Diagrams
  38. 38. ➍ Deklarative Spezifikation mit Datalog
  39. 39. Vorlesung Compilerbau,Wintersemester 2008/09 Manuelle Zeigeranalyse mit BDDs Implementierung komplex, fehleranfällig, schwer zu optimieren daher: deklarative Spezifikation, automatische Transformation in BDDs 40 ➃ Deklarative Spezifikation mit Datalog >50 Seiten, SAS 2002 ~ 15 Zeilen, PLDI 2004
  40. 40. Vorlesung Compilerbau,Wintersemester 2008/09 Spezifikationssprache: Datalog Datalog: (rekursive) Logik über Relationen mit endlicher Domain siehe zweiter Teil der Vorlesung, hier nur intuitive Behandlung Semantik: wenn Konjunktion der Atome im Rumpf war ist, dann auch Kopf Variablen entsprechend instantiiert, jede Var. im Kopf auch im Rumpf 41 ➃ Deklarative Spezifikation mit Datalog vPointsTo(q,
o). Assignment(p,
q). vPointsTo(V1,
O)
:‐
Assignment(V1,
V2),
 















 


vPointsTo(V2,
O).
 Prädikat- (Relations-) Symbol Fact Regel (Kopf :- Rumpf) keine Funktionssymbole; nur stratifizierte Negation
  41. 41. Vorlesung Compilerbau,Wintersemester 2008/09 Extraktion von Fakten Zurück zum Beispielprogram (intra-prozedural): 42 o1:
p


=
new
A(); o2:
q


=
new
A(); 
 p.f
=
q; 
 r


=
p.f; 
 s


=
r; !" #$" %" #&" '" (" )" vPointsTo(p,
o1). vPointsTo(q,
o2). Store(p,
f,
q). Load(p,
f,
r). Assign(s,
r). ➃ Deklarative Spezifikation mit Datalog Ziel:
  42. 42. Vorlesung Compilerbau,Wintersemester 2008/09 Zeiger zwischen Heapobjekten Ableitbar aus Belegung von Objektvariablen (vPointsTo) & Heapzuweisungen (Store) 43 ➃ Deklarative Spezifikation mit Datalog hPointsTo(Obj1,
Att,
Obj2)
 :‐
Store(Var1,
Att,
Var2), 
 
 
 
 
 
 
 
 
 vPointsTo(Var1,
Obj1), 

 
 
 
 
 
 
 
 
 vPointsTo(Var2,
Obj2). Store(p,
f,
q). vPointsTo(p,
o1). vPointsTo(q,
o2). !" #$" %" #&" !" ∧ → hPointsTo(o1,
f,
o2). wegen p.f
=
q;
  43. 43. Vorlesung Compilerbau,Wintersemester 2008/09 Zugriff auf Heapzeiger Ableitbar aus Belegung von Objektvariablen (vPointsTo) & Heapzeigern (hPointsTo) sowie Heapzugriffen (Load) 44 ➃ Deklarative Spezifikation mit Datalog vPointsTo(Var2,
Obj2)
:‐
Load(Var1,
Att,
Var2), 
 
 
 
 
 
 
 
 vPointsTo(Var1,
Obj1), 

 
 
 
 
 
 
 
 hPointsTo(Obj1,
Att,
Obj2). Load(p,
f,
r). vPointsTo(p,
o1). hPointsTo(o1,
f,
o2). ∧ → vPointsTo(r,
o2).!" #$" #%" &" !" wegen r
=
p.f;
  44. 44. Vorlesung Compilerbau,Wintersemester 2008/09 Alias-Auflösung Ableitbar aus Belegung von Objektvariablen (vPointsTo) & Heapzuweisungen (Store) 45 ➃ Deklarative Spezifikation mit Datalog vPointsTo(Var1,
Obj)
 :‐
Assign(Var1,
Var2), 
 
 
 
 
 
 
 
 vPointsTo(Var2,
Obj). Assign(s,r).vPointsTo(r,
o2). ∧ → vPointsTo(s,
o2). wegen s
=
r; !" #$" %" #&" '" (" !"
  45. 45. Vorlesung Compilerbau,Wintersemester 2008/09 Vollständiger Analysalgorithmus Das wars … damit haben wir einen Zeigeranalysalgorithmus der schneller oder gleich-schnell wie manuelle Ansätze ist 46 ➃ Deklarative Spezifikation mit Datalog hPointsTo(Obj1,
Att,
Obj2)
 :‐
Store(Var1,
Att,
Var2), 
 
 
 
 
 
 
 
 
 
 
 
 vPointsTo(Var1,
Obj1), 

 
 
 
 
 
 
 
 
 
 
 
 vPointsTo(Var2,
Obj2).
 vPointsTo(Var2,
Obj2)

:‐


 Load(Var1,
Att,
Var2), 
 
 
 
 
 
 
 
 
 
 
 
 vPointsTo(Var1,
Obj1), 

 
 
 
 
 
 
 
 
 
 
 
 hPointsTo(Obj1,
Att,
Obj2). vPointsTo(Var1,
Obj)
:‐

 
 Assign(Var1,
Var2), 
 
 
 
 
 
 
 
 
 
 
 
 vPointsTo(Var2,
Obj).
  46. 46. Vorlesung Compilerbau,Wintersemester 2008/09 Gleich schnell? Übersetzung der Datalog Spezifikation in BDDs Datalog → relationale Algebra → BDDs → Domain-optimierte BDDs Details siehe: J. Whaley and M. S. Lam. Cloning-based context-sensitive pointer alias analysis using binary decision diagrams. In Proc. ACM Conf. on Programming Language Design and Implementation (PLDI), 2004. ACM. Implementiert in bddbddb Datalog Engine basierend auf BDDs http://bddbddb.sourceforge.net/ 47 ➃ Deklarative Spezifikation mit Datalog
  47. 47. Vorlesung Compilerbau,Wintersemester 2008/09 Gleich schnell? 48 ➃ Deklarative Spezifikation mit Datalog Optimierungsstufen
  48. 48. Vorlesung Compilerbau,Wintersemester 2008/09 Gleich schnell? 49 ➃ Deklarative Spezifikation mit Datalog
  49. 49. Vorlesung Compilerbau,Wintersemester 2008/09 Gleich schnell? 50 ➃ Deklarative Spezifikation mit Datalog
  50. 50. ➍ Deklarative Spezifikation mit Datalog
  51. 51. Fragen?
  52. 52. Vorlesung Compilerbau,Wintersemester 2008/09 Literatur zur Interprozeduralen Zeigeranalyse Basiswissen: Aho, Lam, Sethi, Ullman: “Compilers”, 2nd Edition, Kapitel 12 M. S. Lam, J. Whaley, V. B. Livshits, M. C. Martin, D. Avots, M. Carbin, and C. Unkel. Context-sensitive program analysis as database queries. In Proc. ACM Symp. on Principles of Database Systems (PODS), 2005. ACM. Weiterführende Literatur: V. T. Chakaravarthy and S. Horwitz. On the non-approximability of points-to analysis. Acta Inf., 38(8):587–598, 2002. J. Whaley and M. S. Lam. Cloning-based context-sensitive pointer alias analysis using binary decision diagrams. In Proc. ACM Conf. on Programming Language Design and Implementation (PLDI), 2004. ACM. 53 Fragen

×