2016-03-29 6 views
0

Ich möchte ein Frama-C-Plugin entwickeln, wo ich die Werte der aktuellen Aussage bekomme.Frama-C: Die Werte der Aussage

Mit Hilfe dieses Beitrags Frama-C Plugin development: Getting result of value-analysis war ich in der Lage, die Werte der Anweisungen zu drucken, aber Pointer wurden nicht so gezeigt, wie ich es brauche.

Mit Hilfe der Kommentare konnte ich den gesamten Zustand (nicht nur die Variablen der Anweisung) drucken.

Kann ich diese beiden kombinieren: Get die Variablen der Anweisung, aber auch mit den Dereferenzierten Zeigern (der Wert)?

Zum Beispiel das Drucken eines Nicht-Zeiger nach Aussage x=1 Ergebnisse in x -> {{ NULL -> {1} }}, während ein Zeiger Druck nach einer Anweisung wie * x = 3, ergibt x -> {{ y -> {0} }}, weil die 0 die der variablen versetzt ist, aber ich möchte Holen Sie sich den Wert, auf den der Zeiger zeigt, im Beispiel 3. So wie ich es möchte, wäre etwas so zu bekommen: x -> 3.

Noch besser wäre es, ein Tupel von (String varname, int value) zu bekommen, damit ich es selbst ausdrucken kann.

+0

Was meinen Sie mit "Zeiger wurden nicht korrekt angezeigt"? Vielleicht sollten Sie Ihre Frage bearbeiten, um ein Beispiel hinzuzufügen, was Sie bekommen und was Sie sehen möchten. – Anne

+0

Also, was Sie erhalten möchten, ist der Wert von '(* x)', nicht der Wert von '(x)'. Um zu wissen, ob eine Variable ein Zeiger ist, können Sie ihren Typ testen ('Cil.isPointerType vi.vtype'), und dann müssen Sie den lvalue' * x' (mit etwas wie 'Lval (Mem ..., NoOffset) ') und benutze es, um nach seinem Wert zu fragen. – Anne

+0

Was ist der ... Teil? Einfach das Varinfo-Feld? Wie bekomme ich den Offset von der Varinfo? Wenn Sie einen Zeiger dereferenzieren, wird dies benötigt (oder habe ich nicht das bekommen, was Sie sagen wollen)? –

Antwort

3

Der Wert einer Variablen hängt von ihrem Typ ab. Wenn also die Variable den Typ int hat, ist ihr Wert eine Ganzzahl, aber wenn die Variable den Typ int* hat, ist ihr Wert die Adresse einer int Variablen. Die Variable kann viele andere Typen wie Struktur, Array usw. haben.

Von Ihrem Beispiel scheint es, dass Sie den Wert der Variablen vom Zeiger angezeigt bekommen möchten. Beachten Sie, dass in einigen Fällen ist dies keine gültige Operation ...

Wie dem auch sei, nehme ich an, dass Sie diese Funktion extrahieren kann in Frama-C Plugin development: Getting result of value-analysis einen L-Wert aus der vorherigen Antwort drucken:

let pretty_lval fmt stmt lval = 
    let kinstr = Kstmt stmt in (* make a kinstr from a stmt *) 
    let loc = (* make a location from a kinstr + an lval *) 
    !Db.Value.lval_to_loc kinstr ~with_alarms:CilE.warn_none_mode lval 
    in 
    Db.Value.fold_state_callstack 
    (fun state() -> 
     (* for each state in the callstack *) 
     let value = Db.Value.find state loc in (* obtain value for location *) 
     Format.fprintf fmt "%a -> %[email protected]" Printer.pp_lval lval 
     Locations.Location_Bytes.pretty value (* print mapping *) 
    )() ~after:false kinstr 

Sie können dann Drucken Sie die Informationen, die Sie suchen mit:

if Cil.isPointerType vi.vtype then 
    let lval = (Mem (Cil.evar vi), NoOffset) in 
    pretty_lval fmt stmt lval 
+0

Danke, das beantwortet meine Frage zu den Zeigern. Gibt es jetzt eine Möglichkeit, den Wert zu erhalten und in einer ocaml-Variablen zu speichern, statt sie zu drucken? Irgendwie durch Aufruf einer Funktion mit Wert (aus der Lösung) als Parameter? –

+1

Was meinst du? "Wert" über ** ist ** eine ocaml Variable. Vielleicht meinst du eine Stringvariable? Wenn dies der Fall ist, können Sie 'Format.asprintf' verwenden, aber das ist eher eine Ocaml-Frage. – Anne

+0

Was ich meinte war: Ich möchte den Wert erhalten, der in der Variablen gespeichert ist. Zum Beispiel: wenn ich {{NULL -> {0}}} habe, möchte ich 0 in einer Ocaml int-Variable speichern (oder sie zu einer Liste oder etwas Ähnlichem hinzufügen). Mit asprintf erhalte ich die Zeichenfolge (mit Klammern, ->, NULL ...). Gibt es eine Möglichkeit, den Wert durch eine Frama-C-Funktion zu erhalten, oder muss ich den String aufteilen? –