From 7587f3c01e47072af996640c397655d4267d9774 Mon Sep 17 00:00:00 2001
From: Julien Signoles <julien.signoles@cea.fr>
Date: Tue, 20 May 2014 10:01:46 +0200
Subject: [PATCH] [csrv'14] improve benchmark 3

---
 src/plugins/e-acsl/tests/csrv14/benchmark3.c  | 61 +++++++-------
 .../e-acsl/tests/csrv14/benchmark3.solution.c | 82 +++++++++----------
 2 files changed, 70 insertions(+), 73 deletions(-)

diff --git a/src/plugins/e-acsl/tests/csrv14/benchmark3.c b/src/plugins/e-acsl/tests/csrv14/benchmark3.c
index c0280eef2cc..9ba866170c1 100644
--- a/src/plugins/e-acsl/tests/csrv14/benchmark3.c
+++ b/src/plugins/e-acsl/tests/csrv14/benchmark3.c
@@ -2,21 +2,13 @@
 /* instructions */
 /* ************************************************************************** */
 /*
-
-   Detect an out-of-bounds access to arr[LEN] due to the call from main()
-     quicksort(arr, 0, LEN);  
-   instead of 
-     quicksort(arr, 0, LEN-1); 
-   Here this out-of-bounds access does not provoke a segmentation fault by chance
-   since it happens to access another array. Moreover, this access may
-   not provoke a sorting error by chance like in this example where the 
-   accessed element arr[LEN] is equal to the maximal element of the array arr.
-
+  Check that each call to the function [quicksort] is performed on an array
+  correctly allocated for each cell array[i], with left <= i <= right. 
 */
 /* ************************************************************************** */
 
-#include<stdio.h>
-#define LEN 2048 
+//#include<stdio.h>
+#define LEN 10000
 
 void swap(int* array, int i, int j) {
   int tmp = array[i];
@@ -46,28 +38,41 @@ void quicksort(int* array, int left, int right) {
   }
 }
 
-int main(void) {
+void init(int* arr1, int* arr2) {
   int i;
-  int arr[LEN];     // array to be sorted
-  int arr_max[LEN]; // array of maximal elements
 
-// filling arrays
-  arr[0] = 0; 
-  arr_max[0] = 9;
+  // filling arrays
+  arr1[0] = 0; 
+  arr2[0] = 9;
   for(i = 1; i < LEN; i++){
-    arr[i] = (13 * arr[i-1] + i) % 10; 
-    arr_max[i] = 9;
+    arr1[i] = (13 * arr1[i-1] + i) % 10; 
+    arr2[i] = 9;
   }
+}
+
+int main(void) {
+  int i;
+  int arr[LEN];     // array to be sorted
+  int arr_max[LEN]; // array of maximal elements
     
-  printf("\n Array before quicksort:\n");
-  for (i=0; i < LEN; i++) 
-    printf("%d, ",arr[i]);
-  
-  quicksort(arr, 0, LEN);  // error ! must be:  quicksort(arr, 0, LEN-1); 
+  init(arr, arr_max);
+
+  /* printf("\n Array before quicksort:\n"); */
+  /* for (i=0; i < LEN; i++) */
+  /*   printf("%d, ",arr[i]); */
+
+  quicksort(arr, 0, LEN-1);  
   
-  printf("\n Array after quicksort:\n");
-  for (i=0; i < LEN; i++) 
-    printf("%d, ",arr[i]);
+  /* printf("\n Array after quicksort:\n"); */
+  /* for (i=0; i < LEN; i++) */
+  /*   printf("%d, ",arr[i]); */
+
+  init(arr, arr_max);
+ 
+  /* error to be detected on the next function call. 
+     Should be:  quicksort(arr, 0, LEN-1) 
+     to prevent an out-of-bound access to arr[LEN] */
+  quicksort(arr, 0, LEN);
 
   return 0;
 }
diff --git a/src/plugins/e-acsl/tests/csrv14/benchmark3.solution.c b/src/plugins/e-acsl/tests/csrv14/benchmark3.solution.c
index 22c0559c035..67667f2bd03 100644
--- a/src/plugins/e-acsl/tests/csrv14/benchmark3.solution.c
+++ b/src/plugins/e-acsl/tests/csrv14/benchmark3.solution.c
@@ -2,44 +2,26 @@
 /* instructions */
 /* ************************************************************************** */
 /*
-
-   Detect an out-of-bounds access to arr[LEN] due to the call from main()
-     quicksort(arr, 0, LEN);  
-   instead of 
-     quicksort(arr, 0, LEN-1); 
-   Here this out-of-bounds access does not provoke a segmentation fault by chance
-   since it happens to access another array. Moreover, this access may
-   not provoke a sorting error by chance like in this example where the 
-   accessed element arr[LEN] is equal to the maximal element of the array arr.
-
+  Check that each call to the function [quicksort] is performed on an array
+  correctly allocated for each cell array[i], with left <= i <= right. 
 */
 /* ************************************************************************** */
 
-#include<stdio.h>
-#define LEN 2048 
+//#include<stdio.h>
+#define LEN 10000
 
-/*@ requires \valid(array+i);
-  @ requires \valid(array+j);
-  @ assigns array[i], array[j];
-  @ ensures array[i] == \old(array[j]);
-  @ ensures array[j] == \old(array[i]);
-  @*/
+/* /\*@ requires \valid(array+i); */
+/*   @ requires \valid(array+j); *\/ */
 void swap(int* array, int i, int j) {
   int tmp = array[i];
   array[i] = array[j];
   array[j] = tmp;
 }
 
-/*@ requires \forall integer j; left <= j <= right ==> \valid(array+j);
-  @ assigns array[left..right];
-  @*/
+///*@ requires \forall integer j; left <= j <= right ==> \valid(array+j); */
 int partition (int* array, int left, int right, int pivotIndex) {
   int pivotValue = array[pivotIndex], storeIndex = left, i;
   swap(array, pivotIndex, right);
-  /*@ loop invariant left <= i <= right;
-    @ loop assigns i, storeIndex, array[left..right];
-    @ loop variant right-i;
-    @*/
   for(i = left; i < right; i++) {
     if(array[i] <= pivotValue) {
       swap(array, i, storeIndex);
@@ -50,10 +32,7 @@ int partition (int* array, int left, int right, int pivotIndex) {
   return storeIndex;
 }
 
-/*@ requires \forall integer j; left <= j <= right ==> \valid(array+j);
-  @ assigns array[left..right];
-  @ ensures \forall int i; left <= i < right ==> array[i] <= array[i+1];
-  @*/
+/*@ requires \forall integer j; left <= j <= right ==> \valid(array+j); */
 void quicksort(int* array, int left, int right) {
   if(left < right) {
     int pivotIndex = (left+right)/2;
@@ -63,28 +42,41 @@ void quicksort(int* array, int left, int right) {
   }
 }
 
-int main(void) {
+void init(int* arr1, int* arr2) {
   int i;
-  int arr[LEN];     // array to be sorted
-  int arr_max[LEN]; // array of maximal elements
 
-// filling arrays
-  arr[0] = 0; 
-  arr_max[0] = 9;
+  // filling arrays
+  arr1[0] = 0; 
+  arr2[0] = 9;
   for(i = 1; i < LEN; i++){
-    arr[i] = (13 * arr[i-1] + i) % 10; 
-    arr_max[i] = 9;
+    arr1[i] = (13 * arr1[i-1] + i) % 10; 
+    arr2[i] = 9;
   }
+}
+
+int main(void) {
+  int i;
+  int arr[LEN];     // array to be sorted
+  int arr_max[LEN]; // array of maximal elements
     
-  printf("\n Array before quicksort:\n");
-  for (i=0; i < LEN; i++) 
-    printf("%d, ",arr[i]);
-  
-  quicksort(arr, 0, LEN);  // error ! must be:  quicksort(arr, 0, LEN-1); 
+  init(arr, arr_max);
+
+  /* printf("\n Array before quicksort:\n"); */
+  /* for (i=0; i < LEN; i++) */
+  /*   printf("%d, ",arr[i]); */
+
+  quicksort(arr, 0, LEN-1);  
   
-  printf("\n Array after quicksort:\n");
-  for (i=0; i < LEN; i++) 
-    printf("%d, ",arr[i]);
+  /* printf("\n Array after quicksort:\n"); */
+  /* for (i=0; i < LEN; i++) */
+  /*   printf("%d, ",arr[i]); */
+
+  init(arr, arr_max);
+ 
+  /* error to be detected on the next function call. 
+     Should be:  quicksort(arr, 0, LEN-1) 
+     to prevent an out-of-bound access to arr[LEN] */
+  quicksort(arr, 0, LEN);
 
   return 0;
 }
-- 
GitLab