https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117315
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution|--- |INVALID
--- Comment #18 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Sam James from comment #14)
> Looking at this again, wmem_tree_new_autoreset has __attribute__((malloc))
> which promises that the memory returned isn't aliased by anything else
> ("fresh").
>
> In wmem_test_tree, we birth 'tree' with wmem_tree_new_autoreset, but tree is
> a pointer to freshly allocated memory, while tree->data_allocator is a
> pointer to one of its arguments. I think we assume it can't be null as a
> result later on which is why -fno-delete-null-pointer-checks works.
>
> Is this like a 'lifetime-dse' thing? Is it legal for wmem_tree_new_autoreset
> to modify 'tree' before it's returned like that for the malloc attribute?
Nope. That's invalid. The docs are quite explicit:
Attribute @code{malloc} indicates that a function is @code{malloc}-like,
i.e., that the pointer @var{P} returned by the function cannot alias any
other pointer valid when the function returns, <em>and moreover no
pointers to valid objects occur in any storage addressed by @var{P}</em>.
Clearly
wmem_tree_t *wmem_tree_new_autoreset(wmem_allocator_t *metadata_scope,
wmem_allocator_t *data_scope) {
wmem_tree_t *tree = __builtin_memset(
wmem_alloc(metadata_scope, sizeof(wmem_tree_t)), 0, sizeof(wmem_tree_t));
if (!tree) {
__builtin_abort();
}
tree->data_allocator = data_scope;
wmem_register_callback(data_scope, wmem_tree_reset_cb, tree);
return tree;
}
is not suitable for 'malloc' and GCC assumes that the returned 'tree' does
_not_ point to storage referencing 'data_scope'.