public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH 2/2] tree-optimization/109123 - run -Wuse-afer-free only early
@ 2023-03-15 10:49 Richard Biener
  0 siblings, 0 replies; 5+ messages in thread
From: Richard Biener @ 2023-03-15 10:49 UTC (permalink / raw)
  To: gcc-patches

The following switches the -Wuse-after-free diagnostics from emitted
during the late access warning passes to the early access warning
passes to make sure we run before passes performing code motion run
which are the source of a lot of false positives on use-after-free
not involving memory operations.

The patch also fixes issues in c-c++-common/Wuse-after-free-6.c and
g++.dg/warn/Wuse-after-free3.C.

Bootstrapped and tested on x86_64-unknown-linux-gnu (without 1/2
sofar, but its testcase XFAILed).

OK?

Thanks,
Richard.

	PR tree-optimization/109123
	* gimple-ssa-warn-access.cc (pass_waccess::warn_invalid_pointer):
	Do not emit -Wuse-after-free late.
	(pass_waccess::check_call): Always check call pointer uses.

	* gcc.dg/Wuse-after-free-pr109123.c: New testcase.
	* c-c++-common/Wuse-after-free-6.c: Un-XFAIL case.
	* g++.dg/warn/Wuse-after-free3.C: Remove expected duplicate
	diagnostic.
---
 gcc/gimple-ssa-warn-access.cc                 | 28 ++++++-------
 .../c-c++-common/Wuse-after-free-6.c          |  2 +-
 gcc/testsuite/g++.dg/warn/Wuse-after-free3.C  |  3 +-
 .../gcc.dg/Wuse-after-free-pr109123.c         | 41 +++++++++++++++++++
 4 files changed, 57 insertions(+), 17 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/Wuse-after-free-pr109123.c

diff --git a/gcc/gimple-ssa-warn-access.cc b/gcc/gimple-ssa-warn-access.cc
index a8ad7a6df65..d0809d321ea 100644
--- a/gcc/gimple-ssa-warn-access.cc
+++ b/gcc/gimple-ssa-warn-access.cc
@@ -3907,7 +3907,8 @@ pass_waccess::warn_invalid_pointer (tree ref, gimple *use_stmt,
 
   if (is_gimple_call (inval_stmt))
     {
-      if ((equality && warn_use_after_free < 3)
+      if (!m_early_checks_p
+	  || (equality && warn_use_after_free < 3)
 	  || (maybe && warn_use_after_free < 2)
 	  || warning_suppressed_p (use_stmt, OPT_Wuse_after_free))
 	return;
@@ -4300,19 +4301,18 @@ pass_waccess::check_call (gcall *stmt)
   if (gimple_call_builtin_p (stmt, BUILT_IN_NORMAL))
     check_builtin (stmt);
 
-  if (!m_early_checks_p)
-    if (tree callee = gimple_call_fndecl (stmt))
-      {
-	/* Check for uses of the pointer passed to either a standard
-	   or a user-defined deallocation function.  */
-	unsigned argno = fndecl_dealloc_argno (callee);
-	if (argno < (unsigned) call_nargs (stmt))
-	  {
-	    tree arg = call_arg (stmt, argno);
-	    if (TREE_CODE (arg) == SSA_NAME)
-	      check_pointer_uses (stmt, arg);
-	  }
-      }
+  if (tree callee = gimple_call_fndecl (stmt))
+    {
+      /* Check for uses of the pointer passed to either a standard
+	 or a user-defined deallocation function.  */
+      unsigned argno = fndecl_dealloc_argno (callee);
+      if (argno < (unsigned) call_nargs (stmt))
+	{
+	  tree arg = call_arg (stmt, argno);
+	  if (TREE_CODE (arg) == SSA_NAME)
+	    check_pointer_uses (stmt, arg);
+	}
+    }
 
   check_call_access (stmt);
   check_call_dangling (stmt);
diff --git a/gcc/testsuite/c-c++-common/Wuse-after-free-6.c b/gcc/testsuite/c-c++-common/Wuse-after-free-6.c
index 581b1a0a024..0c17a2545f4 100644
--- a/gcc/testsuite/c-c++-common/Wuse-after-free-6.c
+++ b/gcc/testsuite/c-c++-common/Wuse-after-free-6.c
@@ -53,7 +53,7 @@ void* warn_cond_return_after_free (void *p, int c)
   free (p);
   // PHI handling not fully implemented.
   if (c)
-    return p;       // { dg-warning "pointer 'p' may be used" "pr??????" { xfail *-*-* } }
+    return p;       // { dg-warning "pointer 'p' may be used" }
   return 0;
 }
 
diff --git a/gcc/testsuite/g++.dg/warn/Wuse-after-free3.C b/gcc/testsuite/g++.dg/warn/Wuse-after-free3.C
index 1862ac8b09d..e5b157865bf 100644
--- a/gcc/testsuite/g++.dg/warn/Wuse-after-free3.C
+++ b/gcc/testsuite/g++.dg/warn/Wuse-after-free3.C
@@ -1,7 +1,6 @@
 // PR target/104213
 // { dg-do compile }
 // { dg-options "-Wuse-after-free" }
-// FIXME: We should not output the warning twice.
 
 struct A
 {
@@ -13,4 +12,4 @@ A::~A ()
 {
   operator delete (this);
   f (); // { dg-warning "used after" }
-} // { dg-warning "used after" }
+}
diff --git a/gcc/testsuite/gcc.dg/Wuse-after-free-pr109123.c b/gcc/testsuite/gcc.dg/Wuse-after-free-pr109123.c
new file mode 100644
index 00000000000..ece066dd28b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wuse-after-free-pr109123.c
@@ -0,0 +1,41 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wall" } */
+
+typedef long unsigned int size_t;
+extern void *realloc (void *__ptr, size_t __size)
+     __attribute__ ((__nothrow__ , __leaf__)) __attribute__ ((__warn_unused_result__)) __attribute__ ((__alloc_size__ (2)));
+struct vector_objective; 
+typedef struct vector_objective vector_objective;
+struct vector_objective { double *_begin; double *_end; double *_capacity; };
+static inline size_t vector_objective_size(const vector_objective * v) { 
+    return v->_end - v->_begin;  /* { dg-bogus "used after" } */
+}
+static inline size_t vector_objective_capacity(const vector_objective * v) {
+    return v->_capacity - v->_begin;
+}
+static inline void vector_objective_reserve(vector_objective * v, size_t n) {
+    size_t old_capacity = vector_objective_capacity(v);
+    size_t old_size = vector_objective_size(v);
+    if (n > old_capacity) {
+        v->_begin = realloc(v->_begin, sizeof(double) * n);
+        v->_end = v->_begin + old_size;
+        v->_capacity = v->_begin + n;
+    }
+}
+static inline void vector_objective_push_back(vector_objective * v, double x) {
+    if (v->_end == v->_capacity)
+        vector_objective_reserve (v, (vector_objective_capacity (v) == 0) ? 8 : 2 * vector_objective_capacity (v));
+    *(v->_end) = x;
+    v->_end++;
+}
+
+typedef struct {
+    vector_objective xy;
+} eaf_polygon_t;
+
+int
+rectangle_add(eaf_polygon_t * regions, double lx)
+{
+  vector_objective_push_back(&regions->xy, lx);
+  return 0;
+}
-- 
2.35.3

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-03-15 14:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20230315104924.7F449385828D@sourceware.org>
2023-03-15 11:26 ` [PATCH 2/2] tree-optimization/109123 - run -Wuse-afer-free only early Jakub Jelinek
2023-03-15 11:54   ` Richard Biener
2023-03-15 14:39     ` Richard Biener
2023-03-15 14:49       ` Jakub Jelinek
2023-03-15 10:49 Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).