This is the mail archive of the binutils@sourceware.org mailing list for the binutils 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] warn about out of range shift counts


gas/
2009-04-15  Jan Beulich  <jbeulich@novell.com>

	* expr.c: Include limits.h if available, and #define CHAR_BITS
	otherwise.
	(expr): Check range of shift count when evaluating a constant
	expression.

--- 2009-04-15/gas/expr.c	2008-01-07 14:44:01.000000000 +0100
+++ 2009-04-15/gas/expr.c	2008-11-12 16:08:49.000000000 +0100
@@ -27,6 +27,13 @@
 
 #define min(a, b)       ((a) < (b) ? (a) : (b))
 
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#ifndef CHAR_BIT
+#define CHAR_BIT 8
+#endif
+
 #include "as.h"
 #include "safe-ctype.h"
 #include "obstack.h"
@@ -1779,6 +1786,14 @@ expr (int rankarg,		/* Larger # is highe
 	      as_warn (_("division by zero"));
 	      v = 1;
 	    }
+	  if ((valueT) v >= sizeof(valueT) * CHAR_BIT
+	      && (op_left == O_left_shift || op_left == O_right_shift))
+	    {
+	      as_warn_value_out_of_range (_("shift count"), v, 0,
+					  sizeof(valueT) * CHAR_BIT - 1,
+					  NULL, 0);
+	      resultP->X_add_number = v = 0;
+	    }
 	  switch (op_left)
 	    {
 	    default:			abort ();




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