[PATCH] Fix PR56344

Marek Polacek polacek@redhat.com
Tue Feb 26 18:27:00 GMT 2013


This "fixes" PR56344 by prohibiting passing arguments by value
of size >= 2^30 bytes.  Probably no sane programmer would want to 
do that, but it's better to issue an error than to segfault.
This would be a good opportunity to use __builtin_expect, but
we don't use that much in the codebase...

Regtested/bootstrapped on x86_64-linux, ok for trunk?

Do we need a testcase for this (compiling it is quite slow)?

2013-02-26  Marek Polacek  <polacek@redhat.com>

	PR middle-end/56344
	* calls.c (expand_call): Disallow passing huge arguments
	by value.

--- gcc/calls.c.mp	2013-02-26 17:04:33.159555349 +0100
+++ gcc/calls.c	2013-02-26 18:50:54.864084545 +0100
@@ -3037,6 +3037,14 @@ expand_call (tree exp, rtx target, int i
 	    {
 	      rtx before_arg = get_last_insn ();
 
+	      /* We don't allow passing huge (> 2^30 B) arguments
+	         by value.  It would cause an overflow later on.  */
+	      if (adjusted_args_size.constant >= (1 << 30))
+	        {
+	          error ("passing too large argument on stack");
+		  continue;
+		}
+
 	      if (store_one_arg (&args[i], argblock, flags,
 				 adjusted_args_size.var != 0,
 				 reg_parm_stack_space)

	Marek



More information about the Gcc-patches mailing list