diff options
author | Jan Beulich <jbeulich@novell.com> | 2009-04-16 08:52:27 +0000 |
---|---|---|
committer | Jan Beulich <jbeulich@novell.com> | 2009-04-16 08:52:27 +0000 |
commit | b1e38619e601f7285d7d055297a556ba7e67cc10 (patch) | |
tree | d6d5ff7d4c84f1a83e632376dfe175e9b7ee5c1b /gas/expr.c | |
parent | 50fe9f38cb482e90418bf95f134a3ba5705faa93 (diff) | |
download | binutils-redhat-b1e38619e601f7285d7d055297a556ba7e67cc10.tar.gz |
gas/
2009-04-16 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.
Diffstat (limited to 'gas/expr.c')
-rw-r--r-- | gas/expr.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/gas/expr.c b/gas/expr.c index 285b4381da..39f21ef797 100644 --- a/gas/expr.c +++ b/gas/expr.c @@ -31,6 +31,13 @@ #include "safe-ctype.h" #include "obstack.h" +#ifdef HAVE_LIMITS_H +#include <limits.h> +#endif +#ifndef CHAR_BIT +#define CHAR_BIT 8 +#endif + static void floating_constant (expressionS * expressionP); static valueT generic_bignum_to_int32 (void); #ifdef BFD64 @@ -1779,6 +1786,14 @@ expr (int rankarg, /* Larger # is higher rank. */ 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 (); |