--- layout: fc_discuss_archives title: Message 45 from Frama-C-discuss on May 2010 ---
Hi, > I'm very surprised that you could prove your post-condition with > HAVOC. For me you need a smart loop invariant for the inner loop to > prove it. Could you double-check the annotations you gave to havoc, > and perhaps share the annotated file with us ? That's not exactly what I meant. I cannot verify the example below (with the given invariants in the inner loop) with HAVOC. The bubble sort example comes in the HAVOC package, and in the original code (with havoc annotation) there is another invariant for the inner loop. Below is the HAVOC annotated code where using Z3 , the post condition can be verified. ---------------------------- typedef int *PINT; __declare_havoc_bvar(_H_i); __declare_havoc_bvar(_H_j); #define array_elems(a,s,t) (__setminus(__array(a, sizeof(int), t) , __array(a, sizeof(int), s))) #define all_array_elems(a,t) array_elems(a,0,t) #define sorted(a,s) (__forall(__qvars(_H_i,_H_j), all_array_elems(a,s), _H_i <= _H_j ==> *_H_i <= *_H_j)) #define TRUE 1 #define FALSE 0 __requires(arr > 0) __requires(__forall(_H_i, all_array_elems(arr,size), __type(_H_i, PINT))) __requires(size > 0) __ensures(sorted(arr,size)) __modifies (all_array_elems(arr,size)) void bubble_sort(int *arr, int size) { __loop_invariant( __loop_modifies (all_array_elems(arr,size)) ) while (TRUE) { int aux = 0; int i = 0; __loop_invariant ( __loop_assert(0 <= i && i < size) __loop_assert(__forall(__qvars(_H_i,_H_j), array_elems(arr, aux, i+1), _H_i <= _H_j ==> *_H_i <= *_H_j)) __loop_modifies (all_array_elems(arr,size)) ) while (i < size-1) { if (arr[i] > arr[i+1]) { int tmp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = tmp; aux = i; } i++; } if (aux == 0) break; } } ------------------------------------- I was trying to verifying the same code using Frama-C. Even if I translate the second loop_assert for the inner loop as following: @ loop invariant \forall int a,b; ((aux < a <= i+1) && (aux < b <= i+1) ==> (a <= b ==> arr[a] <= arr[b])); (which I am not sure if it is completely equivalent to the HAVOC notation), I still cannot use Frama-C to verify this code. Then I tried the implementation that was suggested by Pascal (on this mailing list) and I cannot verify even th eother implementation using Frama-C. I am relatively new to both tools. I have worked with Boogie and Z3 before, but not with HAVOC front end, so now exploring both HAVOC and jessie plugin at the same time. That's why I am trying to use the same implementation. I really appreciate any help and suggestions. > Regarding the termination of the loop: my guess is that by default, > havoc does not check termination. Yes, ture, havoc cannot check for termination. But with the above example, it comes back with an answer that the post-condition is verified. thanks, naghmeh > > - Claude > >> In my version of jessie, I cannot use #pragma >> JessieTerminationPolicy (user). It is not recognized in my version. >> >> cheers, >> naghmeh >> >> #define TRUE 1 >> #define FALSE 0 >> >> >> /*@ requires size > 0; >> @ requires \valid(arr+ (0..size-1)); >> @ ensures \forall int i; 0 <= i <= size - 2 ==> arr[i] <= arr[i+1]; >> */ >> >> void bubble_sort(int *arr, int size) { >> >> while (TRUE) { >> int aux = 0; >> int i = 0; >> >> /*@ loop invariant 0 <= i && i <= size -1 ; >> @ loop variant size - i; >> @*/ >> while (i < size-1) { >> if (arr[i] > arr[i+1]) { >> int tmp = arr[i]; >> arr[i] = arr[i+1]; >> arr[i+1] = tmp; >> aux = i; >> } >> i++; >> } >> if (aux == 0) break; >> } >> } >> >> >> >> >> >> >> _______________________________________________ >> Frama-c-discuss mailing list >> Frama-c-discuss at lists.gforge.inria.fr >> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/frama-c-discuss > >