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.

Reply via email to