source: CIVL/examples/loop_invariants/verifyThisUB/largestCommonPrefix/lcp-bad_assert.c@ bb03188

main test-branch
Last change on this file since bb03188 was ea777aa, checked in by Alex Wilton <awilton@…>, 3 years ago

Moved examples, include, build_default.properties, common.xml, and README out from dev.civl.com into the root of the repo.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5704 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 1.5 KB
Line 
1/*
2Author: Yihao Yan
3
4Download LCP.zip from: http://fm2012.verifythis.org/challenges
5
6-----------------
7Problem decription:
8
9Longest Common Prefix (LCP)
10Input: an integer array X1[n], and two indices x and y into this array
11Output: length of the longest common prefix of the subarrays of a
12 starting at x and y respectively.
13
14-----------------
15Verification task:
16
17Implement the lcp function, and verify that it behaves in the way described above.
18
19-----------------
20Result:
21
22For arrays with length less than 5, lcp function returns an integer n which is
23the length of the longest common prefix between its two suffixes: The two suffixes
24are the same with indexes from 0 to n-1 while they are different at index n. Therefore
25the lcp function behave correctly.
26
27-----------------
28command: civl verify lcp.c
29*/
30
31#include <civlc.cvh>
32#pragma CIVL ACSL
33$input int n, x, y;
34$assume (0 <= x && x < n && 0 <= y && y < n && 0 < n);
35$input int X1[n];
36
37int lcp(int *arr, int n, int x, int y){
38 int l = 0;
39
40 /*@ loop invariant 0 <= l && l <= n;
41 @ loop invariant 0 <= x + l && x + l <= n;
42 @ loop invariant 0 <= y + l && y + l <= n;
43 @ loop invariant \forall int i; 0 <= i && i < l ==> arr[x+i]==arr[y+i];
44 @ loop assigns l;
45 @*/
46 while (x+l<n && y+l<n && arr[x+l]==arr[y+l])
47 l++;
48 return l;
49}
50
51void main(){
52 int result = lcp(X1, n, x, y);
53
54 $assert($forall (int i: 0 .. result-1) X1[x+i] == X1[y+i]);
55 $assert(
56 (x + result < n && y + result < n) => X1[x+result] == X1[y+result]
57 );
58}
Note: See TracBrowser for help on using the repository browser.