diff options
author | Richard Biener <rguenther@suse.de> | 2022-04-25 10:46:16 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-04-27 12:03:07 +0200 |
commit | 9aaaae7edb781867797d0a553a7db99d52ecd5e1 (patch) | |
tree | 31b7f5aef1f0ff13e4d619f74b9a00a3bf230710 | |
parent | 6a460a2007dd9c527c5f9d5bbbedb852db7c1373 (diff) | |
download | gcc-9aaaae7edb781867797d0a553a7db99d52ecd5e1.tar.gz |
middle-end/104492 - avoid all equality compare dangling pointer diags
The following extends the equality compare dangling pointer diagnostics
suppression for uses following free or realloc to also cover those
following invalidation of auto variables via CLOBBERs. That avoids
diagnosing idioms like
return std::find(std::begin(candidates), std::end(candidates), s)
!= std::end(candidates);
for auto candidates which are prone to forwarding of the final
comparison across the storage invalidation as then seen by the
late run access warning pass.
2022-04-25 Richard Biener <rguenther@suse.de>
PR middle-end/104492
* gimple-ssa-warn-access.cc
(pass_waccess::warn_invalid_pointer): Exclude equality compare
diagnostics for all kind of invalidations.
(pass_waccess::check_dangling_uses): Fix post-dominator query.
(pass_waccess::check_pointer_uses): Likewise.
-rw-r--r-- | gcc/gimple-ssa-warn-access.cc | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc index 879dbcc1e52..39aa8186de6 100644 --- a/gcc/gimple-ssa-warn-access.cc +++ b/gcc/gimple-ssa-warn-access.cc @@ -3923,7 +3923,8 @@ pass_waccess::warn_invalid_pointer (tree ref, gimple *use_stmt, return; } - if ((maybe && warn_dangling_pointer < 2) + if (equality + || (maybe && warn_dangling_pointer < 2) || warning_suppressed_p (use_stmt, OPT_Wdangling_pointer_)) return; @@ -4241,7 +4242,7 @@ pass_waccess::check_pointer_uses (gimple *stmt, tree ptr, basic_block use_bb = gimple_bb (use_stmt); bool this_maybe = (maybe - || !dominated_by_p (CDI_POST_DOMINATORS, use_bb, stmt_bb)); + || !dominated_by_p (CDI_POST_DOMINATORS, stmt_bb, use_bb)); warn_invalid_pointer (*use_p->use, use_stmt, stmt, var, this_maybe, equality); continue; @@ -4486,7 +4487,7 @@ pass_waccess::check_dangling_uses (tree var, tree decl, bool maybe /* = false */ basic_block use_bb = gimple_bb (use_stmt); basic_block clob_bb = gimple_bb (*pclob); - maybe = maybe || !dominated_by_p (CDI_POST_DOMINATORS, use_bb, clob_bb); + maybe = maybe || !dominated_by_p (CDI_POST_DOMINATORS, clob_bb, use_bb); warn_invalid_pointer (var, use_stmt, *pclob, decl, maybe, false); } |