Aufgaben

Werbung
Programmanalysen und Compilerbau
Wintersemester 2016/17
Felix Krause
Aufgabenblatt 7
Aufgabe 7.1
Gegeben sei das folgende C-Programm:
1
2
3
4
int g = 5;
int add (int a, int b) {
return a + b;
}
5
6
7
8
void f (int x, int *p) {
int t = add (g, x);
*p = t;
}
9
10
11
12
13
14
int main () {
int i = 1;
int j = 2;
f (j, &i);
return add (i, j);
}
a. Konstruieren Sie zu allen Funktionen des gegebenen Programms jeweils einen intraprozeduralen Programmabhängigkeitsgraphen (PDG). Jede Anweisung soll dabei durch einen PDGKnoten abgebildet werden. Die aus Funktionsaufrufen indirekt resultierenden Datenabhängigkeiten sind zunächst zu vernachlässigen.
b. Verbinden Sie nun die einzelnen PDGs zu einem interprozeduralen SDG. Bringen Sie dabei
insbesondere auch die Parameterübergaben und Seiteneffekte zum Ausdruck.
c. Berechnen Sie die Summary-Edges der Funktionen und prägen Sie diese als kontextsensitive
Datenabhängigkeiten bei den Funktionsaufrufen aus.
d. Konstruieren Sie einen interprozeduralen Forward-Slice, ausgehend von der Anweisung in
Zeile 1.
e. Konstruieren Sie einen interprozeduralen Backward-Slice, ausgehend von der Anweisung in
Zeile 15.
Aufgabe 7.2
Gegeben sei folgendes Java-Programm:
1
2
3
4
class A {
public int m1 (A p) {
return a1 + p.a1;
}
5
6
}
7
8
9
10
class B extends A {
public int m2 (B p) {
return b1 + p.b1;
}
11
12
}
13
14
15
16
17
class C extends B {
public int m3 (C p) {
return p.b1 + b1;
}
}
protected int a1;
protected int b1;
Es sollen mit dem token-basierten Verfahren von Baker Quelltext-Klone in diesem Programm gesucht
werden.
a. Konstruieren Sie P-Strings zu allen nicht-leeren Quelltextzeilen des gegebenen Programms.
b. Geben Sie zu allen Suffixen 𝑆𝑖 der Konkatenation 𝑆 der P-Strings die Kodierung 𝑝𝑟𝑒𝑣(𝑆𝑖 ) an.
c. Konstruieren Sie den P-Suffix-Baum von 𝑆, indem Sie inkrementell alle 𝑝𝑟𝑒𝑣(𝑆𝑖 ) in einen zu
Beginn leeren Baum einfügen.
d. Welche Aussagen über Quelltext-Klone kann man dem nun vorliegenden P-Suffix-Baum entnehmen?
Herunterladen