1. Trang chủ
  2. » Công Nghệ Thông Tin

Digitale Hardware/ Software-Systeme- P20 doc

20 105 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 234,5 KB

Nội dung

374 7 Software-Verifikation Wird nun die Instruktion 1 aus Programm 1 und die Instruktion 3 aus Programm 2 symbolisch simuliert, erh ¨ alt man: E 1 := {b 0,1 ,b 0,2 ,tmp1 0,2 } E 2 := {c 0,1 ,c 0,2 ,tmp2 0,2 } E 3 := {a 0,1 ,b 0,1 + c 0,1 } E 4 := {a 0,2 ,tmp1 0,2 +tmp2 0,2 } Mit den ¨ Aquivalenzklassen E 1 und E 2 kann die ¨ Aquivalenz von E 3 und E 4 gezeigt werden. Aus diesem Grund werden ¨ Aquivalenzklassen E 3 und E 4 vereinigt: E 3  := {a 0,1 ,a 0,2 ,b 0,1 + c 0,1 ,tmp1 0,2 +tmp2 0,2 } Da dadurch a 0,1 und a 0,2 in der selben ¨ Aquivalenzklasse sind, sind die beiden Pro- gramme in der Tat ¨ aquivalent. ¨ Aquivalenzpr ¨ ufung mittels Programmabh ¨ angigkeitsgraphen F ¨ ur große C-Programme st ¨ oßt die symbolische Simulation schnell an ihre Grenzen. Aus diesem Grund bietet es sich an, zun ¨ achst diejenigen Stellen in den Program- men zu identifizieren, bei denen es sich lohnt die ¨ Aquivalenz bzw. Nicht ¨ aquiva- lenz von Variablen zu zeigen. Hierzu wird in [315] ein Verfahren vorgestellt, bei dem zun ¨ achst Unterschiede in den Quelltexten der C-Programme identifiziert wer- den. Diese Quelltext-Unterschiede definieren die sog. Verifikationsbereiche.Nurf ¨ ur die Verifikationsbereiche wird versucht, deren ¨ Aquivalenz zu zeigen. Ist dies nicht m ¨ oglich, wird versucht, den Verifikationsbereich zu erweitern. Gelingt auch dieses nicht, sind die Programme nicht ¨ aquivalent. Wird hingegen f ¨ ur alle Verifikationsbe- reiche gezeigt, dass diese ¨ aquivalent sind, so sind die beiden C-Programme ¨ aquiva- lent. Der gesamte Ablauf ist in Abb. 7.4 zu sehen. Es kann aufgrund von Optimierungen vorkommen, dass die beiden zu verglei- chenden Programme an manchen Stellen keine zeilenweise Korrespondenz zeigen, was f ¨ ur die im Folgenden vorgestellte Bestimmung der Verifikationsbereiche aller- dings notwendig ist. Wird dies bei der Bestimmung der Quelltext-Unterschiede fest- gestellt, werden in den Programmen neutrale Erweiterungen vorgenommen, also Er- weiterungen, die keinen Einfluss auf das Ergebnis der Verifikation haben: Handelt es sich bei einem festgestellten Unterschied um eine Zuweisung an die Variable x,so kann in dem Programm, das diese Zuweisung nicht enth ¨ alt, die Anweisung x := x hinzugef ¨ ugt werden. Dies wird an einem Beispiel verdeutlicht. Beispiel 7.1.7. Gegeben sind die beiden Ausschnitte aus zwei Programmen: Programm 1 Programm 2 1 x=a+c; x=a; 2 y=b-c; y=b-c; 3 x=x; x=x+c; Hierbei wurde in Programm 1 die dritte Zeile hinzugef ¨ ugt, um eine zeilenweise Kor- respondenz zwischen den Programmen zu schaffen. 7.1 Formale ¨ Aquivalenzpr ¨ ufung eingebetteter Software 375 Programm 1 Programm 2 Nein ¨ aquivalent? Ja Ja erweiterbar? Bereich Ja Nein Nein nicht ¨ aquivalent Programme ¨ aquivalent Bereichs- erweiterung symbolische Simulation Bestimung Quell- text-Unterschiede Unterschiede? Verifikationsbe- reichsbestimmung Abb. 7.4. ¨ Aquivalenzpr ¨ ufung von C-Programmen basierend auf Quelltext-Unterschieden [315] Fehlen in einem Programm Kontrollanweisungen, so kann es um diese Anwei- sung erweitert werden. In jedem der beiden folgenden Ausf ¨ uhrungszweige werden dann zum anderen Programm korrespondierende Zuweisungen von Variablen an sich selbst vorgenommen. Basierend auf den so erweiterten Programmen, k ¨ onnen nun die Verifikationsbereiche bestimmt werden. F ¨ ur die Bestimmung der Verifikationsbereiche bietet sich eine spezielle Da- tenstruktur an, der sog. Programmabh ¨ angigkeitsgraph (engl. Program Dependence Graph, PDG) [226]. Definition 7.1.1 (Programmabh ¨ angigkeitsgraph (PDG)). Ein Programmabh ¨ angig- keitsgraph (PDG) ist ein gerichteter Graph G P (V,E), wobei die Knoten v ∈ V Zu- weisungen oder Pr ¨ adikate von konditionalen Spr ¨ ungen repr ¨ asentieren. Es existiert 376 7 Software-Verifikation ein ausgezeichneter Startknoten v 0 ∈ V . Die Menge der Kanten E = V ×V ist bipar- titioniert, d. h. E = E C ∪ E D mit E C ∩ E D = ∅. Die Kontrollflusskanten e ∈ E C stellen Kontrollabh ¨ angigkeiten dar und sind mit dem Wert F oder T beschriftet. Kontrollflusskanten e =(v i ,v j ) ∈ E C beginnen entwe- der bei einem Knoten v i , der ein Pr ¨ adikat repr ¨ asentiert, oder dem ausgezeichneten Startknoten v i = v 0 . Eine Kontrollflusskante, die mit T (F) beschriftet ist, stellt den Kontrollfluss f ¨ ur den Fall dar, dass das Pr ¨ adikat, das durch v i repr ¨ asentiert ist, erf ¨ ullt (nicht erf ¨ ullt) ist. Die Datenflusskanten e ∈ E D stellen Datenabh ¨ angigkeiten dar. Eine Datenflusskante e =(v i ,v j ) zwischen Knoten v i und v j existiert genau dann, wenn: • In der Zuweisung, die durch v i repr ¨ asentiert wird, die Variable x geschrieben wird, • in der Anweisung, die durch v j repr ¨ asentiert wird, die Variable x gelesen wird und • ein Ausf ¨ uhrungspfad von v i nach v j existiert, d. h. ein Pfad im Kontrollflussgraph des Programms existiert, auf dem x nicht ein weiteres Mal geschrieben wird. Ein PDG kann zu einem Systemabh ¨ angigkeitsgraph (engl. System Dependence Graph, SDG) erweitert werden, in dem Funktionen und Prozeduren ebenfalls als PDG dargestellt werden und Kontroll- und Datenflusskanten die PDGs der Funktio- nen und Prozeduren geeignet mit dem Programmabh ¨ angigkeitsgraph des Programms verkn ¨ upft [226]. Beispiel 7.1.8. Gegeben ist das folgende C-Programm mit Eingaben f ¨ ur die Varia- blen x und y [315]: 1 if(x>=y) 2 z=x-y; 3 else 4 z = y -x; 5 return z; Der zugeh ¨ orige Programmabh ¨ angigkeitsgraph ist in Abb. 7.5 zu sehen. Kontroll- flusskanten sind gestrichelt dargestellt. Die Eingaben f ¨ ur x bzw. y sind x in bzw. y in. Mit Hilfe der PDGs und den Quelltext-Unterschieden zweier C-Programme las- sen sich nun die Verifikationsbereiche definieren. Ein Verifikationsbereich umfasst den Graphen, der durch die Knoten der PDGs, bei denen Unterschiede aufgetreten sind, induziert wird. F ¨ ur solche Verifikationsbereiche k ¨ onnen nun Eingabe- und Aus- gabevariablen definiert werden: • Eingabevariablen eines Verifikationsbereichs sind durch die in den Verifikations- bereich eingehende Datenflusskanten repr ¨ asentiert. • Ausgabevariablen eines Verifikationsbereichs sind durch die aus dem Verifikati- onsbereich ausgehende Datenflusskanten repr ¨ asentiert. Lediglich f ¨ ur die Ausgabevariablen des Verifikationsbereichs, die in beiden Pro- grammen vorkommen, muss ¨ Aquivalenz gezeigt werden. Kann f ¨ ur alle Ausgabe- variablen deren ¨ Aquivalenz gezeigt werden, so sind auch die beiden Programmab- schnitte des Verifikationsbereichs ¨ aquivalent. Kann die ¨ Aquivalenz allerdings nicht 7.1 Formale ¨ Aquivalenzpr ¨ ufung eingebetteter Software 377 TT T T F T return z z := y-x y:=y inx:=xin z := x-y x>=y Start Abb. 7.5. Programmabh ¨ angigkeitsgraph [226] gezeigt werden, so muss der Verifikationsbereich erweitert werden. Hierbei gibt es prinzipiell drei M ¨ oglichkeiten: 1. R ¨ uckw ¨ artserweiterung: Bei der R ¨ uckw ¨ artserweiterung wird ein Vorg ¨ angerkno- ten im PDG, der ¨ uber eine eingehende Datenflusskante verbunden ist, zu dem Verifikationsbereich hinzugenommen. Wenn verschiedene Zuweisungen f ¨ ur den Vo r g ¨ angerknoten auf unterschiedlichen Kontrollflusspfaden existieren, so m ¨ us- sen alle Knoten, die diese Zuweisungen repr ¨ asentieren, inklusive des kontrollie- renden Knoten mit dem zugeh ¨ origen Pr ¨ adikat, dem Verifikationsbereich zuge- ordnet werden. 2. Vor w ¨ artserweiterung ¨ uber eine Datenabh ¨ angigkeit: Hierbei wird ein direkter Nachfolgerknoten, der ¨ uber eine ausgehende Datenflusskante verbunden ist, zu dem Verifikationsbereich hinzugenommen. 3. Vor w ¨ artserweiterung ¨ uber eine Kontrollflusskante: Hierbei werden alle direkten Nachfolgerknoten, die ¨ uber eine ausgehende Kontrollflusskante eines Knoten im Verifikationsbereich verbunden sind, zu dem Verifikationsbereich hinzugenom- men. Die Frage, welche Erweiterung am sinnvollsten ist, h ¨ angt stark von dem gege- benen Programm ab. Allerdings lassen sich Terminierungskriterien spezifizieren, die eine weitere Erweiterung des Verifikationsbereichs ¨ uberfl ¨ ussig machen: • Falls die ¨ Aquivalenz der neu zugef ¨ ugten Knoten bereits gezeigt wurde, so ist eine R ¨ uckw ¨ artserweiterung nicht mehr sinnvoll. • Falls die zugef ¨ ugten Knoten den Anfang oder das Ende des Programms beschrei- ben, ist eine Erweiterung ¨ uber diese Knoten hinaus nicht m ¨ oglich. Der erste Fall trifft auch f ¨ ur Eingabevariablen des Verifikationsbereichs zu. Zwei Eingabevariablen sind ¨ aquivalent, wenn diese nicht von anderen Verifikationsberei- 378 7 Software-Verifikation chen abh ¨ angen, f ¨ ur welche die ¨ Aquivalenz noch nicht gezeigt wurde, oder f ¨ ur die beiden Variablen wurde bereits ¨ Aquivalenz gezeigt. Die ¨ Aquivalenzpr ¨ ufung mittels Programmabh ¨ angigkeitsgraphen wird an einem Beispiel gezeigt [315]. Beispiel 7.1.9. Gegeben sind die beiden Programme: Programm 1 Programm 2 1 if (in1 > in2) { if (in1 > in2) { 2 a = in1 + in2; a = in1 + in2; 3 b = in1 * 3; b = in1 * 3; 4 c = in2 * 5; c = in2 * 5; 5 } else { } else { 6 a = in2 - in1; a = in2 - in1; 7 b = in1 * 5; b = in1 * 5; 8 c = in2 * 3; c = in2 * 3; 9} } 10 x=a+c; x=a; 11 y=b-c; y=b-c; 12 x=x; x=x+c; 13 out=x+y; out=x+y; 14 return out; return out; Die Eingabevariablen der beiden C-Programmen sind in1 und in2. Die Ausgabeva- riable in beiden Programmen heißt out. Man beachte, dass das Programm 1 in Zeile 12 um die Anweisung x=xerweitert wurde, um eine zeilenweise Korrespondenz zwischen den Programmen zu erreichen. Die beiden Programmabh ¨ angigkeitsgraphen sind in Abb. 7.6 zu sehen. Der erste Quelltext-Unterschied ist in Zeile 10 der beiden C-Programme. Entsprechend wird der Verifikationsbereich A in Abb. 7.6 als erstes betrachtet. Da f ¨ ur die Eingabevaria- blen des Verifikationsbereichs keine ¨ Aquivalenzen bekannt sind, kann auch nicht die ¨ Aquivalenz der Variablen x gezeigt werden. F T F T in1 in1 in2 c A B C c in2 in1 > in2 in1 > in2 a:=in1+in2 a:=in2-in1 x:=a+c x:=x x:=x+c x:=a a:=in1+in2 a:=in2-in1 Abb. 7.6. Programmabh ¨ angigkeitsgraphen und Verifikationsbereiche [315] 7.1 Formale ¨ Aquivalenzpr ¨ ufung eingebetteter Software 379 Die entsprechenden ¨ Aquivalenzklassen lauten: E 1 := {a 0,1 } E 2 := {a 0,2 ,x 0,2 } E 3 := {c 0,1 } E 4 := {x 0,1 ,a 0,1 + c 0,1 } Um den Verifikationsbereich zu erweitern, bietet sich ein R ¨ uckw ¨ artserweiterung f ¨ ur die Variable a an. Da a in einem konditionalen Kontrollpfad berechnet wird, muss auch die Zuweisung im alternativen Pfad sowie das Pr ¨ adikat selbst mit zur Erweite- rung geh ¨ oren. Somit ist der neue Verifikationsbereich der Bereich B. Die Eingabe- variablen f ¨ ur Verifikationsbereich B sind in1, in2 und c. Die Eingabevariable in1 bzw. in2 in Programm 1 ist ¨ aquivalent mit in1 bzw. in2 in Programm 2. Dennoch kann aufgrund der Unterschiede in der Zuweisung keine ¨ Aquivalenz der Programme f ¨ ur den Verifikationsbereich B gezeigt werden. Die entsprechenden ¨ Aquivalenzklas- sen lauten: E 1 := {in1 0,1 ,in1 0,2 } E 1 := {in2 0,1 ,in2 0,2 } E 1 := {a 0,1 ,a 0,2 ,x 0,2 } E 3 := {c 0,1 } E 4 := {x 0,1 ,a 0,1 + c 0,1 } Es folgt schließlich eine Vorw ¨ artserweiterung ¨ uber die Datenabh ¨ angigkeit von x. Der neue Verifikationsbereich ist der Bereich C in Abb. 7.6. In diesem Fall wird auch die Variable c in Programm 2 ber ¨ ucksichtigt. Außerdem ist bekannt, dass die Variable c in Programm 1 ¨ aquivalent zu Variable c in Programm 2 ist. Somit kann auch die ¨ Aquivalenz der Variable x in Programm 1 und Programm 2 gezeigt werden. Damit ist gleichzeitig auch gezeigt, dass die beiden Programme ¨ aquivalent sind. Die abschließenden ¨ Aquivalenzklassen lauten: E 1 := {in1 0,1 ,in1 0,2 } E 1 := {in2 0,1 ,in2 0,2 } E 1 := {a 0,1 ,a 0,2 } E 3 := {c 0,1 ,c 0,2 } E 4 := {x 1,1 ,x 1,2 ,a 0,1 + c 0,1 ,a 0,2 + c 0,2 } ¨ Aquivalenzpr ¨ ufung ohne Abrollen der Schleifen Die bis jetzt vorgestellten Verfahren zur ¨ Aquivalenzpr ¨ ufung f ¨ ur C-Programme setzen Einschr ¨ ankungen voraus, die sich teilweise lockern lassen. In [395] wird beispiels- weise eine ¨ Aquivalenzpr ¨ ufung vorgestellt, welches das Abrollen der Schleifen nicht verlangt. Gepr ¨ uft werden zwei Programme, die durch Transformationen auseinander 380 7 Software-Verifikation hervorgegangen sind. Dabei werden im Folgenden nur Transformationen betrachtet, die zum Ziel haben, die Speicherzugriffe zu minimieren. Im Wesentlichen lassen sich zwei Transformationen aus diesem Bereich unterscheiden: • Globale Schleifentransformationen werden verwendet, um for-Schleifen umzu- ordnen und neu zu strukturieren, wodurch sich die temporale und r ¨ aumliche Lo- kalit ¨ at der Daten verbessert. Hierdurch werden Zugriffe auf den Hauptspeicher minimiert. • Globale Datenflusstransformationen werden verwendet, um beispielsweise wie- derholte Berechnungen zu entfernen oder einen Flaschenhals, der durch die Be- rechnung von Datenabh ¨ angigkeiten hervorgerufen wird, aufzul ¨ osen. Die Transformationen basieren dabei auf dem Propagieren von Ausdr ¨ ucken (engl. expression propagation), was tempor ¨ are Variablen erzeugt oder eliminiert. Daneben wurden globale algebraische Transformationen eingesetzt, die auf algebraischen Ei- genschaften beruhen. Da diese Transformationen fehleranf ¨ allige ¨ Anderungen an den Berechnungen der Variablenindizes durchf ¨ uhren k ¨ onnen, ist hier eine Unterst ¨ utzung durch eine formale ¨ Aquivalenzpr ¨ ufung besonders hilfreich. Beispiel 7.1.10. Betrachtet wird das folgende C-Programm [396]: 1 Programm 1 2 void prog1(int a[], int b[], int c[]) { 3 int k, tmp1[256], tmp2[256], tmp3[256]; 4 5 for (k=0; k<256; k++) 6 s1: tmp1[k] = a[2*k] + f(B[k+1]); 7 for (k=10; k<138; k++) 8 s2: tmp2[k] = b[k-8]; 9 for (k=10; k<266; k++) { 10 if (k >= 138) 11 s3: tmp2[k] = b[k-8]; 12 s4: tmp3[k-10] = f(a[2*k - 19]) + tmp2[k]; 13 } 14 for (k=255; k>=0; k ) 15 s5: c[3*k] = tmp1[k] + tmp3[k]; 16 } Ferner ist das folgende C-Programm gegeben, welches durch Propagieren von Aus- dr ¨ ucken, Schleifen- und algebraischen Transformation aus Programm 1 erhalten wurde [396]: 1 Programm 2 2 void prog2(int a[], int b[], int c[]) { 3 int k, tmp4[256], tmp5[256]; 4 5 for (k=0; k<256; k++) { 6 t1: tmp4[k] = f(a[2*k+1]) + a[2*k]; 7 t2: tmp5[k] = b[k+2] + tmp4[k]; 7.1 Formale ¨ Aquivalenzpr ¨ ufung eingebetteter Software 381 8 t3: c[3*k] = f(b[k+1]) + tmp5[k]; 9} 10 } Vernachl ¨ assigt man potentielle Wertebereichs ¨ uberl ¨ aufe, berechnen die beiden Funk- tionen die selben Ausgaben f ¨ ur die selben Eingaben, d. h. sie sind Eingabe/Ausgabe- ¨ aquivalent. Es werden Programme mit den folgenden Eigenschaften betrachtet: • Dynamische Einmalzuweisung (engl. dynamic single assignment, DSA): Das Pro- gramm ist in dynamischer Einmalzuweisung geschrieben. Hierbei wird jede Va- riable lediglich einmal geschrieben. Im Gegensatz zur statischen Einmalzuwei- sung (engl. static single assignment, SSA) [125], welche lediglich auf dem Um- benennen einzelner Variablen basiert, wird bei DSA auch der dynamische Kon- trollfluss mit ber ¨ ucksichtigt, so dass auch in Schleifenr ¨ umpfen Variablen ledig- lich einmal geschrieben werden [158]. • St ¨ uckweise affine Ausdr ¨ ucke: Indizes f ¨ ur Arrays innerhalb von Schleifenr ¨ umpfen sind st ¨ uckweise affin. Auch sind die Operatoren mod, div, min, max, floor und ceil zugelassen. Hierdurch k ¨ onnen die Relationen zwischen Arrayvariablen als affine Ungleichungen beschrieben werden. • Statischer Kontrollfluss: Die Programme enthalten keine datenabh ¨ angigen Schlei- fen. Es wird angenommen, dass datenabh ¨ angige Schleifen durch Schleifen mit konstanten Grenzen und einer if-Anweisung im Schleifenrumpf zum daten- abh ¨ angigen Abbruch der Schleife ersetzt werden. • Zeiger und Rekursionen: Zeiger und Rekursionen sind in den Programmen nicht gestattet. ADDGs Array-Datenabh ¨ angigkeitsgraphen (engl. Array Data Dependency Graph, ADDG) werden im Folgenden verwendet, um die Datenabh ¨ angigkeiten in Programmen mit den obigen Eigenschaften zu erfassen. Skalare Variablen k ¨ onnen als einelementige Arrays angesehen werden. Der Index einer zu schreibenden Variablen in einer An- weisung sowie die Indizes der dabei gelesenen Variablen k ¨ onnen von Schleifenva- riablen abh ¨ angen. Diese Abh ¨ angigkeiten k ¨ onnen als Punkte i n einem ganzzahligen mehrdimensionalen Raum angesehen werden. Man erh ¨ alt somit eine geometrische Repr ¨ asentation. Zur Definition eines ADDG wird von der folgenden Anweisung s ausgegangen: s : v[ f i 1 ([k 1 , ,k d ])], ,[ f i n ([k 1 , ,k d ])] = exp( ,u[ f j 1 ([k 1 , ,k d ])], ,u[ f j m ([k 1 , ,k d ])], ); Die Anweisung s wird f ¨ ur verschiedene Iterationen berechnet, wobei diese durch Elemente in dem sog. Iterationsbereich D gegeben sind. Der Iterationsbereich D := {k =[k 1 , ,k d ]} definiert, f ¨ ur welche Belegungen von Schleifenvariablen k 1 , ,k d die Anweisung ausgef ¨ uhrt wird. Aus dem Iterationsbereich l ¨ asst sich der sog. Defi- nitionsbereich W v einer Arrayvariablen v definieren: 382 7 Software-Verifikation Definition 7.1.2 (Definitionsbereich). Der Definitionsbereich W v einer Variable v in der Anweisung s mit Iterationsbereich D ist die Menge der Belegungen der Indizes [i 1 , ,i n ],d.h. W v :=  [i 1 , ,i n ] |  n  r=1 i r = f i r ([k 1 , ,k d ])  ∧ [k 1 , ,k d ] ∈ D  Analog l ¨ asst sich der sog. Operandenbereich R u einer in Anweisung s verwendeten Variablen u definieren. Definition 7.1.3 (Operandenbereich). Der Operandenbereich R u einer Variablen u in der Anweisung s mit Iterationsbereich D ist die Menge der Belegungen der Indizes [ j 1 , , j m ],d.h. R u :=  [ j 1 , , j m ] |  n  r=1 j r = f j r ([k 1 , ,k d ])  ∧ [k 1 , ,k d ] ∈ D  Schließlich kann mit Hilfe der Iterations-, Definitions- und Operandenbereiche eine sog. Abh ¨ angigkeitsabbildung M v,u der Variablen v und u in Anweisung s definiert werden: Definition 7.1.4 (Abh ¨ angigkeitsabbildung). F ¨ ur eine Anweisung s l ¨ asst sich eine Abh ¨ angigkeitsabbildung M v,u ,welchedieAbh ¨ angigkeit der Variable v von der Va- riablen u beschreibt, wie folgt berechnen: M v,u :=  [i 1 , ,i n ] → [ j 1 , , j m ] |  n  r=1 i r = f i r ([k 1 , ,k d ])  ∧  n  r=1 j r = f j r ([k 1 , ,k d ])  ∧ [k 1 , ,k d ] ∈ D  Beispiel 7.1.11. F ¨ ur die Anweisung s4 in Programm Programm 1 aus dem Beispiel 7.1.10 ergibt sich der Iterationsbereich D zu: D = {[k] | 10 ≤ k < 266 ∧ k ∈ Z} Der Definitionsbereich f ¨ ur Variable tmp3 und die Operandenbereiche f ¨ ur die Varia- blen a und tmp2 ergeben sich zu: W tmp3 = {[d] | d = k − 10 ∧ k ∈ D} R a = {[d] | d = 2 · k − 19 ∧ k ∈ D} R tmp2 = {[d] | d = k ∧ k ∈ D} Hieraus ergeben sich die Abh ¨ angigkeitsabbildungen M tmp3,a und M tmp3,tmp2 zu: M tmp3,a = {[d 1 ] → [d 2 ] | d 1 = k −10 ∧ d 2 = 2 · k −19 ∧ k ∈ D} M tmp3,tmp2 = {[d 1 ] → [d 2 ] | d 1 = k −10 ∧ d 2 = k ∧k ∈ D} 7.1 Formale ¨ Aquivalenzpr ¨ ufung eingebetteter Software 383 Eine Datenabh ¨ angigkeit zwischen Anweisung s 1 und s 2 besteht, wenn s 1 Va- riablenwerte schreibt, die in Anweisung s 2 gelesen werden, d. h., wenn s 1 den De- finitionsbereich W v besitzt und Anweisung s 2 den Operandenbereich R v und gilt: W v ∩ R v = ∅. Die Menge an Datenabh ¨ angigkeiten kann als Array-Datenabh ¨ angig- keitsgraph (ADDG) repr ¨ asentiert werden. Definition 7.1.5 (ADDG). Ein ADDG ist ein gerichteter Graph G =(V,E), wobei die Knoten die Variablen und Operationen eines Programms repr ¨ asentieren. Die Kanten e ∈ E stellen Datenabh ¨ angigkeiten dar. Kanten mit Operationen als Quell- knoten werden mit der Position des jeweiligen Operanden (Senke) und Kanten mit Variablen als Quellknoten werden mit der jeweiliger Anweisung im Programm be- schriftet. W ¨ ahrend Datenabh ¨ angigkeitsgraphen in Compilern verwendet werden, um Da- tenabh ¨ angigkeiten von Operationen zu modellieren, werden in ADDGs die Abh ¨ an- gigkeiten von vielen Werten, die in einem Array gespeichert sind, modelliert. Die Datenabh ¨ angigkeitskanten in ADDGs sind dabei r ¨ uckw ¨ arts gerichtet. F ¨ ur die beiden Programme aus Beispiel 7.1.10, sind die ADDGs in Abb. 7.7 zu sehen. Man sieht, dass die Funktion f nicht interpretiert wird. Eine Variable v heißt im Folgenden • interne Variable, falls  W v =  R v gilt, d. h. jeder produzierte Wert auch konsu- miert wurde. • Eingabevariable, falls  W v = ∅ ist, d. h. kein Element produziert wurde. • Ausgabevariable, falls  R v ⊂ W v gilt, d. h. nicht alle produzierten Werte auch konsumiert wurden. Beispiel 7.1.12. Es wird wiederum das Programm 1 aus Beispiel 7.1.10 betrachtet. Die Variablen a und b sind Eingabevariablen und Variable c ist eine Ausgabevariable. Die Variablen tmp1, tmp2 und tmp3 sind interne Variablen. Neben der Abh ¨ angigkeitsabbildung aus Definition 7.1.4, die sich direkt aus den Anweisungen ablesen l ¨ asst, k ¨ onnen Datenabh ¨ angigkeiten auch ¨ uber mehrere Varia- blen hinweg als sog. transitive Abh ¨ angigkeitsabbildung definiert werden. Definition 7.1.6 (Transitive Abh ¨ angigkeitsabbildung). Sei v 0 ,v 1 , ,v n  ein Pfad im ADDG beginnend an Variablenknoten v 0 und endend in Variablenknoten v n mit n ≥ 0.Dietransitive Abh ¨ angigkeitsabbildung M ∗ v 0 ,v n ergibt sich zu: M ∗ v 0 ,v n := ⎧ ⎨ ⎩ I (Die Identit ¨ at) f ¨ ur n = 0 M v 0 ,v 1 f ¨ ur n = 1 M v 0 ,v 1 ◦ M v 1 ,v 2 ◦···◦M v n−1 ,v n sonst Dabei ist ◦ die Konkatenation f ¨ ur zwei Relationen, d. h. x → z ∈ F ◦ G ⇔∃y : x → y ∈ F ∧ y → z ∈ G. Die transitive Abh ¨ angigkeitsabbildung von einer Ausgabevariable zu einer Ein- gabevariable wird als Ausgabe-zu-Eingabe-Abbildung bezeichnet. Die Menge der Ausgabe-zu-Eingabe-Abbildungen definiert den Datenfluss des Programms. [...]... jeweilige a Pfad angegeben ¨ 7.2 Testfallgenerierung zur simulativen Eigenschaftsprufung ¨ F¨ r allgemeine Programme ist das Problem der Aquivalenzpr¨ fung nicht entscheidu u bar Per Simulation kann jedoch ein Programm mit einem Referenzprogramm vergli¨ chen werden Dabei ist das Ziel nicht, die Aquivalenz der Programme zu zeigen, sondern deren unterschiedliches Verhalten aufzudecken Dies kann, wie in . Programme ist das Problem der ¨ Aquivalenzpr ¨ ufung nicht entscheid- bar. Per Simulation kann jedoch ein Programm mit einem Referenzprogramm vergli- chen werden. Dabei ist das Ziel nicht, die ¨ Aquivalenz

Ngày đăng: 03/07/2014, 08:20