diff options
author | Jarkko Hietaniemi <jhi@iki.fi> | 1999-07-31 20:26:22 +0000 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 1999-07-31 20:26:22 +0000 |
commit | 2cc4c2dcb9e95edecb3992eb6ac9c235d8d8157f (patch) | |
tree | e21d7c7e490fabb8d1b48ca5cab173568ec80eb6 /util.c | |
parent | ba2b843033658a74ad38c16999ec6f60a2256fff (diff) | |
download | perl-2cc4c2dcb9e95edecb3992eb6ac9c235d8d8157f.tar.gz |
Hack the "integer overflow" code some more.
p4raw-id: //depot/cfgperl@3840
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 29 |
1 files changed, 6 insertions, 23 deletions
@@ -2784,13 +2784,12 @@ Perl_scan_bin(pTHX_ char *start, I32 len, I32 *retlen) register UV ruv = 0; register bool seenb = FALSE; register bool overflowed = FALSE; - char *nonzero = NULL; for (; len-- && *s; s++) { if (!(*s == '0' || *s == '1')) { if (*s == '_') continue; /* Note: does not check for __ and the like. */ - if (seenb == FALSE && *s == 'b' && nonzero == NULL) { + if (seenb == FALSE && *s == 'b' && ruv == 0) { /* Disallow 0bbb0b0bbb... */ seenb = TRUE; continue; @@ -2802,9 +2801,6 @@ Perl_scan_bin(pTHX_ char *start, I32 len, I32 *retlen) "Illegal binary digit '%c' ignored", *s); break; } - } else { - if (nonzero == NULL && *s != '0') - nonzero = s; } if (!overflowed) { register UV xuv = ruv << 1; @@ -2826,13 +2822,13 @@ Perl_scan_bin(pTHX_ char *start, I32 len, I32 *retlen) * is a waste of time (because the NV cannot preserve * the low-order bits anyway): we could just remember when * did we overflow and in the end just multiply rnv by the - * right amount of 16-tuples. */ + * right amount. */ rnv += (*s - '0'); } } if (!overflowed) rnv = (NV) ruv; - if (sizeof(UV) > 4 && nonzero && (s - nonzero) > 32) { + if (rnv > 4294967295.0) { dTHR; if (ckWARN(WARN_UNSAFE)) Perl_warner(aTHX_ WARN_UNSAFE, @@ -2849,7 +2845,6 @@ Perl_scan_oct(pTHX_ char *start, I32 len, I32 *retlen) register NV rnv = 0.0; register UV ruv = 0; register bool overflowed = FALSE; - char *nonzero = NULL; for (; len-- && *s; s++) { if (!(*s >= '0' && *s <= '7')) { @@ -2868,10 +2863,6 @@ Perl_scan_oct(pTHX_ char *start, I32 len, I32 *retlen) break; } } - else { - if (nonzero == NULL && *s != '0') - nonzero = s; - } if (!overflowed) { register xuv = ruv << 3; @@ -2898,9 +2889,7 @@ Perl_scan_oct(pTHX_ char *start, I32 len, I32 *retlen) } if (!overflowed) rnv = (NV) ruv; - if (sizeof(UV) > 4 && - overflowed ? rnv > 4294967295.0 : - (nonzero && (s - nonzero) > 10 && (ruv >> 30) > 3)) { + if (rnv > 4294967295.0) { dTHR; if (ckWARN(WARN_UNSAFE)) Perl_warner(aTHX_ WARN_UNSAFE, @@ -2918,7 +2907,6 @@ Perl_scan_hex(pTHX_ char *start, I32 len, I32 *retlen) register UV ruv = 0; register bool seenx = FALSE; register bool overflowed = FALSE; - char *nonzero = NULL; char *hexdigit; for (; len-- && *s; s++) { @@ -2926,7 +2914,7 @@ Perl_scan_hex(pTHX_ char *start, I32 len, I32 *retlen) if (!hexdigit) { if (*s == '_') continue; /* Note: does not check for __ and the like. */ - if (seenx == FALSE && *s == 'x' && nonzero == NULL) { + if (seenx == FALSE && *s == 'x' && ruv == 0) { /* Disallow 0xxx0x0xxx... */ seenx = TRUE; continue; @@ -2939,10 +2927,6 @@ Perl_scan_hex(pTHX_ char *start, I32 len, I32 *retlen) break; } } - else { - if (nonzero == NULL && *s != '0') - nonzero = s; - } if (!overflowed) { register UV xuv = ruv << 4; @@ -2969,8 +2953,7 @@ Perl_scan_hex(pTHX_ char *start, I32 len, I32 *retlen) } if (!overflowed) rnv = (NV) ruv; - if (sizeof(UV) > 4 && - nonzero && (s - nonzero) > 8) { + if (rnv > 4294967295.0) { dTHR; if (ckWARN(WARN_UNSAFE)) Perl_warner(aTHX_ WARN_UNSAFE, |