diff --git a/tests/value/logic.c b/tests/value/logic.c index eeea0f321b921cfa138049c8a2c06c30e0ae7e43..8806b1930519098b26629b39b460e9e53098c516 100644 --- a/tests/value/logic.c +++ b/tests/value/logic.c @@ -437,6 +437,72 @@ void float_abs () { Frama_C_show_each_0_3(x); } +/* Tests the evaluation of the [Tcomprehension] ACSL constructor. */ +void set_comprehension () { + int x = v; + if (v) { + //@ assert x \in { i | integer i; 10 <= i <= 100 }; + Frama_C_show_each_10_100(x); + } + if (v) { + //@ assert x \in { i | int i; 10 <= i <= 100 }; + Frama_C_show_each_10_100(x); + } + if (v) { + //@ assert x \in { 3*i + 1 | integer i; 10 <= i <= 100 }; + Frama_C_show_each_31_301(x); + } + if (v) { + //@ assert x \in { i | integer i; 10 <= 2*i <= 100 }; + Frama_C_show_each_5_50(x); // No reduction of i through the multiplication + } + if (v) { + //@ assert x \in { i-i | integer i; 10 <= i <= 100 }; + Frama_C_show_each_0(x); // Imprecise evaluation of i-i in the logic + } + if (v) { + //@ assert x \in { i-i | integer i; 100 <= i <= 10 }; + Frama_C_show_each_bottom(x); // No reduction on bottom + } + int a = Frama_C_interval(12, 24); + int b = Frama_C_interval(16, 32); + if (v) { + //@ assert x \in { i | integer i; a <= i <= b }; + Frama_C_show_each_12_32(x); + } + if (v) { + //@ assert x \in { i | integer i; b <= i <= a }; + Frama_C_show_each_16_24(x); + } + if (v) { + //@ assert x \in { 10*i + j | integer i, j; 2 <= i <= 6 && 3 < j < 9 }; + Frama_C_show_each_24_68(x); + } + int t[15] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47}; + if (v) { + //@ assert x \in { t[i] | integer i; 2 <= i <= 12 }; + Frama_C_show_each_5_41(x); + } + if (v) { + //@ assert x \in { t[i] | integer i; 5 <= i <= 25 }; + Frama_C_show_each(x); // No reduction because of the alarm + } +} + +//@ assigns { p[i][j] | int i, j; a <= i <= b && 0 <= j < size } \from \nothing; +void multi_memset (char **p, int a, int b, int size); + +/* Tests assigns clauses through locations defined with set comprehension. */ +void set_comprehension_assigns () { + char buf0[10] = {0}; + char buf1[12] = {0}; + char buf2[8] = {0}; + char buf3[10] = {0}; + char *p[4] = {&buf0, &buf1, &buf2, &buf3 }; + // assigns the 10 first cells of buf1 and buf2. Others remain at 0. + multi_memset(p, 1, 2, 10); +} + void main () { eq_tsets(); eq_char(); @@ -453,4 +519,6 @@ void main () { min_max_quantifier (); int_abs(); float_abs(); + set_comprehension(); + set_comprehension_assigns(); } diff --git a/tests/value/oracle/logic.res.oracle b/tests/value/oracle/logic.res.oracle index 069377d7cf41cf998dad89d491ccbd8e64839ca3..19994a9a280818d245b4d60cd76ce1e612fb0e48 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 tests/value/logic.c:441. + Called from tests/value/logic.c:507. [eva] tests/value/logic.c:103: cannot evaluate ACSL term, unsupported ACSL construct: == operation on non-supported type set<_#8> [eva:alarm] tests/value/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 tests/value/logic.c:442. + Called from tests/value/logic.c:508. [eva] tests/value/logic.c:149: Frama_C_show_each: {-126} [eva] tests/value/logic.c:150: assertion got status valid. [eva] tests/value/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 tests/value/logic.c:443. + Called from tests/value/logic.c:509. [eva] tests/value/logic.c:155: assertion got status valid. [eva] tests/value/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 tests/value/logic.c:444. + Called from tests/value/logic.c:510. [eva] computing for function f_empty_tset <- empty_tset <- main. Called from tests/value/logic.c:166. [eva] using specification for function f_empty_tset @@ -82,7 +82,7 @@ [eva] Recording results for empty_tset [eva] Done for function empty_tset [eva] computing for function reduce_by_equal <- main. - Called from tests/value/logic.c:445. + Called from tests/value/logic.c:511. [eva:alarm] tests/value/logic.c:172: Warning: accessing out of bounds index. assert 0 ≤ v; [eva:alarm] tests/value/logic.c:172: Warning: @@ -92,7 +92,7 @@ [eva] Recording results for reduce_by_equal [eva] Done for function reduce_by_equal [eva] computing for function alarms <- main. - Called from tests/value/logic.c:446. + Called from tests/value/logic.c:512. [eva:alarm] tests/value/logic.c:182: Warning: assertion 'ASSUME' got status unknown. [eva:alarm] tests/value/logic.c:184: Warning: @@ -124,7 +124,7 @@ [eva] Recording results for alarms [eva] Done for function alarms [eva] computing for function cond_in_lval <- main. - Called from tests/value/logic.c:447. + Called from tests/value/logic.c:513. [eva] computing for function select_like <- cond_in_lval <- main. Called from tests/value/logic.c:228. [eva] using specification for function select_like @@ -152,7 +152,7 @@ [eva] Recording results for cond_in_lval [eva] Done for function cond_in_lval [eva] computing for function pred <- main. - Called from tests/value/logic.c:448. + Called from tests/value/logic.c:514. [eva] tests/value/logic.c:90: assertion got status valid. [eva] tests/value/logic.c:91: assertion got status valid. [eva] tests/value/logic.c:31: @@ -201,7 +201,7 @@ [eva] Recording results for pred [eva] Done for function pred [eva] computing for function float_sign <- main. - Called from tests/value/logic.c:449. + Called from tests/value/logic.c:515. [eva] tests/value/logic.c:251: assertion got status valid. [eva] tests/value/logic.c:252: assertion got status valid. [eva] tests/value/logic.c:253: assertion got status valid. @@ -210,7 +210,7 @@ [eva] Recording results for float_sign [eva] Done for function float_sign [eva] computing for function min_max <- main. - Called from tests/value/logic.c:450. + Called from tests/value/logic.c:516. [eva] computing for function Frama_C_interval <- min_max <- main. Called from tests/value/logic.c:274. [eva] using specification for function Frama_C_interval @@ -235,7 +235,7 @@ [eva] Recording results for min_max [eva] Done for function min_max [eva] computing for function assign_tsets <- main. - Called from tests/value/logic.c:451. + Called from tests/value/logic.c:517. [eva] computing for function assign_tsets_aux <- assign_tsets <- main. Called from tests/value/logic.c:269. [eva] using specification for function assign_tsets_aux @@ -243,7 +243,7 @@ [eva] Recording results for assign_tsets [eva] Done for function assign_tsets [eva] computing for function check_and_assert <- main. - Called from tests/value/logic.c:452. + Called from tests/value/logic.c:518. [eva:alarm] tests/value/logic.c:295: Warning: assertion got status unknown. [eva] tests/value/logic.c:296: Frama_C_show_each_42: {42} [eva] tests/value/logic.c:297: check got status valid. @@ -258,7 +258,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 tests/value/logic.c:453. + Called from tests/value/logic.c:519. [eva] tests/value/logic.c:321: check 'valid' got status valid. [eva] tests/value/logic.c:322: check 'valid' got status valid. [eva] tests/value/logic.c:323: check 'valid' got status valid. @@ -332,7 +332,7 @@ [eva] Recording results for min_max_quantifier [eva] Done for function min_max_quantifier [eva] computing for function int_abs <- main. - Called from tests/value/logic.c:454. + Called from tests/value/logic.c:520. [eva] computing for function abs <- int_abs <- main. Called from tests/value/logic.c:365. [eva] using specification for function abs @@ -455,7 +455,7 @@ [eva] Recording results for int_abs [eva] Done for function int_abs [eva] computing for function float_abs <- main. - Called from tests/value/logic.c:455. + Called from tests/value/logic.c:521. [eva] computing for function fabs <- float_abs <- main. Called from tests/value/logic.c:421. [eva] using specification for function fabs @@ -513,6 +513,51 @@ [eva] tests/value/logic.c:437: Frama_C_show_each_0_3: [-0. .. 3.] [eva] Recording results for float_abs [eva] Done for function float_abs +[eva] computing for function set_comprehension <- main. + Called from tests/value/logic.c:522. +[eva:alarm] tests/value/logic.c:444: Warning: assertion got status unknown. +[eva] tests/value/logic.c:445: Frama_C_show_each_10_100: [10..100] +[eva:alarm] tests/value/logic.c:448: Warning: assertion got status unknown. +[eva] tests/value/logic.c:449: Frama_C_show_each_10_100: [10..100] +[eva:alarm] tests/value/logic.c:452: Warning: assertion got status unknown. +[eva] tests/value/logic.c:453: Frama_C_show_each_31_301: [31..301],1%3 +[eva:alarm] tests/value/logic.c:456: Warning: assertion got status unknown. +[eva] tests/value/logic.c:457: Frama_C_show_each_5_50: [-2147483648..2147483647] +[eva:alarm] tests/value/logic.c:460: Warning: assertion got status unknown. +[eva] tests/value/logic.c:461: Frama_C_show_each_0: [-90..90] +[eva:alarm] tests/value/logic.c:464: Warning: assertion got status unknown. +[eva] tests/value/logic.c:465: + Frama_C_show_each_bottom: [-2147483648..2147483647] +[eva] computing for function Frama_C_interval <- set_comprehension <- main. + Called from tests/value/logic.c:467. +[eva] tests/value/logic.c:467: + function Frama_C_interval: precondition 'order' got status valid. +[eva] Done for function Frama_C_interval +[eva] computing for function Frama_C_interval <- set_comprehension <- main. + Called from tests/value/logic.c:468. +[eva] tests/value/logic.c:468: + function Frama_C_interval: precondition 'order' got status valid. +[eva] Done for function Frama_C_interval +[eva:alarm] tests/value/logic.c:470: Warning: assertion got status unknown. +[eva] tests/value/logic.c:471: Frama_C_show_each_12_32: [12..32] +[eva:alarm] tests/value/logic.c:474: Warning: assertion got status unknown. +[eva] tests/value/logic.c:475: Frama_C_show_each_16_24: [16..24] +[eva:alarm] tests/value/logic.c:478: Warning: assertion got status unknown. +[eva] tests/value/logic.c:479: Frama_C_show_each_24_68: [24..68] +[eva:alarm] tests/value/logic.c:483: Warning: assertion got status unknown. +[eva] tests/value/logic.c:484: Frama_C_show_each_5_41: [5..41],1%2 +[eva:alarm] tests/value/logic.c:487: Warning: assertion got status unknown. +[eva] tests/value/logic.c:488: Frama_C_show_each: [-2147483648..2147483647] +[eva] Recording results for set_comprehension +[eva] Done for function set_comprehension +[eva] computing for function set_comprehension_assigns <- main. + Called from tests/value/logic.c:523. +[eva] computing for function multi_memset <- set_comprehension_assigns <- main. + Called from tests/value/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] Recording results for main [eva] done for function main [scope:rm_asserts] removing 5 assertion(s) @@ -657,6 +702,36 @@ b.i1 ∈ {6} .i2 ∈ {8} x_0 ∈ [-2147483648..0] +[eva:final-states] Values at end of function set_comprehension: + Frama_C_entropy_source ∈ [--..--] + x_0 ∈ [--..--] + a ∈ [12..24] + b ∈ [16..32] + t_0[0] ∈ {2} + [1] ∈ {3} + [2] ∈ {5} + [3] ∈ {7} + [4] ∈ {11} + [5] ∈ {13} + [6] ∈ {17} + [7] ∈ {19} + [8] ∈ {23} + [9] ∈ {29} + [10] ∈ {31} + [11] ∈ {37} + [12] ∈ {41} + [13] ∈ {43} + [14] ∈ {47} +[eva:final-states] Values at end of function set_comprehension_assigns: + buf0[0..9] ∈ {0} + buf1[0..9] ∈ [--..--] + [10..11] ∈ {0} + buf2[0..7] ∈ [--..--] + buf3[0..9] ∈ {0} + p[0] ∈ {{ &buf0[0] }} + [1] ∈ {{ &buf1[0] }} + [2] ∈ {{ &buf2[0] }} + [3] ∈ {{ &buf3[0] }} [eva:final-states] Values at end of function unsup: t_T{.z; .t} ∈ {21} [eva:final-states] Values at end of function pred: @@ -725,6 +800,12 @@ [from] Computing for function select_like <-cond_in_lval [from] Done for function select_like [from] Done for function cond_in_lval +[from] Computing for function set_comprehension +[from] Done for function set_comprehension +[from] Computing for function set_comprehension_assigns +[from] Computing for function multi_memset <-set_comprehension_assigns +[from] Done for function multi_memset +[from] Done for function set_comprehension_assigns [from] Computing for function unsup [from] Done for function unsup [from] Computing for function pred @@ -778,6 +859,9 @@ Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) [from] Function min_max_quantifier: Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) +[from] Function multi_memset: + buf1[0..9] FROM \nothing (and SELF) + buf2[0..7] FROM \nothing (and SELF) [from] Function reduce_by_equal: NO EFFECTS [from] Function select_like: @@ -786,6 +870,10 @@ b FROM p; q; a; b (and SELF) [from] Function cond_in_lval: NO EFFECTS +[from] Function set_comprehension: + Frama_C_entropy_source FROM Frama_C_entropy_source (and SELF) +[from] Function set_comprehension_assigns: + NO EFFECTS [from] Function unsup: t_T FROM \nothing [from] Function pred: @@ -866,6 +954,14 @@ a; out; b; x_0 [inout] Inputs for function cond_in_lval: v +[inout] Out (internal) for function set_comprehension: + Frama_C_entropy_source; x_0; a; b; t_0[0..14] +[inout] Inputs for function set_comprehension: + Frama_C_entropy_source; v +[inout] Out (internal) for function set_comprehension_assigns: + buf0[0..9]; buf1[0..11]; buf2[0..7]; buf3[0..9]; p[0..3] +[inout] Inputs for function set_comprehension_assigns: + \nothing [inout] Out (internal) for function unsup: t_T [inout] Inputs for function unsup: