This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Handle overlength strings in C++ FE


Hi,

this makes too long string constants shorter,
and fixes one place where a string constant is created
non-zero terminated.  This is a cleanup in preparation
of a more thorough check on the STRING_CST objects
in the middle-end.

Bootstrapped and reg-tested on x86_64-pc-linux-gnu.
Is it OK for trunk?


Thanks
Bernd.
2018-08-01  Bernd Edlinger  <bernd.edlinger@hotmail.de>

	* typeck2.c (digest_init_r): Fix overlength strings.
	* vtable-class-hierarchy.c (build_key_buffer_arg): Make string literal
	NUL terminated.

diff -pur gcc/cp/typeck2.c gcc/cp/typeck2.c
--- gcc/cp/typeck2.c	2018-06-27 04:59:44.000000000 +0200
+++ gcc/cp/typeck2.c	2018-08-01 06:57:15.275041272 +0200
@@ -1105,8 +1105,23 @@ digest_init_r (tree type, tree init, int
 		 counted in the length of the constant, but in C++ this would
 		 be invalid.  */
 	      if (size < TREE_STRING_LENGTH (init))
-		permerror (loc, "initializer-string for array "
-			   "of chars is too long");
+		{
+		  permerror (loc, "initializer-string for array "
+			     "of chars is too long");
+		  if (tree_fits_uhwi_p (TYPE_SIZE_UNIT (type)))
+		    {
+		      unsigned unit
+			= TYPE_PRECISION (TREE_TYPE (type)) / BITS_PER_UNIT;
+		      const char *p = TREE_STRING_POINTER (init);
+		      char *q = (char *)xmalloc (size + unit);
+
+		      memcpy (q, p, size);
+		      memset (q + size, 0, unit);
+		      init = build_string (size + unit, q);
+		      TREE_TYPE (init) = type;
+		      free (q);
+		    }
+		}
 	    }
 	  return init;
 	}
diff -pur gcc/cp/vtable-class-hierarchy.c gcc/cp/vtable-class-hierarchy.c
--- gcc/cp/vtable-class-hierarchy.c	2018-01-03 11:03:58.000000000 +0100
+++ gcc/cp/vtable-class-hierarchy.c	2018-08-01 09:13:38.522646005 +0200
@@ -738,7 +738,7 @@ build_key_buffer_arg (tree base_ptr_var_
   tree ret_value;
 
   /* Set the len and hash for the string.  */
-  *value_ptr = len1;
+  *value_ptr = len1++;
   value_ptr++;
   *value_ptr = hash_value;
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]