Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
792aa48
Add bool changed component to TD3 solve & eval
sim642 Sep 28, 2021
740b72c
Add dep hashtable to TD3
sim642 Sep 28, 2021
342cfa0
Add aborting via exception to TD3
sim642 Sep 28, 2021
7c6f643
Fix FromSpec not resetting current globals on TD3 eq abort
sim642 Sep 28, 2021
bae9516
Fix first narrow iteration always aborting TD3
sim642 Sep 28, 2021
f88707f
Fix aborting of branching loop bodies using destabilization front
sim642 Sep 28, 2021
8594d03
Add called_changed set to TD3
sim642 Sep 28, 2021
6a317fd
Add aborts counter to statistics
sim642 Sep 27, 2021
982ddc3
Make TD3 solve changed tail recursive again
sim642 Sep 28, 2021
c4cda6a
Remove destab_infl after pushing destabilization front in TD3
sim642 Sep 28, 2021
9592060
Optimize TD3 dep to be just for destabilize
sim642 Sep 27, 2021
27aa497
Optimize TD3 by removing destab_dep after use
sim642 Sep 27, 2021
6445791
Optimize TD3 called aborting
sim642 Sep 27, 2021
38971a1
Remove duplicate current node and context reset in FromSpec
sim642 Sep 27, 2021
88d12dd
Remove old comments in TD3
sim642 Sep 28, 2021
fdea296
Merge branch 'master' into td3-solve-tf-abort-merge
sim642 Oct 6, 2021
7abb940
Add regression test where TD3 aborting with self-dependency and fixed…
sim642 Oct 6, 2021
365e752
Add more TD3 tracing
sim642 Oct 6, 2021
e46f85b
Fix TD3 self side destabilization removing from front
sim642 Oct 6, 2021
53359ad
Add TD3 test where complex self-abort causes verify error
sim642 Oct 7, 2021
0272784
Add stable and front tracing to TD3
sim642 Oct 7, 2021
0adf31b
Fix TD3 changed solve not pushing unstable front
sim642 Oct 7, 2021
419b63e
Add exp.solver.td3.abort option
sim642 Oct 7, 2021
bf12102
Add back TD3 space support without abort
sim642 Oct 7, 2021
fb071a1
Add TD3 abort verification by comparing with previous dep values
sim642 Oct 7, 2021
9426674
Deduplicate new prev_dep_vals setting in TD3 abort verify
sim642 Oct 7, 2021
281b8fb
Remove bad_abort flag from TD3 abort verify
sim642 Oct 7, 2021
0b4eb68
Refactor TD3 abort verify
sim642 Oct 7, 2021
b376100
Add minimal creduced case where TD3 abort fails its verify
sim642 Oct 18, 2021
e99acab
Add more TD3 tracing
sim642 Oct 18, 2021
234c4c7
Reuse commented out destab_infl front code to fix TD3 abort
sim642 Oct 18, 2021
f9def12
Add creduce script for TD3 abort verify failure
sim642 Oct 18, 2021
8bc2c89
Get pvals before executing any tf to maximize abort
sim642 Oct 21, 2021
5d9642d
Merge branch 'master' into td3-solve-tf-abort
sim642 Nov 8, 2021
f66d1a0
Merge branch 'interactive' into td3-solve-tf-abort
sim642 Nov 8, 2021
a7913d6
Fix TD3 restart wpoint with abort
sim642 Nov 8, 2021
df080d9
Disable incremental.restart.wpoint.enabled by default
sim642 Nov 8, 2021
1aea84c
Disable TD3 abort by default
sim642 Nov 8, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions scripts/creduce-abort-verify.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/usr/bin/env bash

set -e

gcc -c -Werror=implicit-function-declaration ./abort-verify.c

GOBLINTDIR="/mnt/goblint-svcomp/sv-comp/goblint"
OPTS="--conf $GOBLINTDIR/conf/svcomp.json --enable exp.solver.td3.abort --enable exp.solver.td3.abort-verify --sets ana.specification /mnt/goblint-svcomp/benchexec/sv-benchmarks/c/properties/unreach-call.prp --sets exp.architecture 64bit ./abort-verify.c"
INTERESTING="TD3 abort verify: should not abort"
OUTDIR="creduce-abort-verify"


mkdir -p $OUTDIR

LOG="$OUTDIR/out.log"
$GOBLINTDIR/goblint $OPTS -v --enable dbg.debug &> $LOG || true
grep -F "Function definition missing" $LOG && exit 1

grep -F "$INTERESTING" $LOG
1 change: 1 addition & 0 deletions src/framework/analyses.ml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ struct

let pretty_trace () ((n,c) as x) =
if get_bool "dbg.trace.context" then dprintf "(%a, %a) on %a \n" Node.pretty_trace n LD.pretty c CilType.Location.pretty (getLocation x)
(* if get_bool "dbg.trace.context" then dprintf "(%a, %d) on %a" Node.pretty_trace n (LD.tag c) CilType.Location.pretty (getLocation x) *)
else dprintf "%a on %a" Node.pretty_trace n CilType.Location.pretty (getLocation x)

let printXml f (n,c) =
Expand Down
51 changes: 31 additions & 20 deletions src/framework/constraints.ml
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@ module FromSpec (S:Spec) (Cfg:CfgBackward) (I: Increment)
and module GVar = Basetype.Variables
and module D = S.D
and module G = S.G
val tf : MyCFG.node * S.C.t -> (Cil.location * MyCFG.edge) list * MyCFG.node -> ((MyCFG.node * S.C.t) -> S.D.t) -> (MyCFG.node * S.C.t -> S.D.t -> unit) -> (Cil.varinfo -> G.t) -> (Cil.varinfo -> G.t -> unit) -> D.t
val tf : MyCFG.node * S.C.t -> (Cil.location * MyCFG.edge) list * MyCFG.node -> D.t -> ((MyCFG.node * S.C.t) -> S.D.t) -> (MyCFG.node * S.C.t -> S.D.t -> unit) -> (Cil.varinfo -> G.t) -> (Cil.varinfo -> G.t -> unit) -> D.t
end
=
struct
Expand Down Expand Up @@ -679,53 +679,64 @@ struct
let tf var getl sidel getg sideg prev_node (_,edge) d (f,t) =
let old_loc = !Tracing.current_loc in
let old_loc2 = !Tracing.next_loc in
let _ = Tracing.current_loc := f in
let _ = Tracing.next_loc := t in
let d = tf var getl sidel getg sideg prev_node edge d in
let _ = Tracing.current_loc := old_loc in
let _ = Tracing.next_loc := old_loc2 in
d

let tf (v,c) (edges, u) getl sidel getg sideg =
let pval = getl (u,c) in
Tracing.current_loc := f;
Tracing.next_loc := t;
Fun.protect ~finally:(fun () ->
Tracing.current_loc := old_loc;
Tracing.next_loc := old_loc2
) (fun () ->
let d = tf var getl sidel getg sideg prev_node edge d in
d
)

let tf (v,c) (edges, u) pval getl sidel getg sideg =
(* let pval = getl (u,c) in *)
let _, locs = List.fold_right (fun (f,e) (t,xs) -> f, (f,t)::xs) edges (Node.location v,[]) in
List.fold_left2 (|>) pval (List.map (tf (v,Obj.repr (fun () -> c)) getl sidel getg sideg u) edges) locs

let tf (v,c) (e,u) getl sidel getg sideg =
let tf (v,c) (e,u) pval getl sidel getg sideg =
let old_node = !current_node in
let old_context = !M.current_context in
let _ = current_node := Some u in
current_node := Some u;
M.current_context := Some (Obj.repr c);
let d = tf (v,c) (e,u) getl sidel getg sideg in
let _ = current_node := old_node in
M.current_context := old_context;
d
Fun.protect ~finally:(fun () ->
current_node := old_node;
M.current_context := old_context
) (fun () ->
let d = tf (v,c) (e,u) pval getl sidel getg sideg in
d
)

let system (v,c) =
match v with
| FunctionEntry _ ->
None
| _ ->
let tf getl sidel getg sideg =
let tf' eu = tf (v,c) eu getl sidel getg sideg in
let get_pval (_, u) = getl (u, c) in
let tf' eu pval = tf (v,c) eu pval getl sidel getg sideg in

match NodeH.find_option CfgTools.node_scc_global v with
| Some scc when NodeH.mem scc.prev v && NodeH.length scc.prev = 1 ->
(* Limited to loops with only one entry node. Otherwise unsound as is. *)
(* TODO: Is it possible to do soundly for multi-entry loops? *)
let stricts = NodeH.find_all scc.prev v in
let xs_stricts = List.map tf' stricts in
let pvals_stricts = List.map get_pval stricts in (* get pvals before executing any tf to maximize abort *)
let xs_stricts = List.map2 tf' stricts pvals_stricts in
if List.for_all S.D.is_bot xs_stricts then
S.D.bot ()
else
let xs_strict = List.fold_left S.D.join (S.D.bot ()) xs_stricts in
let equal = [%eq: (CilType.Location.t * Edge.t) list * Node.t] in
let is_strict eu = List.exists (equal eu) stricts in
let non_stricts = List.filter (neg is_strict) (Cfg.prev v) in
let xs_non_stricts = List.map tf' non_stricts in
let pvals_non_stricts = List.map get_pval non_stricts in (* get pvals before executing any tf to maximize abort *)
let xs_non_stricts = List.map2 tf' non_stricts pvals_non_stricts in
List.fold_left S.D.join xs_strict xs_non_stricts
| _ ->
let xs = List.map tf' (Cfg.prev v) in
let prevs = Cfg.prev v in
let pvals = List.map get_pval prevs in (* get pvals before executing any tf to maximize abort *)
let xs = List.map2 tf' prevs pvals in
List.fold_left S.D.join (S.D.bot ()) xs
in
Some tf
Expand Down
2 changes: 1 addition & 1 deletion src/maingoblint.ml
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ let merge_preprocessed cpp_file_names =
let do_stats () =
if get_bool "printstats" then (
print_newline ();
ignore (Pretty.printf "vars = %d evals = %d \n" !Goblintutil.vars !Goblintutil.evals);
ignore (Pretty.printf "vars = %d evals = %d aborts = %d\n" !Goblintutil.vars !Goblintutil.evals !Goblintutil.aborts);
print_newline ();
Stats.print (Messages.get_out "timing" Legacy.stderr) "Timings:\n";
flush_all ()
Expand Down
3 changes: 3 additions & 0 deletions src/solvers/generic.ml
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,9 @@ struct
Goblintutil.evals := !Goblintutil.evals + 1;
if (get_bool "dbg.solver-progress") then (incr stack_d; print_int !stack_d; flush stdout)

let abort_rhs_event x =
incr Goblintutil.aborts

let update_var_event x o n =
if tracing then increase x;
if full_trace || ((not (Dom.is_bot o)) && Option.is_some !max_var && Var.equal (Option.get !max_var) x) then begin
Expand Down
Loading