This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] warn about out of range shift counts
- From: "Jan Beulich" <jbeulich at novell dot com>
- To: <binutils at sourceware dot org>
- Date: Wed, 15 Apr 2009 12:36:55 +0100
- Subject: [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 ();