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]

Re: [Patch] Fix infinite loop/crash if array initializer index equals max value


On Fri, Aug 23, 2013 at 09:49:55PM +0000, Joseph S. Myers wrote:
> On Thu, 22 Aug 2013, Selvaraj, Senthil_Kumar wrote:
> 
> > 2013-08-23  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
> > 	* c-typeck.c (output_pending_init_elements): Handle overflow of
> > 	constructor_unfilled_index.
> 
> This patch needs to add include a testcase to the testsuite that fails 
> before and passes after the patch.  (I realise such a test may only be 
> able to run for a subset of targets.)

Reattaching the patch with a testcase for the AVR target. I'm not sure
how to generalize the testcase for other targets - the constant is the
max value (unsigned) of the mode used to represent initialized array
indices.

The attached test fails with a timeout before applying the patch, and
passes after applying it.

Regards
Senthil

gcc/c/ChangeLog

2013-09-04  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
	* c-typeck.c (output_pending_init_elements): Handle overflow of
	constructor_unfilled_index.

gcc/testsuite/ChangeLog

2013-09-04  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
	* gcc.dg/large-size-array-7.c: New test to verify overflow handling
	of constructor_unfilled_index.

diff --git gcc/c/c-typeck.c gcc/c/c-typeck.c
index 30871db..ed2e37a 100644
--- gcc/c/c-typeck.c
+++ gcc/c/c-typeck.c
@@ -7953,8 +7953,9 @@ output_pending_init_elements (int all, struct obstack * braced_init_obstack)
 				 TREE_TYPE (constructor_type),
 				 constructor_unfilled_index, 0, false,
 				 braced_init_obstack);
-	  else if (tree_int_cst_lt (constructor_unfilled_index,
-				    elt->purpose))
+      else if (!TREE_OVERFLOW_P (constructor_unfilled_index)
+            && tree_int_cst_lt (constructor_unfilled_index,
+                   elt->purpose))
 	    {
 	      /* Advance to the next smaller node.  */
 	      if (elt->left)
@@ -7979,7 +7980,8 @@ output_pending_init_elements (int all, struct obstack * braced_init_obstack)
 		  while (elt->parent && elt->parent->right == elt)
 		    elt = elt->parent;
 		  elt = elt->parent;
-		  if (elt && tree_int_cst_lt (constructor_unfilled_index,
+          if (elt && !TREE_OVERFLOW_P (constructor_unfilled_index)
+              && tree_int_cst_lt (constructor_unfilled_index,
 					      elt->purpose))
 		    {
 		      next = elt->purpose;
diff --git gcc/testsuite/gcc.dg/large-size-array-7.c gcc/testsuite/gcc.dg/large-size-array-7.c
new file mode 100644
index 0000000..196767d
--- /dev/null
+++ gcc/testsuite/gcc.dg/large-size-array-7.c
@@ -0,0 +1,5 @@
+/* { dg-do compile { target "avr-*-*" } } */
+/* { dg-options "-O2" } */
+static char * name[] = {
+    [0xFFFFFF]  = "bar"
+  }; /* { dg-error "too large" } */


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