PR c/99055 - memory leak in warn_parm_array_mismatch
authorMartin Sebor <msebor@redhat.com>
Fri, 12 Feb 2021 18:18:17 +0000 (11:18 -0700)
committerMartin Sebor <msebor@redhat.com>
Fri, 12 Feb 2021 18:18:52 +0000 (11:18 -0700)
gcc/c-family/ChangeLog:

PR c/99055
* c-warn.c (warn_parm_array_mismatch): Free strings returned from
print_generic_expr_to_str.

gcc/ChangeLog:

* tree-pretty-print.c (print_generic_expr_to_str): Update comment.

gcc/c-family/c-warn.c
gcc/tree-pretty-print.c

index e6e28d9b139db3777c1ea255636372c4e2c4e9b6..2347e0b2e5d64ee869da32f6c85cc1211e8ae67e 100644 (file)
@@ -3319,6 +3319,19 @@ warn_parm_ptrarray_mismatch (location_t origloc, tree curparms, tree newparms)
     }
 }
 
+/* Format EXPR if nonnull and return the formatted string.  If EXPR is
+   null return DFLT.  */
+
+static inline const char*
+expr_to_str (pretty_printer &pp, tree expr, const char *dflt)
+{
+  if (!expr)
+    return dflt;
+
+  dump_generic_node (&pp, expr, 0, TDF_VOPS | TDF_MEMSYMS, false);
+  return pp_formatted_text (&pp);
+}
+
 /* Detect and diagnose a mismatch between an attribute access specification
    on the original declaration of FNDECL and that on the parameters NEWPARMS
    from its refeclaration.  ORIGLOC is the location of the first declaration
@@ -3585,10 +3598,9 @@ warn_parm_array_mismatch (location_t origloc, tree fndecl, tree newparms)
               the same.  */
            continue;
 
-         const char* const newbndstr =
-           newbnd ? print_generic_expr_to_str (newbnd) : "*";
-         const char* const curbndstr =
-           curbnd ? print_generic_expr_to_str (curbnd) : "*";
+         pretty_printer pp1, pp2;
+         const char* const newbndstr = expr_to_str (pp1, newbnd, "*");
+         const char* const curbndstr = expr_to_str (pp2, curbnd, "*");
 
          if (!newpos != !curpos
              || (newpos && !tree_int_cst_equal (newpos, curpos)))
index aabe6bb23b9c407a666bec1df3f8cf94aebcacb1..986f75d1d5fe58981fc7c9aaef3cd2486ae764ed 100644 (file)
@@ -169,7 +169,8 @@ print_generic_expr (FILE *file, tree t, dump_flags_t flags)
   pp_flush (tree_pp);
 }
 
-/* Print a single expression T to string, and return it.  */
+/* Print a single expression T to string, and return it.  The caller
+   must free the returned memory.  */
 
 char *
 print_generic_expr_to_str (tree t)