https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104069
--- Comment #5 from Sergei Trofimovich <slyfox at gcc dot gnu.org> ---
(In reply to Martin Sebor from comment #4)
> Actually, this is already supposed to be handled but the code is not
> effective due to a typo. This fixes it:
>
> diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc
> index f639807a78a..f9508a1d211 100644
> --- a/gcc/gimple-ssa-warn-access.cc
> +++ b/gcc/gimple-ssa-warn-access.cc
> @@ -4082,7 +4082,9 @@ pointers_related_p (gimple *stmt, tree p, tree q,
> pointer_query &qry)
> access_ref pref, qref;
> if (!qry.get_ref (p, stmt, &pref, 0)
> || !qry.get_ref (q, stmt, &qref, 0))
> - return true;
> + /* GET_REF() only rarely fails. When it does, it's likely because
> + it involves a self-referential PHI. Return a conservative result.
> */
> + return false;
>
> return pref.ref == qref.ref;
> }
Thank you! This helped elfutils-0.186.
But linux's objtool still fails to build. Here is extracted false positive (I
think it's false positive):
typedef long unsigned int size_t;
extern void *malloc(size_t __size) __attribute__((__nothrow__, __leaf__))
__attribute__((__malloc__)) __attribute__((__alloc_size__(1)));
extern void *realloc(void *__ptr, size_t __size)
__attribute__((__nothrow__, __leaf__))
__attribute__((__warn_unused_result__)) __attribute__((__alloc_size__(2)));
extern void die(const char *err, ...);
struct cmdnames {
size_t alloc;
size_t cnt;
struct cmdname {
size_t len;
char name[];
} * *names;
};
static inline void *xrealloc(void *ptr, size_t size) {
void *ret = realloc(ptr, size);
if (!ret && !size)
ret = realloc(ptr, 1);
if (!ret) {
ret = realloc(ptr, size);
if (!ret && !size)
ret = realloc(ptr, 1);
if (!ret)
die("Out of memory, realloc failed");
}
return ret;
}
void add_cmdname(struct cmdnames *cmds, const char *name, size_t len) {
struct cmdname *ent = malloc(sizeof(*ent) + len + 1);
ent->len = len;
// memcpy(ent->name, name, len);
ent->name[len] = 0;
do {
if ((cmds->cnt + 1) > cmds->alloc) {
if ((((cmds->alloc) + 16) * 3 / 2) < (cmds->cnt + 1))
cmds->alloc = (cmds->cnt + 1);
else
cmds->alloc = (((cmds->alloc) + 16) * 3 / 2);
cmds->names =
xrealloc((cmds->names), cmds->alloc * sizeof(*(cmds->names)));
}
} while (0);
cmds->names[cmds->cnt++] = ent;
}
$ gcc-12.0.0 -Wall -Werror -c help.c.c
help.c.c: In function 'xrealloc':
help.c.c:26:13: error: pointer 'ptr' may be used after 'realloc'
[-Werror=use-after-free]
26 | ret = realloc(ptr, 1);
| ^~~~~~~~~~~~~~~
help.c.c:20:15: note: call to 'realloc' here
20 | void *ret = realloc(ptr, size);
| ^~~~~~~~~~~~~~~~~~
help.c.c:24:11: error: pointer 'ptr' may be used after 'realloc'
[-Werror=use-after-free]
24 | ret = realloc(ptr, size);
| ^~~~~~~~~~~~~~~~~~
help.c.c:20:15: note: call to 'realloc' here
20 | void *ret = realloc(ptr, size);
| ^~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors