-
Notifications
You must be signed in to change notification settings - Fork 273
/
Copy pathspec.c
75 lines (63 loc) · 1.34 KB
/
spec.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "driver.h"
int usecount;
int dummy_major;
int register_chrdev (unsigned int major, const char* name)
{
usecount = 0;
if (major == 0)
return MAJOR_NUMBER;
return major;
}
int unregister_chrdev (unsigned int major, const char* name)
{
if (MOD_IN_USE)
{
ERROR: __CPROVER_assert(0, "MOD_IN_USE in unregister_chrdev");
}
else
return 0;
}
int main ()
{
int rval;
int size;
struct file my_file;
char *buffer; /* we do not model this buffer */
struct inode inode;
unsigned int count;
unsigned char random;
int lock_held = 0;
dummy_major = register_chrdev (0, "dummy");
inode.i_rdev = dummy_major << MINORBITS;
init_module ();
/* assign arbitrary values */
my_file.f_mode = nondet_uint ();
my_file.f_pos = nondet_uint ();
do
{
random = nondet_uchar ();
__CPROVER_assume (0 <= random && random <= 3);
switch (random)
{
case 1:
rval = dummy_open (&inode, &my_file);
if (rval == 0)
lock_held = TRUE;
break;
case 2:
__CPROVER_assume (lock_held);
count = dummy_read (&my_file, buffer, BUF_SIZE);
break;
case 3:
dummy_release (&inode, &my_file);
lock_held = FALSE;
break;
default:
break;
}
}
while (random || lock_held);
cleanup_module ();
unregister_chrdev (dummy_major, "dummy");
return 0;
}