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