diff options
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 19 |
1 files changed, 12 insertions, 7 deletions
@@ -2752,9 +2752,10 @@ Perl_scan_bin(pTHX_ char *start, I32 len, I32 *retlen) register UV retval = 0; bool overflowed = FALSE; while (len && *s >= '0' && *s <= '1') { + dTHR; register UV n = retval << 1; - if (!overflowed && (n >> 1) != retval) { - Perl_warn(aTHX_ "Integer overflow in binary number"); + if (!overflowed && (n >> 1) != retval && ckWARN_d(WARN_UNSAFE)) { + Perl_warner(aTHX_ WARN_UNSAFE, "Integer overflow in binary number"); overflowed = TRUE; } retval = n | (*s++ - '0'); @@ -2776,9 +2777,10 @@ Perl_scan_oct(pTHX_ char *start, I32 len, I32 *retlen) bool overflowed = FALSE; while (len && *s >= '0' && *s <= '7') { + dTHR; register UV n = retval << 3; - if (!overflowed && (n >> 3) != retval) { - Perl_warn(aTHX_ "Integer overflow in octal number"); + if (!overflowed && (n >> 3) != retval && ckWARN_d(WARN_UNSAFE)) { + Perl_warner(aTHX_ WARN_UNSAFE, "Integer overflow in octal number"); overflowed = TRUE; } retval = n | (*s++ - '0'); @@ -2816,9 +2818,12 @@ Perl_scan_hex(pTHX_ char *start, I32 len, I32 *retlen) } } n = retval << 4; - if (!overflowed && (n >> 4) != retval) { - Perl_warn(aTHX_ "Integer overflow in hex number"); - overflowed = TRUE; + { + dTHR; + if (!overflowed && (n >> 4) != retval && ckWARN_d(WARN_UNSAFE)) { + Perl_warner(aTHX_ WARN_UNSAFE, "Integer overflow in hex number"); + overflowed = TRUE; + } } retval = n | ((tmp - PL_hexdigit) & 15); } |