diff --git a/Changelog b/Changelog index 623565a33191e0e7cc2981f02586ebe6513117f2..af982521df4008755c7375baf505f081d9ea2490 100644 --- a/Changelog +++ b/Changelog @@ -20,6 +20,8 @@ Open Source Release <next-release> o! Kernel [2023-09-25] Remove Dynamic.Unloadable exception, useless since the move from dynamic to static API for plug-ins. +- Eva [2023-09-26] Support evaluation of simple \let bindings in + ACSL terms and predicates. - Alias [2023-09-07] New alias plugin that implements a points-to analysis and an alias analysis based on Steensgaard's algorithm. For these purposes it presents a more efficient (albeit less diff --git a/src/plugins/e-acsl/tests/arith/oracle/at_on-purely-logic-variables.res.oracle b/src/plugins/e-acsl/tests/arith/oracle/at_on-purely-logic-variables.res.oracle index dfb2831b7e1fb2c512075fbb37544a05759f0641..be579f0c089d5e145728881ec7f99f776477edb4 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/at_on-purely-logic-variables.res.oracle +++ b/src/plugins/e-acsl/tests/arith/oracle/at_on-purely-logic-variables.res.oracle @@ -104,8 +104,6 @@ [eva:alarm] at_on-purely-logic-variables.c:8: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. -[eva:alarm] at_on-purely-logic-variables.c:8: Warning: - function __gen_e_acsl_f: postcondition got status unknown. [eva:alarm] at_on-purely-logic-variables.c:16: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. diff --git a/src/plugins/e-acsl/tests/arith/oracle/let.res.oracle b/src/plugins/e-acsl/tests/arith/oracle/let.res.oracle index 85052dd4ea7316d44413049ff6732f212331098e..c5e891963e67ed9e48b55760010e0f968d7b0652 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/let.res.oracle +++ b/src/plugins/e-acsl/tests/arith/oracle/let.res.oracle @@ -9,7 +9,6 @@ [eva:alarm] let.c:7: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. -[eva:alarm] let.c:7: Warning: assertion got status unknown. [eva:alarm] let.c:10: Warning: function __e_acsl_assert_register_long: precondition data->values == \null || \valid(data->values) got status unknown. @@ -19,16 +18,12 @@ [eva:alarm] let.c:9: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. -[eva:alarm] let.c:9: Warning: assertion got status unknown. -[eva:alarm] let.c:13: Warning: assertion got status unknown. [eva:alarm] let.c:16: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. -[eva:alarm] let.c:15: Warning: assertion got status unknown. [eva:alarm] let.c:20: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. -[eva:alarm] let.c:19: Warning: assertion got status unknown. [eva:alarm] let.c:24: Warning: function __e_acsl_assert_register_long: precondition data->values == \null || \valid(data->values) got status unknown. @@ -40,11 +35,9 @@ \valid(data->values) got status unknown. [eva:alarm] let.c:24: Warning: function __e_acsl_assert, behavior blocking: precondition got status unknown. -[eva:alarm] let.c:24: Warning: assertion got status unknown. [eva:alarm] let.c:27: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. -[eva:alarm] let.c:27: Warning: assertion got status unknown. [eva:alarm] let.c:30: Warning: function __e_acsl_assert_register_float: precondition data->values == \null || \valid(data->values) got status unknown. diff --git a/src/plugins/e-acsl/tests/arith/oracle/quantif.res.oracle b/src/plugins/e-acsl/tests/arith/oracle/quantif.res.oracle index 975e9069daf2c99a92e3c70e6d3ae88b300b9d87..cf11459002f1821c1e89815272a46409efcf8364 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/quantif.res.oracle +++ b/src/plugins/e-acsl/tests/arith/oracle/quantif.res.oracle @@ -76,7 +76,6 @@ [eva:alarm] quantif.i:32: Warning: assertion got status unknown. [eva:alarm] quantif.i:47: Warning: function __e_acsl_assert, behavior blocking: precondition got status unknown. -[eva:alarm] quantif.i:54: Warning: assertion got status unknown. [eva:alarm] quantif.i:63: Warning: assertion 'forall_multiple_binders_2' got status unknown. [eva:alarm] quantif.i:66: Warning: diff --git a/src/plugins/e-acsl/tests/arith/oracle/rationals.res.oracle b/src/plugins/e-acsl/tests/arith/oracle/rationals.res.oracle index 444a3336dbb7b59bcf72c7399d89669a2fb6845e..5369620ae88c86367b489c9891f32dfdd33a899f 100644 --- a/src/plugins/e-acsl/tests/arith/oracle/rationals.res.oracle +++ b/src/plugins/e-acsl/tests/arith/oracle/rationals.res.oracle @@ -63,8 +63,6 @@ \valid(data->values) got status unknown. [eva:alarm] rationals.c:4: Warning: function __e_acsl_assert, behavior blocking: precondition got status unknown. -[eva:alarm] rationals.c:4: Warning: - function __gen_e_acsl_avg: postcondition got status unknown. [eva:alarm] rationals.c:28: Warning: function __e_acsl_assert, behavior blocking: precondition got status unknown. [eva:alarm] rationals.c:28: Warning: assertion got status unknown. diff --git a/src/plugins/e-acsl/tests/bts/oracle/issue69.res.oracle b/src/plugins/e-acsl/tests/bts/oracle/issue69.res.oracle index b4ebb69309d93985fd1365457c92e3c9389af275..f1fe7b2f966ab67583688e66c1953c46f6845304 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/issue69.res.oracle +++ b/src/plugins/e-acsl/tests/bts/oracle/issue69.res.oracle @@ -6,4 +6,3 @@ [eva:alarm] issue69.c:10: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. -[eva:alarm] issue69.c:10: Warning: assertion got status unknown. diff --git a/src/plugins/e-acsl/tests/constructs/oracle/printed_data.res.oracle b/src/plugins/e-acsl/tests/constructs/oracle/printed_data.res.oracle index f9589246d101d590ef5796c6a6b6ca0e6620532d..69585cc1635bd49b570fdae6888c54113e4fcf26 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/printed_data.res.oracle +++ b/src/plugins/e-acsl/tests/constructs/oracle/printed_data.res.oracle @@ -1,20 +1,7 @@ [e-acsl] beginning translation. [e-acsl] translation done in project "e-acsl". -[eva:alarm] printed_data.c:69: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:71: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:73: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:75: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:77: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:79: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:81: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:83: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:85: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:87: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:89: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:91: Warning: assertion got status unknown. [eva:alarm] printed_data.c:93: Warning: function __e_acsl_assert, behavior blocking: precondition got status unknown. -[eva:alarm] printed_data.c:93: Warning: assertion got status unknown. [eva:alarm] printed_data.c:98: Warning: assertion got status unknown. [eva:alarm] printed_data.c:100: Warning: assertion got status unknown. [eva] printed_data.c:101: Warning: @@ -29,7 +16,6 @@ [eva:alarm] printed_data.c:102: Warning: assertion got status unknown. [eva:alarm] printed_data.c:104: Warning: function __e_acsl_assert, behavior blocking: precondition got status unknown. -[eva:alarm] printed_data.c:104: Warning: assertion got status unknown. [eva:alarm] printed_data.c:113: Warning: function __e_acsl_assert_register_array: precondition data->values == \null || \valid(data->values) got status unknown. @@ -39,18 +25,6 @@ \valid(data->values) got status unknown. [eva:alarm] printed_data.c:123: Warning: assertion got status unknown. [eva:alarm] printed_data.c:128: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:133: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:135: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:137: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:139: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:141: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:143: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:145: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:147: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:149: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:151: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:153: Warning: assertion got status unknown. -[eva:alarm] printed_data.c:155: Warning: assertion got status unknown. [eva:alarm] printed_data.c:161: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. @@ -69,4 +43,3 @@ [eva:alarm] printed_data.c:161: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. -[eva:alarm] printed_data.c:161: Warning: assertion got status unknown. diff --git a/src/plugins/e-acsl/tests/constructs/oracle/rte.res.oracle b/src/plugins/e-acsl/tests/constructs/oracle/rte.res.oracle index 2edd48595be133ab838ee24c62105a3b2115d9e9..b4ef67fe9875b620068a64728a007151307ef09e 100644 --- a/src/plugins/e-acsl/tests/constructs/oracle/rte.res.oracle +++ b/src/plugins/e-acsl/tests/constructs/oracle/rte.res.oracle @@ -1,8 +1,5 @@ [e-acsl] beginning translation. [e-acsl] translation done in project "e-acsl". -[eva:alarm] rte.i:24: Warning: - function __gen_e_acsl_test, behavior bhvr: precondition \let var = 1; - var % j == 1 got status unknown. [eva:alarm] rte.i:24: Warning: function __gen_e_acsl_test, behavior bhvr: precondition \forall integer var; 0 <= var < k ==> diff --git a/src/plugins/e-acsl/tests/memory/oracle/ranges_in_builtins.res.oracle b/src/plugins/e-acsl/tests/memory/oracle/ranges_in_builtins.res.oracle index 25b29e657268924f21394d4f097ae54dc80d6846..9fa111188d02e2affab248706d8b35d275af1c3e 100644 --- a/src/plugins/e-acsl/tests/memory/oracle/ranges_in_builtins.res.oracle +++ b/src/plugins/e-acsl/tests/memory/oracle/ranges_in_builtins.res.oracle @@ -76,7 +76,6 @@ [eva:alarm] ranges_in_builtins.c:57: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. -[eva:alarm] ranges_in_builtins.c:57: Warning: assertion got status unknown. [eva:alarm] ranges_in_builtins.c:62: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. diff --git a/src/plugins/e-acsl/tests/special/oracle/e-acsl-external-print-value.res.oracle b/src/plugins/e-acsl/tests/special/oracle/e-acsl-external-print-value.res.oracle index eb1f35be8d738d8ce5f4358e58bf31dcfa272bd2..0b6fde6e6256bd60044381eed0142bc578cbcbbd 100644 --- a/src/plugins/e-acsl/tests/special/oracle/e-acsl-external-print-value.res.oracle +++ b/src/plugins/e-acsl/tests/special/oracle/e-acsl-external-print-value.res.oracle @@ -2,4 +2,4 @@ [e-acsl] translation done in project "e-acsl". [eva:alarm] e-acsl-external-print-value.c:7: Warning: function __e_acsl_assert, behavior non_blocking: precondition got status invalid. -[eva:alarm] e-acsl-external-print-value.c:7: Warning: check got status unknown. +[eva:alarm] e-acsl-external-print-value.c:7: Warning: check got status invalid. diff --git a/src/plugins/e-acsl/tests/special/oracle/e-acsl-no-assert-print-data.res.oracle b/src/plugins/e-acsl/tests/special/oracle/e-acsl-no-assert-print-data.res.oracle index 982d49ee960fcd4d1c6c8c838a11c0321ef073d6..9bcfd2ee685623053efe3827555705706945133d 100644 --- a/src/plugins/e-acsl/tests/special/oracle/e-acsl-no-assert-print-data.res.oracle +++ b/src/plugins/e-acsl/tests/special/oracle/e-acsl-no-assert-print-data.res.oracle @@ -2,4 +2,4 @@ [e-acsl] translation done in project "e-acsl". [eva:alarm] e-acsl-no-assert-print-data.c:14: Warning: function __e_acsl_assert, behavior non_blocking: precondition got status invalid. -[eva:alarm] e-acsl-no-assert-print-data.c:14: Warning: check got status unknown. +[eva:alarm] e-acsl-no-assert-print-data.c:14: Warning: check got status invalid. diff --git a/src/plugins/eva/Eva.mli b/src/plugins/eva/Eva.mli index 33d434deb9819cfe16e8506fe206fc62e690cf59..778fa0710e35a5e82c7627ef700acda5d56e7a11 100644 --- a/src/plugins/eva/Eva.mli +++ b/src/plugins/eva/Eva.mli @@ -745,11 +745,6 @@ module Logic_inout: sig pre:Cvalue.Model.t -> here:Cvalue.Model.t -> Cil_types.predicate -> Locations.Zone.t option - (** [term_deps state t] computes the logic dependencies needed to evaluate - the term [t] in cvalue state [state]. - Returns None on either an evaluation error or on unsupported construct. *) - val term_deps: Cvalue.Model.t -> Cil_types.term -> Locations.Zone.t option - (** Returns the list of behaviors of the given function that are active for the given initial state. *) val valid_behaviors: diff --git a/src/plugins/eva/legacy/eval_terms.ml b/src/plugins/eva/legacy/eval_terms.ml index 0eceb70bf4872593ecfed55d2ff0353f4261d740..6f7b8fe7f10a96f00f209706d8e1a3bf1a47cc0a 100644 --- a/src/plugins/eva/legacy/eval_terms.ml +++ b/src/plugins/eva/legacy/eval_terms.ml @@ -1321,12 +1321,15 @@ let rec eval_term ~alarm_mode env t = in { r with empty = true; ldeps } + | Tlet (li, t') -> + let env = eval_let_binding ~alarm_mode env li in + eval_term ~alarm_mode env t' + | Tlambda _ -> unsupported "logic functions or predicates" | TUpdate _ -> unsupported "functional updates" | Ttype _ -> unsupported "\\type operator" | Ttypeof _ -> unsupported "\\typeof operator" | Tinter _ -> unsupported "set intersection" - | Tlet _ -> unsupported "\\let bindings" | TConst (LStr _) -> unsupported "constant strings" | TConst (LWStr _) -> unsupported "wide constant strings" @@ -1633,6 +1636,15 @@ and bind_comprehension_quantifiers env quantifiers predicate = display_evaluation_error ~loc:pred.pred_loc error; env +and eval_let_binding ~alarm_mode env logic_info = + match logic_info with + | { l_labels = []; l_tparams = []; l_profile = []; l_body = LBterm term } -> + let var = logic_info.l_var_info in + let env = bind_logic_vars env [var] in + let var_term = Logic_const.tvar var in + reduce_by_left_relation ~alarm_mode env true var_term Req term + | _ -> unsupported "\\let binding" + (* -------------------------------------------------------------------------- *) (* --- Evaluation of term lval and of terms as location --- *) (* -------------------------------------------------------------------------- *) @@ -2284,6 +2296,16 @@ and reduce_by_predicate ~alarm_mode env positive p = unbind_logic_vars env_result varl with LogicEvalError _ -> env end + + | _, Plet (li, p') -> + begin + try + let env = eval_let_binding ~alarm_mode env li in + let env_result = reduce_by_predicate ~alarm_mode env positive p' in + unbind_logic_vars env_result [li.l_var_info] + with LogicEvalError _ -> env + end + | _,Papp (li, labels, args) -> begin if is_known_predicate li.l_var_info then try reduce_by_known_papp ~alarm_mode env positive li labels args @@ -2316,7 +2338,6 @@ and reduce_by_predicate ~alarm_mode env positive p = | false, false -> assert false (* a logic alarm would have been raised*) end | true, Pexists (_, _) | false, Pforall (_, _) - | _,Plet (_, _) | _,Pallocable (_,_) | _,Pfreeable (_,_) | _,Pfresh (_,_,_,_) | _, Pseparated _ -> env @@ -2513,6 +2534,10 @@ and eval_predicate env pred = | _ -> Unknown end + | Plet (li, p') -> + let env = eval_let_binding ~alarm_mode env li in + do_eval env p' + | Pnot p -> begin match do_eval env p with | True -> False | False -> True @@ -2586,10 +2611,7 @@ and eval_predicate env pred = | Pfreeable (BuiltinLabel Here, t) -> let r = eval_term ~alarm_mode env t in Builtins_malloc.freeable r.eover - | Pfresh (_,_,_,_) - | Pallocable _ | Pfreeable _ - | Plet (_,_) - -> Unknown + | Pfresh _ | Pallocable _ | Pfreeable _ -> Unknown (* Logic predicates. Update the list known_predicates above if you add something here. *) @@ -2690,6 +2712,13 @@ and predicate_deps env pred = let rec do_eval env p = let term_deps term = (eval_term ~alarm_mode env term).ldeps in let tsets_deps lbl tsets = eval_tsets_deps ~alarm_mode env lbl tsets in + let logic_info_deps li = + match li.l_body with + | LBnone -> empty_logic_deps + | LBterm t -> term_deps t + | LBpred p -> do_eval env p + | _ -> unsupported (Format.asprintf "%a" Printer.pp_logic_info li) + in match p.pred_content with | Ptrue | Pfalse -> empty_logic_deps @@ -2727,8 +2756,9 @@ and predicate_deps env pred = Logic_interp.do_term_lval. *) do_eval env p - | Plet (_v, p) -> do_eval env p (* will this work when when we need [_v] - to evaluate [p] ?.. *) + | Plet (li, p) -> + let env = eval_let_binding ~alarm_mode env li in + join_logic_deps (logic_info_deps li) (do_eval env p) | Papp (li, _labels, args) -> begin if is_known_predicate li.l_var_info then diff --git a/src/plugins/eva/legacy/logic_inout.mli b/src/plugins/eva/legacy/logic_inout.mli index 9ed96ed03ade8bc969f784768289f74663412b07..ddec2c39239451d647383b453d55c3800a534a7c 100644 --- a/src/plugins/eva/legacy/logic_inout.mli +++ b/src/plugins/eva/legacy/logic_inout.mli @@ -34,11 +34,6 @@ val predicate_deps: pre:Cvalue.Model.t -> here:Cvalue.Model.t -> Cil_types.predicate -> Locations.Zone.t option -(** [term_deps state t] computes the logic dependencies needed to evaluate - the term [t] in cvalue state [state]. - Returns None on either an evaluation error or on unsupported construct. *) -val term_deps: Cvalue.Model.t -> Cil_types.term -> Locations.Zone.t option - (** Returns the list of behaviors of the given function that are active for the given initial state. *) val valid_behaviors: diff --git a/tests/value/logic.c b/tests/value/logic.c index 8806b1930519098b26629b39b460e9e53098c516..b91a17f6003d68520e79c5f642ca7ccbb7406542 100644 --- a/tests/value/logic.c +++ b/tests/value/logic.c @@ -134,7 +134,7 @@ void eq_tsets () { //@ assert s1 == s2; // True at link-time //@ assert t != u; // false - //@ assert \union(0) == \union(0.0); + //@ assert \union(0) == \union(0.0); //@ assert \union(1.0) == \union(1); //@ assert \union(1, 1.0) == \union(1.0, 1); @@ -503,6 +503,41 @@ void set_comprehension_assigns () { multi_memset(p, 1, 2, 10); } +/* Tests the evaluation of \let bindings in ACSL predicates. */ +void plet () { + int x = Frama_C_interval(0, 120); + int y = Frama_C_interval(0, 10); + int z = Frama_C_interval(10, 30); + if (v) { + //@ assert unknown: \let l = 25; x < l; + Frama_C_show_each_0_24(x); + } + if (v) { + //@ assert true: \let l = 250; x < l; + Frama_C_show_each_0_120(x); + } + if (v) { + //@ assert false: \let l = 0; x < l; + Frama_C_show_each_bottom(x); + } + + /* Tests multiple \let bindings. */ + //@ assert true: \let l = y + z; \let l2 = 100; l < l2; + //@ assert unknown: \let l = y + z; \let l2 = x; l < l2; + + /* Tests the kind of assertions generated by the instantiate plugin. */ + unsigned int t[12]; + /*@ assert valid: \let __fc_len=12; \valid(t + (0 .. __fc_len-1)); */ + /*@ assert unknown: \let __fc_len=z; \valid(t + (0 .. __fc_len-1)); */ + if (v) { + /*@ assert invalid: \let __fc_len=12; \valid(t + (0 .. __fc_len)); */ + Frama_C_show_each_bottom(t); + } + + /* Unsupported \let bindings. */ + /*@ assert unsupported: \let id = (\lambda integer y; y); id(42) == 42; */ +} + void main () { eq_tsets(); eq_char(); @@ -521,4 +556,5 @@ void main () { float_abs(); set_comprehension(); set_comprehension_assigns(); + plet(); } diff --git a/tests/value/oracle/logic.res.oracle b/tests/value/oracle/logic.res.oracle index 30722c6f9202a123856a2607a254fc4cd1c34f78..f88f05e9117129bb86b043b56223a54f5c3c6475 100644 --- a/tests/value/oracle/logic.res.oracle +++ b/tests/value/oracle/logic.res.oracle @@ -14,7 +14,7 @@ arr_ptr[0..2] ∈ {0} arr_ptr_arr[0..5] ∈ {0} [eva] computing for function eq_tsets <- main. - Called from logic.c:507. + Called from logic.c:542. [eva] logic.c:103: cannot evaluate ACSL term, unsupported ACSL construct: == operation on non-supported type set<_#8> [eva:alarm] logic.c:103: Warning: assertion got status unknown. @@ -56,20 +56,20 @@ [eva] Recording results for eq_tsets [eva] Done for function eq_tsets [eva] computing for function eq_char <- main. - Called from logic.c:508. + Called from logic.c:543. [eva] logic.c:149: Frama_C_show_each: {-126} [eva] logic.c:150: assertion got status valid. [eva] logic.c:151: assertion got status valid. [eva] Recording results for eq_char [eva] Done for function eq_char [eva] computing for function casts <- main. - Called from logic.c:509. + Called from logic.c:544. [eva] logic.c:155: assertion got status valid. [eva] logic.c:156: assertion got status valid. [eva] Recording results for casts [eva] Done for function casts [eva] computing for function empty_tset <- main. - Called from logic.c:510. + Called from logic.c:545. [eva] computing for function f_empty_tset <- empty_tset <- main. Called from logic.c:166. [eva] using specification for function f_empty_tset @@ -80,7 +80,7 @@ [eva] Recording results for empty_tset [eva] Done for function empty_tset [eva] computing for function reduce_by_equal <- main. - Called from logic.c:511. + Called from logic.c:546. [eva:alarm] logic.c:172: Warning: accessing out of bounds index. assert 0 ≤ v; [eva:alarm] logic.c:172: Warning: accessing out of bounds index. assert v < 10; [eva:alarm] logic.c:173: Warning: assertion got status unknown. @@ -88,7 +88,7 @@ [eva] Recording results for reduce_by_equal [eva] Done for function reduce_by_equal [eva] computing for function alarms <- main. - Called from logic.c:512. + Called from logic.c:547. [eva:alarm] logic.c:182: Warning: assertion 'ASSUME' got status unknown. [eva:alarm] logic.c:184: Warning: assertion 'UNK' got status unknown. [eva] logic.c:185: Frama_C_show_each: {-1; 1} @@ -112,7 +112,7 @@ [eva] Recording results for alarms [eva] Done for function alarms [eva] computing for function cond_in_lval <- main. - Called from logic.c:513. + Called from logic.c:548. [eva] computing for function select_like <- cond_in_lval <- main. Called from logic.c:228. [eva] using specification for function select_like @@ -140,7 +140,7 @@ [eva] Recording results for cond_in_lval [eva] Done for function cond_in_lval [eva] computing for function pred <- main. - Called from logic.c:514. + Called from logic.c:549. [eva] logic.c:90: assertion got status valid. [eva] logic.c:91: assertion got status valid. [eva] logic.c:31: cannot evaluate ACSL term, \at() on a C label is unsupported @@ -185,7 +185,7 @@ [eva] Recording results for pred [eva] Done for function pred [eva] computing for function float_sign <- main. - Called from logic.c:515. + Called from logic.c:550. [eva] logic.c:251: assertion got status valid. [eva] logic.c:252: assertion got status valid. [eva] logic.c:253: assertion got status valid. @@ -194,7 +194,7 @@ [eva] Recording results for float_sign [eva] Done for function float_sign [eva] computing for function min_max <- main. - Called from logic.c:516. + Called from logic.c:551. [eva] computing for function Frama_C_interval <- min_max <- main. Called from logic.c:274. [eva] using specification for function Frama_C_interval @@ -219,7 +219,7 @@ [eva] Recording results for min_max [eva] Done for function min_max [eva] computing for function assign_tsets <- main. - Called from logic.c:517. + Called from logic.c:552. [eva] computing for function assign_tsets_aux <- assign_tsets <- main. Called from logic.c:269. [eva] using specification for function assign_tsets_aux @@ -227,7 +227,7 @@ [eva] Recording results for assign_tsets [eva] Done for function assign_tsets [eva] computing for function check_and_assert <- main. - Called from logic.c:518. + Called from logic.c:553. [eva:alarm] logic.c:295: Warning: assertion got status unknown. [eva] logic.c:296: Frama_C_show_each_42: {42} [eva] logic.c:297: check got status valid. @@ -241,7 +241,7 @@ [eva] Recording results for check_and_assert [eva] Done for function check_and_assert [eva] computing for function min_max_quantifier <- main. - Called from logic.c:519. + Called from logic.c:554. [eva] logic.c:321: check 'valid' got status valid. [eva] logic.c:322: check 'valid' got status valid. [eva] logic.c:323: check 'valid' got status valid. @@ -303,7 +303,7 @@ [eva] Recording results for min_max_quantifier [eva] Done for function min_max_quantifier [eva] computing for function int_abs <- main. - Called from logic.c:520. + Called from logic.c:555. [eva] computing for function abs <- int_abs <- main. Called from logic.c:365. [eva] using specification for function abs @@ -425,7 +425,7 @@ [eva] Recording results for int_abs [eva] Done for function int_abs [eva] computing for function float_abs <- main. - Called from logic.c:521. + Called from logic.c:556. [eva] computing for function fabs <- float_abs <- main. Called from logic.c:421. [eva] using specification for function fabs @@ -484,7 +484,7 @@ [eva] Recording results for float_abs [eva] Done for function float_abs [eva] computing for function set_comprehension <- main. - Called from logic.c:522. + Called from logic.c:557. [eva:alarm] logic.c:444: Warning: assertion got status unknown. [eva] logic.c:445: Frama_C_show_each_10_100: [10..100] [eva:alarm] logic.c:448: Warning: assertion got status unknown. @@ -520,15 +520,55 @@ [eva] Recording results for set_comprehension [eva] Done for function set_comprehension [eva] computing for function set_comprehension_assigns <- main. - Called from logic.c:523. + Called from logic.c:558. [eva] computing for function multi_memset <- set_comprehension_assigns <- main. Called from logic.c:503. [eva] using specification for function multi_memset [eva] Done for function multi_memset [eva] Recording results for set_comprehension_assigns [eva] Done for function set_comprehension_assigns +[eva] computing for function plet <- main. + Called from logic.c:559. +[eva] computing for function Frama_C_interval <- plet <- main. + Called from logic.c:508. +[eva] logic.c:508: + function Frama_C_interval: precondition 'order' got status valid. +[eva] Done for function Frama_C_interval +[eva] computing for function Frama_C_interval <- plet <- main. + Called from logic.c:509. +[eva] logic.c:509: + function Frama_C_interval: precondition 'order' got status valid. +[eva] Done for function Frama_C_interval +[eva] computing for function Frama_C_interval <- plet <- main. + Called from logic.c:510. +[eva] logic.c:510: + function Frama_C_interval: precondition 'order' got status valid. +[eva] Done for function Frama_C_interval +[eva:alarm] logic.c:512: Warning: assertion 'unknown' got status unknown. +[eva] logic.c:513: Frama_C_show_each_0_24: [0..24] +[eva] logic.c:516: assertion 'true' got status valid. +[eva] logic.c:517: Frama_C_show_each_0_120: [0..120] +[eva:alarm] logic.c:520: Warning: + assertion 'false' got status invalid (stopping propagation). +[eva] logic.c:525: assertion 'true' got status valid. +[eva:alarm] logic.c:526: Warning: assertion 'unknown' got status unknown. +[eva] logic.c:530: assertion 'valid' got status valid. +[eva:alarm] logic.c:531: Warning: assertion 'unknown' got status unknown. +[eva:alarm] logic.c:533: Warning: + assertion 'invalid' got status invalid (stopping propagation). +[eva] logic.c:538: + cannot evaluate ACSL term, unsupported ACSL construct: \let binding +[eva:alarm] logic.c:538: Warning: assertion 'unsupported' got status unknown. +[eva] Recording results for plet +[eva] Done for function plet [eva] Recording results for main [eva] Done for function main +[eva] logic.c:530: + Cannot evaluate range bound __fc_len - 1 + (unsupported logic var __fc_len). Approximating +[eva] logic.c:533: + Cannot evaluate range bound __fc_len + (unsupported logic var __fc_len). Approximating [scope:rm_asserts] removing 5 assertion(s) [eva] ====== VALUES COMPUTED ====== [eva:final-states] Values at end of function alarms: @@ -661,6 +701,11 @@ [61] ∈ {3} [62] ∈ {2} [63] ∈ {1} +[eva:final-states] Values at end of function plet: + Frama_C_entropy_source ∈ [--..--] + x_0 ∈ [0..120] + y ∈ [0..10] + z ∈ [10..30] [eva:final-states] Values at end of function reduce_by_equal: a[0..8] ∈ {1} [9] ∈ [--..--] @@ -762,6 +807,8 @@ [from] Done for function min_max [from] Computing for function min_max_quantifier [from] Done for function min_max_quantifier +[from] Computing for function plet +[from] Done for function plet [from] Computing for function reduce_by_equal [from] Done for function reduce_by_equal [from] Computing for function cond_in_lval @@ -830,6 +877,8 @@ [from] Function multi_memset: buf1[0..9] FROM \nothing (and SELF) buf2[0..7] FROM \nothing (and SELF) +[from] Function plet: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) [from] Function reduce_by_equal: NO EFFECTS [from] Function select_like: @@ -914,6 +963,10 @@ Frama_C_entropy_source; i; j; t_0[0..63] [inout] Inputs for function min_max_quantifier: Frama_C_entropy_source +[inout] Out (internal) for function plet: + Frama_C_entropy_source; x_0; y; z +[inout] Inputs for function plet: + Frama_C_entropy_source; v [inout] Out (internal) for function reduce_by_equal: a[0..9] [inout] Inputs for function reduce_by_equal: