Skip to content

Commit 91ea3b9

Browse files
authored
Merge pull request #1191 from goblint/final-errors
Add final messages about unsound results
2 parents ee6dc36 + b5ebff6 commit 91ea3b9

16 files changed

+50
-5
lines changed

src/analyses/libraryFunctions.ml

+4-2
Original file line numberDiff line numberDiff line change
@@ -1230,8 +1230,10 @@ let unknown_desc f =
12301230
[]
12311231
in
12321232
(* TODO: remove hack when all classify are migrated *)
1233-
if not (CilType.Varinfo.equal f dummyFunDec.svar) && not (use_special f.vname) then
1234-
M.error ~category:Imprecise ~tags:[Category Unsound] "Function definition missing for %s" f.vname;
1233+
if not (CilType.Varinfo.equal f dummyFunDec.svar) && not (use_special f.vname) then (
1234+
M.msg_final Error ~category:Imprecise ~tags:[Category Unsound] "Function definition missing";
1235+
M.error ~category:Imprecise ~tags:[Category Unsound] "Function definition missing for %s" f.vname
1236+
);
12351237
LibraryDesc.of_old ~attrs old_accesses
12361238

12371239
let find f =

src/framework/analyses.ml

+2-1
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,8 @@ struct
643643
let vdecl ctx _ = ctx.local
644644

645645
let asm x =
646-
ignore (M.info ~category:Unsound "ASM statement ignored.");
646+
M.msg_final Info ~category:Unsound "ASM ignored";
647+
M.info ~category:Unsound "ASM statement ignored.";
647648
x.local (* Just ignore. *)
648649

649650
let skip x = x.local (* Just ignore. *)

src/framework/constraints.ml

+2
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,7 @@ struct
785785
in
786786
let funs = List.filter_map one_function functions in
787787
if [] = funs then begin
788+
M.msg_final Warning ~category:Unsound ~tags:[Category Call] "No suitable function to call";
788789
M.warn ~category:Unsound ~tags:[Category Call] "No suitable function to be called at call site. Continuing with state before call.";
789790
d (* because LevelSliceLifter *)
790791
end else
@@ -1390,6 +1391,7 @@ struct
13901391
let cilinserted = if loc.synthetic then "(possibly inserted by CIL) " else "" in
13911392
M.warn ~loc:(Node g) ~tags:[CWE (if tv then 571 else 570)] ~category:Deadcode "condition '%a' %sis always %B" d_exp exp cilinserted tv
13921393
| `Bot when not (CilType.Exp.equal exp one) -> (* all branches dead *)
1394+
M.msg_final Error ~category:Analyzer ~tags:[Category Unsound] "Both branches dead";
13931395
M.error ~loc:(Node g) ~category:Analyzer ~tags:[Category Unsound] "both branches over condition '%a' are dead" d_exp exp
13941396
| `Bot (* all branches dead, fine at our inserted Neg(1)-s because no Pos(1) *)
13951397
| `Top -> (* may be both true and false *)

src/solvers/postSolver.ml

+3
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,13 @@ module Verify: F =
8282

8383
let complain_constraint x ~lhs ~rhs =
8484
AnalysisState.verified := Some false;
85+
M.msg_final Error ~category:Unsound "Fixpoint not reached";
8586
ignore (Pretty.printf "Fixpoint not reached at %a\n @[Solver computed:\n%a\nRight-Hand-Side:\n%a\nDifference: %a\n@]" S.Var.pretty_trace x S.Dom.pretty lhs S.Dom.pretty rhs S.Dom.pretty_diff (rhs, lhs))
8687

8788
let complain_side x y ~lhs ~rhs =
8889
AnalysisState.verified := Some false;
90+
91+
M.msg_final Error ~category:Unsound "Fixpoint not reached";
8992
ignore (Pretty.printf "Fixpoint not reached at %a\nOrigin: %a\n @[Solver computed:\n%a\nSide-effect:\n%a\nDifference: %a\n@]" S.Var.pretty_trace y S.Var.pretty_trace x S.Dom.pretty lhs S.Dom.pretty rhs S.Dom.pretty_diff (rhs, lhs))
9093

9194
let one_side ~vh ~x ~y ~d =

src/util/messages.ml

+25-2
Original file line numberDiff line numberDiff line change
@@ -248,12 +248,24 @@ let add m =
248248
Table.add m
249249
)
250250

251+
let final_table: unit Table.MH.t = Table.MH.create 13
252+
253+
let add_final m =
254+
Table.MH.replace final_table m ()
255+
251256
let finalize () =
252257
if get_bool "warn.deterministic" then (
253258
!Table.messages_list
254259
|> List.sort Message.compare
255260
|> List.iter print
256-
)
261+
);
262+
Table.MH.to_seq_keys final_table
263+
|> List.of_seq
264+
|> List.sort Message.compare
265+
|> List.iter (fun m ->
266+
print m;
267+
Table.add m
268+
)
257269

258270
let current_context: ControlSpecC.t option ref = ref None
259271

@@ -282,7 +294,7 @@ let msg_noloc severity ?(tags=[]) ?(category=Category.Unknown) fmt =
282294
if !AnalysisState.should_warn && Severity.should_warn severity && (Category.should_warn category || Tags.should_warn tags) then (
283295
let finish doc =
284296
let text = GobPretty.show doc in
285-
add {tags = Category category :: tags; severity; multipiece = Single {loc = None; text; context = msg_context ()}}
297+
add {tags = Category category :: tags; severity; multipiece = Single {loc = None; text; context = None}}
286298
in
287299
Pretty.gprintf finish fmt
288300
)
@@ -316,4 +328,15 @@ let debug_noloc ?tags = msg_noloc Debug ?tags
316328
let success ?loc = msg Success ?loc
317329
let success_noloc ?tags = msg_noloc Success ?tags
318330

331+
let msg_final severity ?(tags=[]) ?(category=Category.Unknown) fmt =
332+
if !AnalysisState.should_warn then (
333+
let finish doc =
334+
let text = GobPretty.show doc in
335+
add_final {tags = Category category :: tags; severity; multipiece = Single {loc = None; text; context = None}}
336+
in
337+
Pretty.gprintf finish fmt
338+
)
339+
else
340+
GobPretty.igprintf () fmt
341+
319342
include Tracing

src/util/server.ml

+1
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ let node_locator: Locator.t ResettableLazy.t =
264264

265265
let analyze ?(reset=false) (s: t) =
266266
Messages.Table.(MH.clear messages_table);
267+
Messages.(Table.MH.clear final_table);
267268
Messages.Table.messages_list := [];
268269
let file, reparsed = reparse s in
269270
if reset then (

tests/regression/04-mutex/49-type-invariants.t

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
[Info][Imprecise] Invalidating expressions: AddrOf(Var(s, NoOffset)) (49-type-invariants.c:21:3-21:21)
2222
[Info][Imprecise] Invalidating expressions: AddrOf(Var(tmp, NoOffset)) (49-type-invariants.c:21:3-21:21)
2323
[Error][Imprecise][Unsound] Function definition missing for getS (49-type-invariants.c:21:3-21:21)
24+
[Error][Imprecise][Unsound] Function definition missing
2425

2526
$ goblint --enable warn.deterministic --disable ana.race.direct-arithmetic --enable allglobs 49-type-invariants.c
2627
[Warning][Behavior > Undefined > NullPointerDereference][CWE-476] May dereference NULL pointer (49-type-invariants.c:21:3-21:21)
@@ -45,3 +46,4 @@
4546
[Info][Imprecise] Invalidating expressions: AddrOf(Var(s, NoOffset)) (49-type-invariants.c:21:3-21:21)
4647
[Info][Imprecise] Invalidating expressions: AddrOf(Var(tmp, NoOffset)) (49-type-invariants.c:21:3-21:21)
4748
[Error][Imprecise][Unsound] Function definition missing for getS (49-type-invariants.c:21:3-21:21)
49+
[Error][Imprecise][Unsound] Function definition missing

tests/regression/04-mutex/77-type-nested-fields.t

+1
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@
2727
[Info][Imprecise] Invalidating expressions: AddrOf(Var(tmp, NoOffset)) (77-type-nested-fields.c:38:3-38:22)
2828
[Error][Imprecise][Unsound] Function definition missing for getS (77-type-nested-fields.c:31:3-31:20)
2929
[Error][Imprecise][Unsound] Function definition missing for getT (77-type-nested-fields.c:38:3-38:22)
30+
[Error][Imprecise][Unsound] Function definition missing

tests/regression/04-mutex/79-type-nested-fields-deep1.t

+1
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@
2727
[Info][Imprecise] Invalidating expressions: AddrOf(Var(tmp, NoOffset)) (79-type-nested-fields-deep1.c:43:3-43:24)
2828
[Error][Imprecise][Unsound] Function definition missing for getS (79-type-nested-fields-deep1.c:36:3-36:20)
2929
[Error][Imprecise][Unsound] Function definition missing for getU (79-type-nested-fields-deep1.c:43:3-43:24)
30+
[Error][Imprecise][Unsound] Function definition missing

tests/regression/04-mutex/80-type-nested-fields-deep2.t

+1
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,4 @@
2727
[Info][Imprecise] Invalidating expressions: AddrOf(Var(tmp, NoOffset)) (80-type-nested-fields-deep2.c:43:3-43:24)
2828
[Error][Imprecise][Unsound] Function definition missing for getT (80-type-nested-fields-deep2.c:36:3-36:22)
2929
[Error][Imprecise][Unsound] Function definition missing for getU (80-type-nested-fields-deep2.c:43:3-43:24)
30+
[Error][Imprecise][Unsound] Function definition missing

tests/regression/04-mutex/90-distribute-fields-type-1.t

+1
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,4 @@
2929
[Info][Imprecise] Invalidating expressions: AddrOf(Var(tmp, NoOffset)) (90-distribute-fields-type-1.c:39:3-39:17)
3030
[Error][Imprecise][Unsound] Function definition missing for getS (90-distribute-fields-type-1.c:31:3-31:20)
3131
[Error][Imprecise][Unsound] Function definition missing for getT (90-distribute-fields-type-1.c:39:3-39:17)
32+
[Error][Imprecise][Unsound] Function definition missing

tests/regression/04-mutex/91-distribute-fields-type-2.t

+1
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,4 @@
2929
[Info][Imprecise] Invalidating expressions: AddrOf(Var(tmp, NoOffset)) (91-distribute-fields-type-2.c:40:3-40:17)
3030
[Error][Imprecise][Unsound] Function definition missing for getS (91-distribute-fields-type-2.c:32:3-32:17)
3131
[Error][Imprecise][Unsound] Function definition missing for getT (91-distribute-fields-type-2.c:40:3-40:17)
32+
[Error][Imprecise][Unsound] Function definition missing

tests/regression/04-mutex/92-distribute-fields-type-deep.t

+1
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,4 @@
2929
[Info][Imprecise] Invalidating expressions: AddrOf(Var(tmp, NoOffset)) (92-distribute-fields-type-deep.c:44:3-44:17)
3030
[Error][Imprecise][Unsound] Function definition missing for getS (92-distribute-fields-type-deep.c:36:3-36:20)
3131
[Error][Imprecise][Unsound] Function definition missing for getU (92-distribute-fields-type-deep.c:44:3-44:17)
32+
[Error][Imprecise][Unsound] Function definition missing

tests/regression/04-mutex/93-distribute-fields-type-global.t

+1
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@
2323
[Info][Imprecise] Invalidating expressions: AddrOf(Var(s, NoOffset)) (93-distribute-fields-type-global.c:13:3-13:29)
2424
[Info][Imprecise] Invalidating expressions: AddrOf(Var(tmp, NoOffset)) (93-distribute-fields-type-global.c:13:3-13:29)
2525
[Error][Imprecise][Unsound] Function definition missing for getS (93-distribute-fields-type-global.c:13:3-13:29)
26+
[Error][Imprecise][Unsound] Function definition missing

tests/regression/06-symbeq/16-type_rc.t

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Disable info messages because race summary contains (safe) memory location count
1010
write with [mhp:{tid=[main]; created={[main, t_fun@16-type_rc.c:35:3-35:37#top]}}, thread:[main]] (conf. 100) (exp: & *d) (16-type_rc.c:36:3-36:9)
1111
[Error][Imprecise][Unsound] Function definition missing for get_s (16-type_rc.c:20:12-20:24)
1212
[Error][Imprecise][Unsound] Function definition missing for get_s (16-type_rc.c:31:3-31:14)
13+
[Error][Imprecise][Unsound] Function definition missing
1314

1415
$ goblint --enable warn.deterministic --disable warn.info --disable ana.race.direct-arithmetic --set ana.activated[+] "'var_eq'" --set ana.activated[+] "'symb_locks'" --enable allglobs 16-type_rc.c
1516
[Warning][Behavior > Undefined > NullPointerDereference][CWE-476] May dereference NULL pointer (16-type_rc.c:21:3-21:15)
@@ -20,3 +21,4 @@ Disable info messages because race summary contains (safe) memory location count
2021
write with [mhp:{tid=[main, t_fun@16-type_rc.c:35:3-35:37#top]}, thread:[main, t_fun@16-type_rc.c:35:3-35:37#top]] (conf. 100) (exp: & s->datum) (16-type_rc.c:21:3-21:15)
2122
[Error][Imprecise][Unsound] Function definition missing for get_s (16-type_rc.c:20:12-20:24)
2223
[Error][Imprecise][Unsound] Function definition missing for get_s (16-type_rc.c:31:3-31:14)
24+
[Error][Imprecise][Unsound] Function definition missing

tests/regression/06-symbeq/21-mult_accs_rc.t

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Disable info messages because race summary contains (safe) memory location count
1515
[Error][Imprecise][Unsound] Function definition missing for get_s (21-mult_accs_rc.c:13:3-13:14)
1616
[Error][Imprecise][Unsound] Function definition missing for get_s (21-mult_accs_rc.c:15:3-15:14)
1717
[Error][Imprecise][Unsound] Function definition missing for get_s (21-mult_accs_rc.c:27:3-27:14)
18+
[Error][Imprecise][Unsound] Function definition missing
1819

1920
$ goblint --enable warn.deterministic --disable warn.info --disable ana.race.direct-arithmetic --set ana.activated[+] "'var_eq'" --set ana.activated[+] "'symb_locks'" --enable allglobs 21-mult_accs_rc.c
2021
[Warning][Behavior > Undefined > NullPointerDereference][CWE-476] May dereference NULL pointer (21-mult_accs_rc.c:14:3-14:32)
@@ -30,3 +31,4 @@ Disable info messages because race summary contains (safe) memory location count
3031
[Error][Imprecise][Unsound] Function definition missing for get_s (21-mult_accs_rc.c:13:3-13:14)
3132
[Error][Imprecise][Unsound] Function definition missing for get_s (21-mult_accs_rc.c:15:3-15:14)
3233
[Error][Imprecise][Unsound] Function definition missing for get_s (21-mult_accs_rc.c:27:3-27:14)
34+
[Error][Imprecise][Unsound] Function definition missing

0 commit comments

Comments
 (0)