@@ -123,27 +123,30 @@ inline int _close(int fildes)
123
123
// write to _write; this is covered by the explicit definition of
124
124
// _write below
125
125
#ifdef _MSC_VER
126
- #define ssize_t signed long
126
+ #define ret_type int
127
+ #define size_type unsigned
127
128
#else
128
129
#ifndef __CPROVER_SYS_TYPES_H_INCLUDED
129
130
#include <sys/types.h>
130
131
#define __CPROVER_SYS_TYPES_H_INCLUDED
131
132
#endif
133
+ #define ret_type ssize_t
134
+ #define size_type size_t
132
135
#endif
133
136
134
137
extern struct __CPROVER_pipet __CPROVER_pipes [];
135
138
// offset to make sure we don't collide with other fds
136
139
extern const int __CPROVER_pipe_offset ;
137
140
138
- ssize_t __VERIFIER_nondet_ssize_t ();
141
+ ret_type __VERIFIER_nondet_ret_type ();
139
142
140
- ssize_t write (int fildes , const void * buf , size_t nbyte )
143
+ ret_type write (int fildes , const void * buf , size_type nbyte )
141
144
{
142
145
__CPROVER_HIDE :;
143
146
if ((fildes >=0 && fildes <=2 ) || fildes < __CPROVER_pipe_offset )
144
147
{
145
- ssize_t retval = __VERIFIER_nondet_ssize_t ();
146
- __CPROVER_assume (retval >=-1 && retval <=(ssize_t )nbyte );
148
+ ret_type retval = __VERIFIER_nondet_ret_type ();
149
+ __CPROVER_assume (retval >=-1 && retval <=(ret_type )nbyte );
147
150
return retval ;
148
151
}
149
152
@@ -156,7 +159,7 @@ ssize_t write(int fildes, const void *buf, size_t nbyte)
156
159
sizeof (__CPROVER_pipes [fildes ].data ) >=
157
160
__CPROVER_pipes [fildes ].next_avail + nbyte )
158
161
{
159
- for (size_t i = 0 ; i < nbyte ; ++ i )
162
+ for (size_type i = 0 ; i < nbyte ; ++ i )
160
163
__CPROVER_pipes [fildes ].data [i + __CPROVER_pipes [fildes ].next_avail ]=
161
164
((char * )buf )[i ];
162
165
__CPROVER_pipes [fildes ].next_avail += nbyte ;
@@ -169,17 +172,20 @@ ssize_t write(int fildes, const void *buf, size_t nbyte)
169
172
/* FUNCTION: _write */
170
173
171
174
#ifdef _MSC_VER
172
- #define ssize_t signed long
175
+ #define ret_type int
176
+ #define size_type unsigned
173
177
#else
174
178
#ifndef __CPROVER_SYS_TYPES_H_INCLUDED
175
179
#include <sys/types.h>
176
180
#define __CPROVER_SYS_TYPES_H_INCLUDED
177
181
#endif
182
+ #define ret_type ssize_t
183
+ #define size_type size_t
178
184
#endif
179
185
180
- ssize_t write (int fildes , const void * buf , size_t nbyte );
186
+ ret_type write (int fildes , const void * buf , size_type nbyte );
181
187
182
- inline ssize_t _write (int fildes , const void * buf , size_t nbyte )
188
+ inline ret_type _write (int fildes , const void * buf , size_type nbyte )
183
189
{
184
190
__CPROVER_HIDE :;
185
191
return write (fildes , buf , nbyte );
@@ -191,42 +197,54 @@ inline ssize_t _write(int fildes, const void *buf, size_t nbyte)
191
197
// read to _read; this is covered by the explicit definition of _read
192
198
// below
193
199
#ifdef _MSC_VER
194
- #define ssize_t signed long
200
+ #define ret_type int
201
+ #define size_type unsigned
195
202
#else
196
203
#ifndef __CPROVER_SYS_TYPES_H_INCLUDED
197
204
#include <sys/types.h>
198
205
#define __CPROVER_SYS_TYPES_H_INCLUDED
199
206
#endif
207
+ #define ret_type ssize_t
208
+ #define size_type size_t
200
209
#endif
201
210
202
211
extern struct __CPROVER_pipet __CPROVER_pipes [];
203
212
// offset to make sure we don't collide with other fds
204
213
extern const int __CPROVER_pipe_offset ;
205
214
206
215
__CPROVER_bool __VERIFIER_nondet___CPROVER_bool ();
207
- ssize_t __VERIFIER_nondet_ssize_t ();
216
+ ret_type __VERIFIER_nondet_ret_type ();
217
+ size_type __VERIFIER_nondet_size_type ();
208
218
209
- ssize_t read (int fildes , void * buf , size_t nbyte )
219
+ ret_type read (int fildes , void * buf , size_type nbyte )
210
220
{
211
221
__CPROVER_HIDE :;
212
222
if ((fildes >=0 && fildes <=2 ) || fildes < __CPROVER_pipe_offset )
213
223
{
214
- ssize_t nread = __VERIFIER_nondet_ssize_t ();
215
- __CPROVER_assume (0 <=nread && (size_t )nread <=nbyte );
224
+ ret_type nread = __VERIFIER_nondet_ret_type ();
225
+ __CPROVER_assume (0 <=nread && (size_type )nread <=nbyte );
216
226
227
+ __CPROVER_bool error = __VERIFIER_nondet___CPROVER_bool ();
217
228
#if 0
218
- size_t i ;
229
+ size_type i ;
219
230
for (i = 0 ; i < nbyte ; i ++ )
220
231
{
221
232
char nondet_char ;
222
233
((char * )buf )[i ]= nondet_char ;
223
234
}
224
235
#else
225
- char nondet_bytes [nbyte ];
226
- __CPROVER_array_replace ((char * )buf , nondet_bytes );
236
+ if (nbyte > 0 )
237
+ {
238
+ size_type str_length = __VERIFIER_nondet_size_type ();
239
+ __CPROVER_assume (error ? str_length <=nbyte : str_length == nbyte );
240
+ // check that the memory is accessible
241
+ (void )* (char * )buf ;
242
+ (void )* (((const char * )buf ) + str_length - 1 );
243
+ char contents_nondet [str_length ];
244
+ __CPROVER_array_replace ((char * )buf , contents_nondet );
245
+ }
227
246
#endif
228
247
229
- __CPROVER_bool error = __VERIFIER_nondet___CPROVER_bool ();
230
248
return error ? -1 : nread ;
231
249
}
232
250
@@ -237,7 +255,7 @@ ssize_t read(int fildes, void *buf, size_t nbyte)
237
255
__CPROVER_atomic_begin ();
238
256
if (!__CPROVER_pipes [fildes ].widowed )
239
257
{
240
- for (size_t i = 0 ; i < nbyte &&
258
+ for (size_type i = 0 ; i < nbyte &&
241
259
__CPROVER_pipes [fildes ].next_unread <
242
260
__CPROVER_pipes [fildes ].next_avail ;
243
261
++ i )
@@ -258,17 +276,20 @@ ssize_t read(int fildes, void *buf, size_t nbyte)
258
276
/* FUNCTION: _read */
259
277
260
278
#ifdef _MSC_VER
261
- #define ssize_t signed long
279
+ #define ret_type int
280
+ #define size_type unsigned
262
281
#else
263
282
#ifndef __CPROVER_SYS_TYPES_H_INCLUDED
264
283
#include <sys/types.h>
265
284
#define __CPROVER_SYS_TYPES_H_INCLUDED
266
285
#endif
286
+ #define ret_type ssize_t
287
+ #define size_type size_t
267
288
#endif
268
289
269
- ssize_t read (int fildes , void * buf , size_t nbyte );
290
+ ret_type read (int fildes , void * buf , size_type nbyte );
270
291
271
- inline ssize_t _read (int fildes , void * buf , size_t nbyte )
292
+ inline ret_type _read (int fildes , void * buf , size_type nbyte )
272
293
{
273
294
__CPROVER_HIDE :;
274
295
return read (fildes , buf , nbyte );
0 commit comments