Datenflussanalyse mit Ausnahmen

8

Die Datenflussanalyse erfolgt über ein Kontrollflussdiagramm. Wenn eine betrachtete Sprache Ausnahmen unterstützt, kann das Kontrollflussdiagramm explodieren.

Was sind die Standardtechniken für den Umgang mit dieser Explosion? Können wir ausnahmsweise hervorgerufene Kanten ignorieren? Datenflussanalysen berechnen ohnehin Übernäherungen, sodass wir eine weniger genaue, aber solide Lösung erhalten würden. Ist das wahr?

Update : Hier sind einige nützliche Links, die ich am Ende ausgraben konnte:

bellpeace
quelle
Was meinst du mit "explodieren"? Wissen wir statisch, welche Ausnahmen wohin geworfen werden können? Welche Art von Vergrößerung würden Sie gerne akzeptieren?
Raphael
1
Mit Explosion meine ich, dass die Anzahl der Basisblöcke und die Anzahl der sie verbindenden Kanten erhöht werden, was zu möglicherweise höheren Ausführungszeiten für die Analyse führt. Meine Annahme, vielleicht falsch, war, dass dies ein Problem bei Compilern sein könnte und es vielleicht eine Möglichkeit gibt, damit umzugehen. Ich bin daran interessiert, das Thema zu verstehen.
Bellpeace

Antworten:

10

Das Ignorieren von Ausnahmen ist nicht sinnvoll. Beispiel:

let g = {
     raise E;
}
let f = {
     x := interesting_stuff();
     g();
     x := 0;
}

Bei der Analyse fmüssen Sie die Tatsache berücksichtigen, dass geine Ausnahme ausgelöst wird. Andernfalls würden Sie fälschlicherweise den Schluss ziehen, dass xbei der Rückkehr von immer 0 ist f.

Ich weiß nicht, dass es eine „Standard“ -Technik für den Umgang mit Ausnahmen gibt. Es gibt Literatur zu diesem Thema. Ich habe keine bessere Vorstellung davon, welche Artikel relevant sind, als ich mit einer Google-Suche finden kann.

Formal können Ausnahmen in bedingte Anweisungen umgewandelt werden, die die Aufrufkette weitergeben, was natürlich das Kontrollflussdiagramm in die Luft sprengt. In vielen konkreten Fällen ist der Ausnahmefall der weniger interessante Fall, wo eine Menge von Daten getötet wird, so dass es in einem vorderen Ansatz träge verarbeitet werden (keine Notwendigkeit , die Vitalitäts zu analysieren auf Ausnahme Pfad , wenn der Handler die Daten kills) .

Gilles 'SO - hör auf böse zu sein'
quelle
Eine Folgefrage, wenn Sie nichts dagegen haben. Wenn mir einige Kanten fehlen, kann ich im Wesentlichen ein fehlerhaftes Ergebnis erzielen. Was ist, wenn ich einen Kontrollfluss für die Kantencodierung habe, der während der Programmausführung tatsächlich nicht angezeigt wird? Hätte ich ein solides Ergebnis, aber möglicherweise ein weniger genaues?
Bellpeace
1
@bellpeace Wenn eine Kante einem Pfad entspricht, der während der Ausführung niemals genommen wird, handelt es sich um toten Code, sodass er entfernt werden kann, ohne die Solidität zu beeinträchtigen. Das Ergebnis wäre mehr präzise: Sie haben eine bessere Annäherung des Programms, so dass Sie eine bessere Annäherung seines Verhaltens zu bekommen.
Gilles 'SO - hör auf böse zu sein'
Das Hinzufügen zusätzlicher Kanten wirkt sich also im Wesentlichen nicht auf die Solidität aus, sondern nur auf die Präzision.
Bellpeace
1
@bellpeace Ja: Wenn Sie potenzielle Pfade hinzufügen, können Sie neue potenzielle Flows einführen, die tatsächlich nicht auftreten können, aber Sie werden keine Flows löschen, die tatsächlich auftreten.
Gilles 'SO - hör auf böse zu sein'
Moment mal, in diesem Beispiel ist x bei der Rückkehr von f immer Null. Wenn g eine Ausnahme auslöst, kehrt f nicht zurück. Wenn f nun die Ausnahme abfängt (und vielleicht erneut), wäre das eine andere Sache, aber das wäre eine explizite Kante im Flussdiagramm.
Pseudonym