On Thu, 11 Jan 2018, Marc Glisse wrote: > On Tue, 9 Jan 2018, Prathamesh Kulkarni wrote: > > > As Jakub pointed out for the case: > > void *f() > > { > > return __builtin_malloc (0); > > } > > > > The malloc propagation would set f() to malloc. > > However AFAIU, malloc(0) returns NULL (?) and the function shouldn't > > be marked as malloc ? > > Why not? Even for > void*f(){return 0;} > are any of the properties of the malloc attribute violated? It seems to > me that if you reject malloc(0), then even the standard malloc function > should be rejected as well...
The constraint for the malloc attribute is that it returns a unique pointer for each invocation that cannot alias with any other pointer in the program, or NULL. So yes, { return 0; } qualifies as 'malloc' (but I wouldn't mark that on its own ;)). Also int x; void *f(size_t n) { if (x) return malloc (n); return 0; } does. The only constraint is really that the value feeding the return statement is either literal zero or produced by a call with the malloc attribute. So even void *__attribute__((malloc)) bar(); void *f(size_t n) { if (n == 2) return bar (); return malloc (n); } is malloc. Richard.