Skip to content

Commit 1154f13

Browse files
committed
C library: add models of mmap, munmap
This will support analysis of low-level Linux software that uses mmap for memory allocation.
1 parent dae6c09 commit 1154f13

File tree

3 files changed

+179
-0
lines changed

3 files changed

+179
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include <sys/mman.h>
2+
3+
#include <fcntl.h>
4+
#include <stdint.h>
5+
#include <stdio.h>
6+
#include <unistd.h>
7+
8+
void *mapmem(off_t offset, size_t length)
9+
{
10+
int fd;
11+
uint8_t *mem, *tmp;
12+
const int prot = PROT_READ | PROT_WRITE;
13+
const int flags = MAP_SHARED;
14+
15+
mem = NULL;
16+
fd = open("/dev/mem", O_RDWR | O_CLOEXEC);
17+
if(fd == -1)
18+
goto out;
19+
20+
tmp = mmap(NULL, length, prot, flags, fd, offset);
21+
close(fd);
22+
if(tmp == MAP_FAILED)
23+
goto out;
24+
mem = tmp;
25+
out:
26+
return mem;
27+
}
28+
29+
int main()
30+
{
31+
unsigned long int target = 0xffffffL;
32+
uint8_t *mem;
33+
mem = mapmem(target, 1024L);
34+
printf("got address %p from target %p\n", mem, (void *)target);
35+
mem[0] = 42;
36+
munmap(mem, 1024L);
37+
return 0;
38+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE unix
2+
main.c
3+
--pointer-check
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^VERIFICATION SUCCESSFUL$
7+
--
8+
^warning: ignoring

src/ansi-c/library/mman.c

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
/* FUNCTION: mmap */
2+
3+
#ifndef _WIN32
4+
5+
# ifndef __CPROVER_SYS_MMAN_H_INCLUDED
6+
# include <sys/mman.h>
7+
# define __CPROVER_SYS_MMAN_H_INCLUDED
8+
# endif
9+
10+
# ifndef MAP_FIXED
11+
# define MAP_FIXED 0
12+
# endif
13+
14+
# ifndef MAP_ANONYMOUS
15+
# define MAP_ANONYMOUS 0
16+
# endif
17+
18+
# ifndef MAP_UNINITIALIZED
19+
# define MAP_UNINITIALIZED 0
20+
# endif
21+
22+
__CPROVER_bool __VERIFIER_nondet___CPROVER_bool();
23+
24+
void *mmap(
25+
void *addr,
26+
__CPROVER_size_t length,
27+
int prot,
28+
int flags,
29+
int fd,
30+
off_t offset)
31+
{
32+
(void)prot;
33+
(void)fd;
34+
(void)offset;
35+
36+
if(
37+
addr == 0 ||
38+
(__VERIFIER_nondet___CPROVER_bool() && (flags & MAP_FIXED) == 0))
39+
{
40+
if(flags & MAP_ANONYMOUS && (flags & MAP_UNINITIALIZED) == 0)
41+
return __CPROVER_allocate(length, 1);
42+
else
43+
return __CPROVER_allocate(length, 0);
44+
}
45+
else
46+
{
47+
__CPROVER_allocated_memory((__CPROVER_size_t)addr, length);
48+
return addr;
49+
}
50+
}
51+
52+
#endif
53+
54+
/* FUNCTION: _mmap */
55+
56+
#ifndef _WIN32
57+
58+
# ifndef __CPROVER_SYS_MMAN_H_INCLUDED
59+
# include <sys/mman.h>
60+
# define __CPROVER_SYS_MMAN_H_INCLUDED
61+
# endif
62+
63+
# ifndef MAP_FIXED
64+
# define MAP_FIXED 0
65+
# endif
66+
67+
# ifndef MAP_ANONYMOUS
68+
# define MAP_ANONYMOUS 0
69+
# endif
70+
71+
# ifndef MAP_UNINITIALIZED
72+
# define MAP_UNINITIALIZED 0
73+
# endif
74+
75+
__CPROVER_bool __VERIFIER_nondet___CPROVER_bool();
76+
77+
void *_mmap(
78+
void *addr,
79+
__CPROVER_size_t length,
80+
int prot,
81+
int flags,
82+
int fd,
83+
off_t offset)
84+
{
85+
(void)prot;
86+
(void)fd;
87+
(void)offset;
88+
89+
if(
90+
addr == 0 ||
91+
(__VERIFIER_nondet___CPROVER_bool() && (flags & MAP_FIXED) == 0))
92+
{
93+
if(flags & MAP_ANONYMOUS && (flags & MAP_UNINITIALIZED) == 0)
94+
return __CPROVER_allocate(length, 1);
95+
else
96+
return __CPROVER_allocate(length, 0);
97+
}
98+
else
99+
{
100+
__CPROVER_allocated_memory((__CPROVER_size_t)addr, length);
101+
return addr;
102+
}
103+
}
104+
105+
#endif
106+
107+
/* FUNCTION: munmap */
108+
109+
__CPROVER_bool __VERIFIER_nondet___CPROVER_bool();
110+
111+
int munmap(void *addr, __CPROVER_size_t length)
112+
{
113+
(void)length;
114+
115+
if(__VERIFIER_nondet___CPROVER_bool())
116+
__CPROVER_deallocated = addr;
117+
118+
return 0;
119+
}
120+
121+
/* FUNCTION: _munmap */
122+
123+
__CPROVER_bool __VERIFIER_nondet___CPROVER_bool();
124+
125+
int _munmap(void *addr, __CPROVER_size_t length)
126+
{
127+
(void)length;
128+
129+
if(__VERIFIER_nondet___CPROVER_bool())
130+
__CPROVER_deallocated = addr;
131+
132+
return 0;
133+
}

0 commit comments

Comments
 (0)