C # Statische Analyse, mögliche Werte für eine Variable / einen Parameter

8

In Code, der den folgenden Beispielen ähnlich ist, möchte ich in der Lage sein, Code statistisch zu analysieren, um die Liste der möglichen Werte zu ermitteln, die an SpecialFunction () übergeben werden.

%Vor%

Ich kann das C # bereits in einen abstrakten Syntaxbaum einarbeiten und kann bereits Fälle wie A behandeln, und ich könnte die anfänglichen Zuweisungen von Werten verfolgen, um Fall B zu erraten, aber Fälle wie C scheinen kompliziert zu werden schnell.

Ich bin mir fast sicher, dass wir nicht in der Lage sein werden, in allen Fällen statisch nach x zu suchen, und das ist in Ordnung. Ich würde gerne Strategien kennen, um es zu versuchen, Wege zu erkennen, wenn es nicht möglich ist. Was ist, wenn wir Felder auf Klassenebene und Multithreading einbeziehen müssen? Verschlüsse? Wäre es hilfreich, wenn wir das für die Menge X aller möglichen Werte für x , |X| < 50 ?

wissen würden?

Wie aus dem Vorschlag von Vladimir Perevalov, wie könnten die Konzepte in Pex angewendet werden, um mögliche Werte für zielgerichtete Codepunkte zu finden (anstatt, was Pex zu tun scheint, um Codepfade und Werte zu entdecken, die zu unchecked (? ) Ausnahmefälle)?

    
Jason Kleban 13.04.2012, 17:33
quelle

2 Antworten

3

Es gibt ein Projekt, das tut, was Sie wollen (zumindest sehr nahe). Es ist Pex . Sehen Sie sich ihre Dokumente an, Sie können auch die Quellen dekompilieren und sehen, was sie tun.

    
Vladimir Perevalov 13.04.2012, 18:04
quelle
3

Was Sie wollen, ist eine globale Datenflussanalyse ("welche Wertzuweisungen / Nebeneffekte erreichen welche Nutzungspunkte") [welche eine Kontrollflussanalyse als Vorläufer benötigt] und eine Art Bereichsanalyse ("Zusammenfassen der Menge von Werten das kann einen Punkt erreichen ").

Die Berechnung des Datenflusses erfordert ein vollständiges C # -Front-End, eine lokale Kontrolle und Datenflussanalyse und dann das Zusammenfügen dieser Antworten zur globalen Datenflussanalyse.

Bei der Bereichsanalyse müssen Sie zunächst definieren, wie Sie die Menge möglicher Werte codieren möchten. Welches System von Spezifikationen ist erlaubt? Die einfachste, nur eine Reihe von Werten, neigt dazu, zu explodieren. Ein Zwischenspezifikationsschema wäre etwas wie die Einzelrelational-zu-Konstante des OP, z. B. "x & lt; 50". Das Problem mit solch einem begrenzten Schema ist, dass der Reichtum der Menge von Werten dazu führen kann, dass Sie nutzlose Antworten bekommen, besonders wenn es andere Prädikate von Interesse gibt (wenn x immer ungerade ist, kann die single-relationale Konstante dies nur modellieren als "x & lt; unendlich", was eindeutig nicht hilfreich ist. Also, Sie wollen ein Spezifikationsschema wählen, das kompliziert genug ist, um diese Arten von Werten zu modellieren, die Sie interessieren. Jedoch, wie Ihr Spezifikationsschema ausgefeilter wird, die Maschinerie, um diese abzuleiten Fakten werden immer komplizierter, so dass Sie es nicht zu kompliziert machen können.

Meistens haben die Analyse-Tools keine solchen Analysen, geschweige denn für Sie. PEX kann tatsächlich solche Maschinen haben; wenn Sie Glück haben, ist es auch ausgesetzt.

Unser DMS Software Reengineering Toolkit bietet generisches Parsing, Symboltabellen-Erstellung, Kontroll- / Datenflussanalyse und in der Tat sogar Reichweitenanalysemaschinerie (Spezifikation: x & lt; k1 · a + k2 · b wobei k1 und k2 Konstanten sind, a und b sind andere Programmvariablen sichtbar, wobei x verbraucht wird). DMS hat C #, Java, GNU C und COBOL Frontends, und wir haben diese Maschinen tatsächlich für GNU C und IBM Enterprise COBOL (und teilweise für Java 7) instantiiert, indem wir (statische Analyse!) Fakten für diese Sprachen gesammelt und diese gespeist haben Fakten zu den generischen Maschinen. Wir haben diese Maschine noch nicht für C # instanziiert. Aber wenn Sie keine gute Antwort von einer anderen Quelle bekommen können, ist dies wahrscheinlich ziemlich nah.

    
Ira Baxter 13.04.2012 23:13
quelle