https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79265
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |diagnostic, wrong-code
Summary|[7 regression] |-fsanitize=undefined
|-fsanitize=undefined |inserts unnecessary null
|inserts unnecessary null |pointer tests
|pointer tests |
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
The bogus optimization is done via
(simplify
(cmp (convert? addr@0) integer_zerop)
(if (tree_single_nonzero_warnv_p (@0, NULL))
{ constant_boolean_node (cmp == NE_EXPR, type); })))
and
bool
tree_single_nonzero_warnv_p (tree t, bool *strict_overflow_p)
{
...
case ADDR_EXPR:
{
tree base = TREE_OPERAND (t, 0);
if (!DECL_P (base))
base = get_base_address (base);
if (base && TREE_CODE (base) == TARGET_EXPR)
base = TARGET_EXPR_SLOT (base);
if (!base)
return false;
/* For objects in symbol table check if we know they are non-zero.
Don't do anything for variables and functions before symtab is
built;
it is quite possible that they will be declared weak later. */
int nonzero_addr = maybe_nonzero_address (base);
if (nonzero_addr >= 0)
return nonzero_addr;
/* Constants are never weak. */
if (CONSTANT_CLASS_P (base))
return true;
return false;
plus
static int
maybe_nonzero_address (tree decl)
{
if (DECL_P (decl) && decl_in_symtab_p (decl))
if (struct symtab_node *symbol = symtab_node::get_create (decl))
return symbol->nonzero_address ();
/* Function local objects are never NULL. */
if (DECL_P (decl)
&& (DECL_CONTEXT (decl)
&& TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL
&& auto_var_in_fn_p (decl, DECL_CONTEXT (decl))))
return 1;
so if we think that we have to handle the possibility of automatic vars
being at address zero with -fno-delete-null-pointer-checks we have to
guard that test.
More fine-grained control would be nice as well.