Gibt es eine Möglichkeit, die Funktionsdefinitionen als Assertionen im Solver hinzuzufügen?z3: Hinzufügen von Variablendeklarationen in den Assertionen
Ich arbeite derzeit an der begrenzten Modellprüfung von C++ - Dateien und in der Lage, die Definitionen als assert-Anweisungen hinzuzufügen, wird eine Art Eins-zu-Eins-Entsprechung zur Solver-Assertion und Codezeile bereitstellen.
Zum Beispiel ich habe folgendes Spielzeug Programm:
int x, y;
x = y + 1;
assert(x != 0)
CBMC erzeugt die folgende SMT2 Datei:
(declare-fun |main::1::[email protected]#1|() (_ BitVec 32))
(define-fun |main::1::[email protected]#2|() (_ BitVec 32) (bvadd (_ bv1 32) |main::1::[email protected]#1|))
(define-fun |B0|() Bool (= |main::1::[email protected]#1| |main::1::[email protected]#1|))
(assert (not (not (= |main::1::[email protected]#2| (_ bv0 32)))))
z3_parse_string gibt die folgende Formel.
Not(Not(1 + main::1::[email protected]#1 == 0))
Ich habe mich gefragt, ob es möglich ist, die Funktionsdeklarationen in den Löser auch, etwas entlang der Linien von hinzuzufügen:
([email protected]#2 == 1 + [email protected]#1) AND !([email protected]#2 == 0)
So jede Klausel entspricht lose auf einer Zeile des Quellcodes.
Ich verstehe, dass derzeit der z3_parse_string api nur den Zugriff (behaupten ... Linien und macht von dort Falten (bitte korrigiert mich wenn ich falsch bin) Die einzige Lösung, die ich ist Ändern der Datei denken kann, so dass die definieren -fun wird deklarieren-Spaß und die Definition in eine neue Behauptung Linie geschoben wie:.
(declare-fun |main::1::[email protected]#2|() (_ BitVec 32))
(assert (= |main::1::[email protected]#2| (bvadd (_ bv1 32) |main::1::[email protected]#1|)))
Vielen dank im Voraus
Ja, z3_parse_string ist nicht die benutzerfreundlichste, ich musste schließlich mit meinem eigenen Parser kommen, um das Deklarationsbit in eine neue Assertionsklausel zu verschieben. CBMC generiert nur die smt2-Datei und ruft z3 nativ auf, ruft dann die Zuweisung der relevanten Variablen ab und verwendet diese, um die Fehlerablaufverfolgung zu generieren. Vielen Dank aber – user3146687