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?