diff options
author | Richard Stallman <rms@gnu.org> | 1992-09-17 21:11:17 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1992-09-17 21:11:17 +0000 |
commit | f46ffce4f8f5de9e6b39877b398fd5f3d82b43ce (patch) | |
tree | 67c9ce01a89e18445ea9e479980e6fbe8213a638 /gcc/cexp.y | |
parent | 0e14ddbcfcb10939d300cd2ecc530459af1979a1 (diff) | |
download | gcc-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.y | 15 |
1 files changed, 10 insertions, 5 deletions
@@ -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"); |