aboutsummaryrefslogtreecommitdiff
path: root/gcc/cexp.y
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-09-17 21:11:17 +0000
committerRichard Stallman <rms@gnu.org>1992-09-17 21:11:17 +0000
commitf46ffce4f8f5de9e6b39877b398fd5f3d82b43ce (patch)
tree67c9ce01a89e18445ea9e479980e6fbe8213a638 /gcc/cexp.y
parent0e14ddbcfcb10939d300cd2ecc530459af1979a1 (diff)
downloadgcc-f46ffce4f8f5de9e6b39877b398fd5f3d82b43ce.zip
gcc-f46ffce4f8f5de9e6b39877b398fd5f3d82b43ce.tar.gz
gcc-f46ffce4f8f5de9e6b39877b398fd5f3d82b43ce.tar.bz2
(parse_escape): Diagnose '\x' with no digits.
Diagnose integer overflow when parsing \x escapes. From-SVN: r2147
Diffstat (limited to 'gcc/cexp.y')
-rw-r--r--gcc/cexp.y15
1 files changed, 10 insertions, 5 deletions
diff --git a/gcc/cexp.y b/gcc/cexp.y
index c0fbca5..9530a37 100644
--- a/gcc/cexp.y
+++ b/gcc/cexp.y
@@ -803,23 +803,28 @@ parse_escape (string_ptr)
}
case 'x':
{
- register int i = 0;
+ register unsigned i = 0, overflow = 0, digits_found = 0, digit;
for (;;)
{
c = *(*string_ptr)++;
if (c >= '0' && c <= '9')
- i = (i << 4) + c - '0';
+ digit = c - '0';
else if (c >= 'a' && c <= 'f')
- i = (i << 4) + c - 'a' + 10;
+ digit = c - 'a' + 10;
else if (c >= 'A' && c <= 'F')
- i = (i << 4) + c - 'A' + 10;
+ digit = c - 'A' + 10;
else
{
(*string_ptr)--;
break;
}
+ overflow |= i ^ (i << 4 >> 4);
+ i = (i << 4) + digit;
+ digits_found = 1;
}
- if ((i & ~((1 << BITS_PER_UNIT) - 1)) != 0)
+ if (!digits_found)
+ yyerror ("\\x used with no following hex digits");
+ if (overflow | (i & ~((1 << BITS_PER_UNIT) - 1)))
{
i &= (1 << BITS_PER_UNIT) - 1;
warning ("hex character constant does not fit in a byte");