diff --git a/src/plugins/e-acsl/tests/csrv14/benchmark3.c b/src/plugins/e-acsl/tests/csrv14/benchmark3.c index c0280eef2ccc04d9a36dbb5e32a4b5605ff406c3..9ba866170c1d7cdfb5bdbbf11c233d534e9fd352 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 22c0559c035279eaa2810a0c6ebca4897a0edce9..67667f2bd038d6f9381f9c877df97ebde5b525e4 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; }