From 627300f0f7d7170cc4e8db033fb6e61547324f64 Mon Sep 17 00:00:00 2001 From: Jarkko Hietaniemi Date: Mon, 9 Aug 1999 20:35:13 +0000 Subject: [PATCH] lexwarn maintenance: new warning class unsafe subclasses 'overflow' and 'portable' created, used by the recent integer overflow warnings. Class syntax subclass 'octal' renamed to 'digit', binary and hexadecimal parsing errors also 'digit' warnings. p4raw-id: //depot/cfgperl@3942 --- lib/warning.pm | 70 +++++++++++++++++++++++++++++------------------------ pod/perllexwarn.pod | 10 ++++---- t/pragma/warn/util | 12 ++++----- util.c | 36 +++++++++++++-------------- warning.h | 33 +++++++++++++------------ warning.pl | 3 +++ 6 files changed, 88 insertions(+), 76 deletions(-) diff --git a/lib/warning.pm b/lib/warning.pm index 1df83d9..70ed91e 100644 --- a/lib/warning.pm +++ b/lib/warning.pm @@ -33,9 +33,10 @@ use Carp ; 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55", # [0..35] 'ambiguous' => "\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [16] 'closed' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [1] - 'closure' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [26] + 'closure' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [27] 'debugging' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [12] 'deprecated' => "\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [17] + 'digit' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [18] 'exec' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [2] 'inplace' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [13] 'internal' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [14] @@ -43,36 +44,39 @@ use Carp ; 'misc' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [6] 'newline' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [3] 'numeric' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [7] - 'octal' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [18] + 'octal' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [19] 'once' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [8] - 'parenthesis' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [19] + 'overflow' => "\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [28] + 'parenthesis' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [20] 'pipe' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [4] - 'precedence' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [20] - 'printf' => "\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [21] + 'portable' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [29] + 'precedence' => "\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [21] + 'printf' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [22] 'recursion' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [9] 'redefine' => "\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [10] - 'reserved' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [22] - 'semicolon' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [23] + 'reserved' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [23] + 'semicolon' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [24] 'severe' => "\x00\x00\x40\x15\x00\x00\x00\x00\x00", # [11..14] - 'signal' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [27] - 'substr' => "\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [28] - 'syntax' => "\x00\x00\x00\x40\x55\x55\x00\x00\x00", # [15..23] - 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [29] - 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [24] + 'signal' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [30] + 'substr' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [31] + 'syntax' => "\x00\x00\x00\x40\x55\x55\x01\x00\x00", # [15..24] + 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [32] + 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [25] 'unopened' => "\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [5] - 'unsafe' => "\x00\x00\x00\x00\x00\x00\x54\x55\x00", # [25..31] - 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [30] - 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [31] - 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [32] + 'unsafe' => "\x00\x00\x00\x00\x00\x00\x50\x55\x15", # [26..34] + 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [33] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [34] + 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x40", # [35] ); %DeadBits = ( 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", # [0..35] 'ambiguous' => "\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [16] 'closed' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [1] - 'closure' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [26] + 'closure' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [27] 'debugging' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [12] 'deprecated' => "\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [17] + 'digit' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [18] 'exec' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [2] 'inplace' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [13] 'internal' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [14] @@ -80,27 +84,29 @@ use Carp ; 'misc' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [6] 'newline' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [3] 'numeric' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [7] - 'octal' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [18] + 'octal' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [19] 'once' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [8] - 'parenthesis' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [19] + 'overflow' => "\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [28] + 'parenthesis' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [20] 'pipe' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [4] - 'precedence' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [20] - 'printf' => "\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [21] + 'portable' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [29] + 'precedence' => "\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [21] + 'printf' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [22] 'recursion' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [9] 'redefine' => "\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [10] - 'reserved' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [22] - 'semicolon' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [23] + 'reserved' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [23] + 'semicolon' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [24] 'severe' => "\x00\x00\x80\x2a\x00\x00\x00\x00\x00", # [11..14] - 'signal' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [27] - 'substr' => "\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [28] - 'syntax' => "\x00\x00\x00\x80\xaa\xaa\x00\x00\x00", # [15..23] - 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [29] - 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [24] + 'signal' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [30] + 'substr' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [31] + 'syntax' => "\x00\x00\x00\x80\xaa\xaa\x02\x00\x00", # [15..24] + 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [32] + 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [25] 'unopened' => "\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [5] - 'unsafe' => "\x00\x00\x00\x00\x00\x00\xa8\xaa\x00", # [25..31] - 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [30] - 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [31] - 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [32] + 'unsafe' => "\x00\x00\x00\x00\x00\x00\xa0\xaa\x2a", # [26..34] + 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [33] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [34] + 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x80", # [35] ); diff --git a/pod/perllexwarn.pod b/pod/perllexwarn.pod index 81f44cc..b946654 100644 --- a/pod/perllexwarn.pod +++ b/pod/perllexwarn.pod @@ -219,6 +219,10 @@ hierarchy is: | | | +--- closure | | + | +--- overflow + | | + | +--- portable + | | | +--- untie | | | +--- utf8 @@ -241,7 +245,7 @@ hierarchy is: | | | +--- reserved | | - | +--- octal + | +--- digit | | | +--- parenthesis | | @@ -313,10 +317,6 @@ The experimental features need bottomed out. around the limitations of C<$^W>. Now that those limitations are gone, the module should be revisited. - octal - 'octal' controls illegal octal characters warning, but 'unsafe' controls - illegal hexadecimal and binary characters warnings. - =head1 SEE ALSO L. diff --git a/t/pragma/warn/util b/t/pragma/warn/util index 605b42a..eebd920 100644 --- a/t/pragma/warn/util +++ b/t/pragma/warn/util @@ -11,25 +11,25 @@ __END__ # util.c -use warning 'octal' ; +use warning 'digit' ; my $a = oct "029" ; -no warning 'octal' ; +no warning 'digit' ; my $a = oct "029" ; EXPECT Illegal octal digit '9' ignored at - line 3. ######## # util.c -use warning 'unsafe' ; +use warning 'digit' ; *a = hex "0xv9" ; -no warning 'unsafe' ; +no warning 'digit' ; *a = hex "0xv9" ; EXPECT Illegal hexadecimal digit 'v' ignored at - line 3. ######## # util.c -use warning 'unsafe' ; +use warning 'digit' ; *a = oct "0b9" ; -no warning 'unsafe' ; +no warning 'digit' ; *a = oct "0b9" ; EXPECT Illegal binary digit '9' ignored at - line 3. diff --git a/util.c b/util.c index 132ec5e..c84510e 100644 --- a/util.c +++ b/util.c @@ -2809,8 +2809,8 @@ Perl_scan_bin(pTHX_ char *start, I32 len, I32 *retlen) } else { dTHR; - if (ckWARN(WARN_UNSAFE)) - Perl_warner(aTHX_ WARN_UNSAFE, + if (ckWARN(WARN_DIGIT)) + Perl_warner(aTHX_ WARN_DIGIT, "Illegal binary digit '%c' ignored", *s); break; } @@ -2822,8 +2822,8 @@ Perl_scan_bin(pTHX_ char *start, I32 len, I32 *retlen) dTHR; overflowed = TRUE; rnv = (NV) ruv; - if (ckWARN_d(WARN_UNSAFE)) - Perl_warner(aTHX_ WARN_UNSAFE, + if (ckWARN_d(WARN_OVERFLOW)) + Perl_warner(aTHX_ WARN_OVERFLOW, "Integer overflow in binary number"); } else ruv = xuv | (*s - '0'); @@ -2847,8 +2847,8 @@ Perl_scan_bin(pTHX_ char *start, I32 len, I32 *retlen) #endif ) { dTHR; - if (ckWARN(WARN_UNSAFE)) - Perl_warner(aTHX_ WARN_UNSAFE, + if (ckWARN(WARN_PORTABLE)) + Perl_warner(aTHX_ WARN_PORTABLE, "Binary number > 0b11111111111111111111111111111111 non-portable"); } *retlen = s - start; @@ -2873,8 +2873,8 @@ Perl_scan_oct(pTHX_ char *start, I32 len, I32 *retlen) * someone seems to want to use the digits eight and nine). */ if (*s == '8' || *s == '9') { dTHR; - if (ckWARN(WARN_OCTAL)) - Perl_warner(aTHX_ WARN_OCTAL, + if (ckWARN(WARN_DIGIT)) + Perl_warner(aTHX_ WARN_DIGIT, "Illegal octal digit '%c' ignored", *s); } break; @@ -2887,8 +2887,8 @@ Perl_scan_oct(pTHX_ char *start, I32 len, I32 *retlen) dTHR; overflowed = TRUE; rnv = (NV) ruv; - if (ckWARN_d(WARN_UNSAFE)) - Perl_warner(aTHX_ WARN_UNSAFE, + if (ckWARN_d(WARN_OVERFLOW)) + Perl_warner(aTHX_ WARN_OVERFLOW, "Integer overflow in octal number"); } else ruv = xuv | (*s - '0'); @@ -2912,8 +2912,8 @@ Perl_scan_oct(pTHX_ char *start, I32 len, I32 *retlen) #endif ) { dTHR; - if (ckWARN(WARN_UNSAFE)) - Perl_warner(aTHX_ WARN_UNSAFE, + if (ckWARN(WARN_PORTABLE)) + Perl_warner(aTHX_ WARN_PORTABLE, "Octal number > 037777777777 non-portable"); } *retlen = s - start; @@ -2942,8 +2942,8 @@ Perl_scan_hex(pTHX_ char *start, I32 len, I32 *retlen) } else { dTHR; - if (ckWARN(WARN_UNSAFE)) - Perl_warner(aTHX_ WARN_UNSAFE, + if (ckWARN(WARN_DIGIT)) + Perl_warner(aTHX_ WARN_DIGIT, "Illegal hexadecimal digit '%c' ignored", *s); break; } @@ -2955,8 +2955,8 @@ Perl_scan_hex(pTHX_ char *start, I32 len, I32 *retlen) dTHR; overflowed = TRUE; rnv = (NV) ruv; - if (ckWARN_d(WARN_UNSAFE)) - Perl_warner(aTHX_ WARN_UNSAFE, + if (ckWARN_d(WARN_OVERFLOW)) + Perl_warner(aTHX_ WARN_OVERFLOW, "Integer overflow in hexadecimal number"); } else ruv = xuv | ((hexdigit - PL_hexdigit) & 15); @@ -2980,8 +2980,8 @@ Perl_scan_hex(pTHX_ char *start, I32 len, I32 *retlen) #endif ) { dTHR; - if (ckWARN(WARN_UNSAFE)) - Perl_warner(aTHX_ WARN_UNSAFE, + if (ckWARN(WARN_PORTABLE)) + Perl_warner(aTHX_ WARN_PORTABLE, "Hexadecimal number > 0xffffffff non-portable"); } *retlen = s - start; diff --git a/warning.h b/warning.h index 8b0cace..7395a96 100644 --- a/warning.h +++ b/warning.h @@ -79,21 +79,24 @@ #define WARN_SYNTAX 15 #define WARN_AMBIGUOUS 16 #define WARN_DEPRECATED 17 -#define WARN_OCTAL 18 -#define WARN_PARENTHESIS 19 -#define WARN_PRECEDENCE 20 -#define WARN_PRINTF 21 -#define WARN_RESERVED 22 -#define WARN_SEMICOLON 23 -#define WARN_UNINITIALIZED 24 -#define WARN_UNSAFE 25 -#define WARN_CLOSURE 26 -#define WARN_SIGNAL 27 -#define WARN_SUBSTR 28 -#define WARN_TAINT 29 -#define WARN_UNTIE 30 -#define WARN_UTF8 31 -#define WARN_VOID 32 +#define WARN_DIGIT 18 +#define WARN_OCTAL 19 +#define WARN_PARENTHESIS 20 +#define WARN_PRECEDENCE 21 +#define WARN_PRINTF 22 +#define WARN_RESERVED 23 +#define WARN_SEMICOLON 24 +#define WARN_UNINITIALIZED 25 +#define WARN_UNSAFE 26 +#define WARN_CLOSURE 27 +#define WARN_OVERFLOW 28 +#define WARN_PORTABLE 29 +#define WARN_SIGNAL 30 +#define WARN_SUBSTR 31 +#define WARN_TAINT 32 +#define WARN_UNTIE 33 +#define WARN_UTF8 34 +#define WARN_VOID 35 #define WARNsize 9 #define WARN_ALLstring "\125\125\125\125\125\125\125\125\125" diff --git a/warning.pl b/warning.pl index 400fc7e..593b5d7 100644 --- a/warning.pl +++ b/warning.pl @@ -14,6 +14,8 @@ my $tree = { 'taint' => DEFAULT_OFF, 'signal' => DEFAULT_OFF, 'closure' => DEFAULT_OFF, + 'overflow' => DEFAULT_OFF, + 'portable' => DEFAULT_OFF, 'utf8' => DEFAULT_OFF, } , 'io' => { 'pipe' => DEFAULT_OFF, @@ -28,6 +30,7 @@ my $tree = { 'precedence' => DEFAULT_OFF, 'reserved' => DEFAULT_OFF, 'octal' => DEFAULT_OFF, + 'digit' => DEFAULT_OFF, 'parenthesis' => DEFAULT_OFF, 'deprecated' => DEFAULT_OFF, 'printf' => DEFAULT_OFF, -- 2.7.4