diff --git a/gcc/pointer-query.cc b/gcc/pointer-query.cc index 95565fd6005b..ea6ca684d93a 100644 --- a/gcc/pointer-query.cc +++ b/gcc/pointer-query.cc @@ -600,8 +600,8 @@ gimple_parm_array_size (tree ptr, wide_int rng[2], /* Initialize the object. */ access_ref::access_ref () - : ref (), eval ([](tree x){ return x; }), deref (), trail1special (true), - base0 (true), parmarray () + : ref (), eval ([](tree x){ return x; }), deref (), ref_nullptr_p (false), + trail1special (true), base0 (true), parmarray () { /* Set to valid. */ offrng[0] = offrng[1] = 0; @@ -1193,7 +1193,16 @@ access_ref::inform_access (access_mode mode, int ostype /* = 1 */) const loc = EXPR_LOCATION (ref); else if (TREE_CODE (ref) != IDENTIFIER_NODE && TREE_CODE (ref) != SSA_NAME) - return; + { + if (TREE_CODE (ref) == INTEGER_CST && ref_nullptr_p) + { + if (mode == access_read_write || mode == access_write_only) + inform (loc, "destination object is likely at address zero"); + else + inform (loc, "source object is likely at address zero"); + } + return; + } if (mode == access_read_write || mode == access_write_only) { @@ -2280,7 +2289,10 @@ compute_objsize_r (tree ptr, gimple *stmt, bool addr, int ostype, if (targetm.addr_space.zero_address_valid (as)) pref->set_max_size_range (); else - pref->sizrng[0] = pref->sizrng[1] = 0; + { + pref->sizrng[0] = pref->sizrng[1] = 0; + pref->ref_nullptr_p = true; + } } else pref->sizrng[0] = pref->sizrng[1] = 0; diff --git a/gcc/pointer-query.h b/gcc/pointer-query.h index 801a240c38de..19a6f15aab25 100644 --- a/gcc/pointer-query.h +++ b/gcc/pointer-query.h @@ -88,7 +88,7 @@ struct access_ref argument to the minimum. */ offset_int size_remaining (offset_int * = nullptr) const; -/* Return true if the offset and object size are in range for SIZE. */ + /* Return true if the offset and object size are in range for SIZE. */ bool offset_in_range (const offset_int &) const; /* Return true if *THIS is an access to a declared object. */ @@ -141,6 +141,9 @@ struct access_ref /* Positive when REF is dereferenced, negative when its address is taken. */ int deref; + /* The following indicates if heuristics interpreted 'ref' is interpreted + as (offsetted) nullptr. */ + bool ref_nullptr_p; /* Set if trailing one-element arrays should be treated as flexible array members. */ bool trail1special;