Hi, First, I assume we are talking about C realloc here, not just a "realloc-like" function which may have other semantics and for which __attribute_malloc__ may not be appropriate.
> > It looks like gcc assumes a functon marked with DECL_IS_MALLOC won't > > return an address which can alias something else. But it isn't true > > for realloc. Now, the qestions are > > > > 1. Can gcc make such an assumption? > > No, it can't. The returned memory may alias the original memory. After realloc(p, s) has returned non-NULL, the "original object" doesn't exist any more, hence there can't be any aliases. > > 2. Can realloc be marked as DECL_IS_MALLOC. > > ... with DECL_IS_MALLOC the following > > int *p; > p = malloc (4); > *p = 0; > p = realloc (p, 4); > *p = 1; > > will have VOPs that do not prevent re-ordering of the two stores. By that reasoning, consider: int *p; p = malloc (4); *p = 0; free(p); p = malloc (4); /* this is very likely to return the same address as before */ *p = 1; What prevents the reordering of the stores in this case? Should we also remove __attribute_malloc__ from malloc :-)? IMHO this is an object lifetime issue not an aliasing issue. > > BTW, glibc also marks realloc with __attribute_malloc__. > > Which is wrong as well. I disagree. Of course, the gcc developers get to define the semantics of __attribute_malloc__, but according to the gcc manual, the attribute only refers to the _result_ of the attributed function, hence I would intuitively expect that I can safely mark: int *destroy_something_and_allocate_anotherthing(int *p) { free(p); return malloc(sizeof(int)); /* again very likely to return the same as the previous p */ } as __attribute_malloc__. Regards, Wolfram.