diff --git a/src/plugins/wp/tests/wp_gallery/bsearch.c b/src/plugins/wp/tests/wp_gallery/bsearch.c new file mode 100644 index 0000000000000000000000000000000000000000..b3db3ebcc595bb7c7d77dd748ca7d1952bc7da7e --- /dev/null +++ b/src/plugins/wp/tests/wp_gallery/bsearch.c @@ -0,0 +1,35 @@ +/* run.config + DONTRUN: +*/ + +/* run.config_qualif + OPT: -wp-rte -wp-smoke-tests + */ + + +/*@ + requires size >= 0; + requires \valid(t + (0 .. size-1)); + requires ∀ integer i, integer j; 0 <= i <= j < size ==> t[i] <= t[j]; + ensures Result: -1 <= \result < size; + ensures Found: \result >= 0 ==> t[\result] == key; + ensures NotFound: \result == -1 ==> ∀ integer i; 0 <= i < size ==> t[i] != key; +*/ +int binary_search(int * t, int size, int key) +{ + int lo, hi, mid; + lo = 0; hi = size - 1; + /*@ + loop assigns lo, hi, mid; + loop invariant Range: 0 <= lo && hi < size; + loop invariant Left: ∀ integer i; 0 <= i < lo ==> t[i] < key; + loop invariant Right: ∀ integer i; hi < i < size ==> t[i] > key; + loop variant hi - lo; + */ + while (lo <= hi) { + mid = lo + (hi - lo) / 2; + if (key == t[mid]) return mid; + if (key < t[mid]) hi = mid - 1; else lo = mid + 1; + } + return -1; +} diff --git a/src/plugins/wp/tests/wp_gallery/oracle_qualif/bsearch.res.oracle b/src/plugins/wp/tests/wp_gallery/oracle_qualif/bsearch.res.oracle new file mode 100644 index 0000000000000000000000000000000000000000..9ce14bb3eb2c036e8dd052f4df9587d7cb3f30a5 --- /dev/null +++ b/src/plugins/wp/tests/wp_gallery/oracle_qualif/bsearch.res.oracle @@ -0,0 +1,40 @@ +# frama-c -wp -wp-rte [...] +[kernel] Parsing tests/wp_gallery/bsearch.c (with preprocessing) +[wp] Running WP plugin... +[rte] annotating function binary_search +[wp] 28 goals scheduled +[wp] [Passed] Smoke-test typed_binary_search_wp_smoke_default_requires +[wp] [Passed] Smoke-test typed_binary_search_wp_smoke_dead_loop_s3 +[wp] [Passed] Smoke-test typed_binary_search_wp_smoke_dead_code_s8 +[wp] [Passed] Smoke-test typed_binary_search_wp_smoke_dead_code_s12 +[wp] [Passed] Smoke-test typed_binary_search_wp_smoke_dead_code_s16 +[wp] [Passed] Smoke-test typed_binary_search_wp_smoke_dead_code_s17 +[wp] [Passed] Smoke-test typed_binary_search_wp_smoke_dead_code_s18 +[wp] [Alt-Ergo] Goal typed_binary_search_ensures_Result : Valid +[wp] [Qed] Goal typed_binary_search_ensures_Found : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_ensures_NotFound : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_assert_rte_signed_overflow : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_loop_invariant_Left_preserved : Valid +[wp] [Qed] Goal typed_binary_search_loop_invariant_Left_established : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_loop_invariant_Range_preserved : Valid +[wp] [Qed] Goal typed_binary_search_loop_invariant_Range_established : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_loop_invariant_Right_preserved : Valid +[wp] [Qed] Goal typed_binary_search_loop_invariant_Right_established : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_assert_rte_signed_overflow_2 : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_assert_rte_signed_overflow_3 : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_assert_rte_signed_overflow_4 : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_assert_rte_signed_overflow_5 : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_assert_rte_mem_access : Valid +[wp] [Qed] Goal typed_binary_search_assert_rte_mem_access_2 : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_assert_rte_signed_overflow_6 : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_assert_rte_signed_overflow_7 : Valid +[wp] [Qed] Goal typed_binary_search_loop_assigns : Valid +[wp] [Alt-Ergo] Goal typed_binary_search_loop_variant_decrease : Valid +[wp] [Qed] Goal typed_binary_search_loop_variant_positive : Valid +[wp] Proved goals: 28 / 28 + Qed: 7 + Alt-Ergo: 21 +------------------------------------------------------------ + Functions WP Alt-Ergo Total Success + binary_search 7 21 28 100% +------------------------------------------------------------