@@ -60,27 +60,39 @@ inline void abort(void)
60
60
/* FUNCTION: calloc */
61
61
62
62
#undef calloc
63
- #undef malloc
64
63
65
- inline void * malloc ( __CPROVER_size_t malloc_size );
64
+ __CPROVER_bool __VERIFIER_nondet___CPROVER_bool ( );
66
65
67
66
inline void * calloc (__CPROVER_size_t nmemb , __CPROVER_size_t size )
68
67
{
68
+ // realistically, calloc may return NULL,
69
+ // and __CPROVER_allocate doesn't, but no one cares
69
70
__CPROVER_HIDE :;
70
- void * res ;
71
- res = malloc (nmemb * size );
72
- #ifdef __CPROVER_STRING_ABSTRACTION
73
- __CPROVER_is_zero_string (res )= 1 ;
74
- __CPROVER_zero_string_length (res )= 0 ;
75
- //for(int i=0; i<nmemb*size; i++) res[i]=0;
76
- #else
77
- if (nmemb > 1 )
78
- __CPROVER_array_set (res , 0 );
79
- else if (nmemb == 1 )
80
- for (__CPROVER_size_t i = 0 ; i < size ; ++ i )
81
- ((char * )res )[i ]= 0 ;
82
- #endif
83
- return res ;
71
+ void * malloc_res ;
72
+ malloc_res = __CPROVER_allocate (nmemb * size , 1 );
73
+
74
+ // make sure it's not recorded as deallocated
75
+ __CPROVER_deallocated =
76
+ (malloc_res == __CPROVER_deallocated ) ? 0 : __CPROVER_deallocated ;
77
+
78
+ // record the object size for non-determistic bounds checking
79
+ __CPROVER_bool record_malloc = __VERIFIER_nondet___CPROVER_bool ();
80
+ __CPROVER_malloc_object =
81
+ record_malloc ? malloc_res : __CPROVER_malloc_object ;
82
+ __CPROVER_malloc_size = record_malloc ? nmemb * size : __CPROVER_malloc_size ;
83
+ __CPROVER_malloc_is_new_array =
84
+ record_malloc ? 0 : __CPROVER_malloc_is_new_array ;
85
+
86
+ // detect memory leaks
87
+ __CPROVER_bool record_may_leak = __VERIFIER_nondet___CPROVER_bool ();
88
+ __CPROVER_memory_leak = record_may_leak ? malloc_res : __CPROVER_memory_leak ;
89
+
90
+ #ifdef __CPROVER_STRING_ABSTRACTION
91
+ __CPROVER_is_zero_string (malloc_res ) = 1 ;
92
+ __CPROVER_zero_string_length (malloc_res ) = 0 ;
93
+ #endif
94
+
95
+ return malloc_res ;
84
96
}
85
97
86
98
/* FUNCTION: malloc */
@@ -92,10 +104,10 @@ __CPROVER_bool __VERIFIER_nondet___CPROVER_bool();
92
104
inline void * malloc (__CPROVER_size_t malloc_size )
93
105
{
94
106
// realistically, malloc may return NULL,
95
- // and __CPROVER_malloc doesn't, but no one cares
107
+ // and __CPROVER_allocate doesn't, but no one cares
96
108
__CPROVER_HIDE :;
97
109
void * malloc_res ;
98
- malloc_res = __CPROVER_malloc (malloc_size );
110
+ malloc_res = __CPROVER_allocate (malloc_size , 0 );
99
111
100
112
// make sure it's not recorded as deallocated
101
113
__CPROVER_deallocated = (malloc_res == __CPROVER_deallocated )?0 :__CPROVER_deallocated ;
@@ -121,7 +133,7 @@ inline void *__builtin_alloca(__CPROVER_size_t alloca_size)
121
133
{
122
134
__CPROVER_HIDE :;
123
135
void * res ;
124
- res = __CPROVER_malloc (alloca_size );
136
+ res = __CPROVER_allocate (alloca_size , 0 );
125
137
126
138
// make sure it's not recorded as deallocated
127
139
__CPROVER_deallocated = (res == __CPROVER_deallocated )?0 :__CPROVER_deallocated ;
0 commit comments