Fix -Wstringop-overflow ICE with references (PR middle-end/78750)

Richard Biener richard.guenther@gmail.com
Fri Dec 9 18:53:00 GMT 2016


On December 9, 2016 4:27:19 PM GMT+01:00, Marek Polacek <polacek@redhat.com> wrote:
>The attached test crashed because we wound up with an SSA_NAME of
>a reference type in get_range_info which has
>
>  gcc_assert (!POINTER_TYPE_P (TREE_TYPE (name)));
>
>I think this could be fixed by treating "char &" the same as "char *"
>in
>check_sizes (the POINTER_TYPE_P macro handles both
>pointers/references).
>
>Bootstrapped/regtested on x86_64-linux, ok for trunk?

OK.

Richard.

>2016-12-09  Marek Polacek  <polacek@redhat.com>
>
>	PR middle-end/78750
>	* builtins.c (check_sizes): Use POINTER_TYPE_P.
>
>	* g++.dg/torture/pr78750.C: New.
>
>diff --git gcc/builtins.c gcc/builtins.c
>index 20515e7..b056e12 100644
>--- gcc/builtins.c
>+++ gcc/builtins.c
>@@ -3091,7 +3091,7 @@ check_sizes (int opt, tree exp, tree size, tree
>maxlen, tree str, tree objsize)
>     {
>       /* STR is normally a pointer to string but as a special case
> 	 it can be an integer denoting the length of a string.  */
>-      if (TREE_CODE (TREE_TYPE (str)) == POINTER_TYPE)
>+      if (POINTER_TYPE_P (TREE_TYPE (str)))
> 	{
> 	  /* Try to determine the range of lengths the source string
> 	     refers to.  If it can be determined add one to it for
>diff --git gcc/testsuite/g++.dg/torture/pr78750.C
>gcc/testsuite/g++.dg/torture/pr78750.C
>index e69de29..54232e6 100644
>--- gcc/testsuite/g++.dg/torture/pr78750.C
>+++ gcc/testsuite/g++.dg/torture/pr78750.C
>@@ -0,0 +1,10 @@
>+// PR middle-end/78750
>+// { dg-do compile }
>+
>+extern "C" char *strcpy (char *, const char *);
>+
>+void
>+fn (char *p, char &as)
>+{
>+  strcpy (p, &as);
>+}
>
>	Marek




More information about the Gcc-patches mailing list