Change 35017 by [EMAIL PROTECTED] on 2008/12/05 01:54:55 Integrate: [ 34077] Incorrect variable reported in uninitialized value warning. Ops that can return undef even for defined args, could mistakenly warn that the arg was undefined. (hacked slightly because OP_AEACH isn't present in 5.10.x) [ 34084] more incorrect variable reported in uninitialized value warnings (the ones that change #34077 missed). It also degrades some print warnings - ie variable names no longer displayed. [ 34088] qx($nosuchfile) isn't portable (Windows whines on STDERR) so skip these uninit var tests for now [ 34099] Omit tests introduced by #34077 and #34084 which fail on Win32 [ 34308] Split all the tests for ops that can return undef for defined args into separate tests to diagnose the cause of daily build smoke. [ 34319] Re-instate all the warnings checks that don't work on Win32, but with a SKIP that triggers on Win32. (So that they get tested elsewhere)
Affected files ... ... //depot/maint-5.10/perl/sv.c#32 edit ... //depot/maint-5.10/perl/t/lib/warnings/9uninit#8 edit Differences ... ==== //depot/maint-5.10/perl/sv.c#32 (text) ==== Index: perl/sv.c --- perl/sv.c#31~34707~ 2008-11-03 11:50:31.000000000 -0800 +++ perl/sv.c 2008-12-04 17:54:55.000000000 -0800 @@ -12243,6 +12243,7 @@ case OP_PRTF: case OP_PRINT: case OP_SAY: + match = 1; /* print etc can return undef on defined args */ /* skip filehandle as it can't produce 'undef' warning */ o = cUNOPx(obase)->op_first; if ((obase->op_flags & OPf_STACKED) && o->op_type == OP_PUSHMARK) @@ -12252,8 +12253,81 @@ case OP_ENTEREVAL: /* could be eval $undef or $x='$undef'; eval $x */ case OP_RV2SV: - case OP_CUSTOM: - match = 1; /* XS or custom code could trigger random warnings */ + case OP_CUSTOM: /* XS or custom code could trigger random warnings */ + + /* the following ops are capable of returning PL_sv_undef even for + * defined arg(s) */ + + case OP_BACKTICK: + case OP_PIPE_OP: + case OP_FILENO: + case OP_BINMODE: + case OP_TIED: + case OP_GETC: + case OP_SYSREAD: + case OP_SEND: + case OP_IOCTL: + case OP_SOCKET: + case OP_SOCKPAIR: + case OP_BIND: + case OP_CONNECT: + case OP_LISTEN: + case OP_ACCEPT: + case OP_SHUTDOWN: + case OP_SSOCKOPT: + case OP_GETPEERNAME: + case OP_FTRREAD: + case OP_FTRWRITE: + case OP_FTREXEC: + case OP_FTROWNED: + case OP_FTEREAD: + case OP_FTEWRITE: + case OP_FTEEXEC: + case OP_FTEOWNED: + case OP_FTIS: + case OP_FTZERO: + case OP_FTSIZE: + case OP_FTFILE: + case OP_FTDIR: + case OP_FTLINK: + case OP_FTPIPE: + case OP_FTSOCK: + case OP_FTBLK: + case OP_FTCHR: + case OP_FTTTY: + case OP_FTSUID: + case OP_FTSGID: + case OP_FTSVTX: + case OP_FTTEXT: + case OP_FTBINARY: + case OP_FTMTIME: + case OP_FTATIME: + case OP_FTCTIME: + case OP_READLINK: + case OP_OPEN_DIR: + case OP_READDIR: + case OP_TELLDIR: + case OP_SEEKDIR: + case OP_REWINDDIR: + case OP_CLOSEDIR: + case OP_GMTIME: + case OP_ALARM: + case OP_SEMGET: + case OP_GETLOGIN: + case OP_UNDEF: + case OP_SUBSTR: + /* case OP_AEACH: not in 5.10.x */ + case OP_EACH: + case OP_SORT: + case OP_CALLER: + case OP_DOFILE: + case OP_PROTOTYPE: + case OP_NCMP: + case OP_SMARTMATCH: + case OP_UNPACK: + case OP_SYSOPEN: + case OP_SYSSEEK: + match = 1; goto do_op; case OP_ENTERSUB: @@ -12265,6 +12339,7 @@ Need a better fix at dome point. DAPM 11/2007 */ break; + case OP_POS: /* def-ness of rval pos() is independent of the def-ness of its arg */ if ( !(obase->op_flags & OPf_MOD)) ==== //depot/maint-5.10/perl/t/lib/warnings/9uninit#8 (text) ==== Index: perl/t/lib/warnings/9uninit --- perl/t/lib/warnings/9uninit#7~33950~ 2008-05-30 08:37:39.000000000 -0700 +++ perl/t/lib/warnings/9uninit 2008-12-04 17:54:55.000000000 -0800 @@ -282,13 +282,13 @@ print STDERR $m1, $g1, $ga[1],$m2; print STDERR "", $ga[1],""; EXPECT -Use of uninitialized value $ga[1000] in print at - line 5. -Use of uninitialized value $ga[1000] in print at - line 6. +Use of uninitialized value in print at - line 5. +Use of uninitialized value in print at - line 6. Use of uninitialized value $m1 in print at - line 7. Use of uninitialized value $g1 in print at - line 7. Use of uninitialized value in print at - line 7. Use of uninitialized value $m2 in print at - line 7. -Use of uninitialized value $ga[1] in print at - line 8. +Use of uninitialized value in print at - line 8. ######## use warnings 'uninitialized'; my ($m1); @@ -1161,15 +1161,15 @@ Use of uninitialized value $g1 in printf at - line 6. Use of uninitialized value $g2 in printf at - line 6. 0000 -Use of uninitialized value $ga[1000] in printf at - line 7. -Use of uninitialized value $ga[1000] in printf at - line 8. +Use of uninitialized value in printf at - line 7. +Use of uninitialized value in printf at - line 8. FOO1: Use of uninitialized value $m1 in printf at - line 9. Use of uninitialized value $g1 in printf at - line 9. Use of uninitialized value in printf at - line 9. Use of uninitialized value $m2 in printf at - line 9. FOO2: -Use of uninitialized value $ga[1] in printf at - line 10. +Use of uninitialized value in printf at - line 10. FOO3:XY ######## use warnings 'uninitialized'; @@ -1396,3 +1396,453 @@ EXPECT Use of uninitialized value $undef in addition (+) at - line 4. Use of uninitialized value $undef in addition (+) at - line 7. +######## +use warnings 'uninitialized'; +# +# ops that can return undef for defined args +# split into separate tests to diagnose the cause of daily build smoke +# +# *** `` not tested: Windows produces an error on STDERR +# *** ditto qx() +# *** pipe() not tested +# *** ioctl not tested +# *** socket not tested +# *** socketpair not tested +# *** bind not tested +# *** connect not tested +# *** listen not tested +# *** shutdown not tested +# *** setsockopt not tested +# *** getpeername not tested +# *** readdir not tested +# *** telldir not tested +# *** seekdir not tested +# *** rewinddir not tested +# *** closedir not tested +# *** gmtime not tested +# *** alarm not tested +# *** semget not tested +# *** getlogin not tested +EXPECT +######## +use warnings 'uninitialized'; +if ($^O eq 'MSWin32') { + print <<'EOM'; +SKIPPED +# `` produces an error on STDERR on Win32 +EOM + exit; +} +my $nocmd = '/no/such/command'; +my $v; +$v = 1 + `$nocmd`; +EXPECT +Use of uninitialized value in addition (+) at - line 11. +######## +use warnings 'uninitialized'; +if ($^O eq 'MSWin32') { + print <<'EOM'; +SKIPPED +# qx produces an error on STDERR on Win32 +EOM + exit; +} +my $nocmd = '/no/such/command'; +my $v; +$v = 1 + qx($nocmd); +EXPECT +Use of uninitialized value in addition (+) at - line 11. +######## +use warnings 'uninitialized'; +my $nan = "NaN"; +if ($nan == $nan) { + print <<'EOM'; +SKIPPED +# NaN not supported here. +EOM + exit; +} +my $v; +$v = 1 + ($nan <=> 1); +EXPECT +Use of uninitialized value in addition (+) at - line 11. +######## +use warnings 'uninitialized'; +if ($^O eq 'MSWin32') { + print <<'EOM'; +SKIPPED +# -k produces no warning on Win32 +EOM + exit; +} +my $nofile = '/no/such/file'; +my $v; +$v = 1 + -k $nofile; +EXPECT +Use of uninitialized value in addition (+) at - line 11. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +my $f = ""; +$v = 1 + open($f, $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 5. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + fileno($nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + binmode($nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + tied($nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + getc($nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + sysread($nofile, my $buf,1); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + eval { send($nofile, $buf,0) }; +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +my $fh = ""; +$v = 1 + eval { accept($fh, $nofile) }; +EXPECT +Use of uninitialized value in addition (+) at - line 5. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-r $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-w $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-x $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-o $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-R $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-W $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-X $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-O $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-e $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-z $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-s $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-f $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-d $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-l $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-p $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-S $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-b $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-c $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-t $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-u $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-g $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-T $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-B $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-M $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-A $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + (-C $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + eval { readlink $nofile }; +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + opendir($f, $nofile); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + undef; +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +my $x = 1; $v = 1 + undef($x); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $v; +my $emptys = ""; +$v = 1 + substr($emptys,2,1); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $v; +my @emptya; +$v = 1 + each @emptya; # *** Not supported under 5.10.x +EXPECT +Type of arg 1 to each must be hash (not private array) at - line 4, near "@emptya;" +Execution of - aborted due to compilation errors. +######## +use warnings 'uninitialized'; +my $v; +my %emptyh; +$v = 1 + each %emptyh; +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $v; +my @emptya; +$v = 1 + sort @emptya; +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $v; +my $zero = 0; $v = 1 + caller($zero); +EXPECT +Use of uninitialized value in addition (+) at - line 3. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +$v = 1 + do $nofile; +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $v; +my $fn = sub {}; +$v = 1 + prototype $fn; +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $v; +my $fn = sub {}; +$v = 1 + ($fn ~~ 1); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $v; +my $f = ""; +$v = 1 + (print STDIN $f); # print to STDIN returns undef +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $v; +my $f = ""; +$v = 1 + (printf STDIN "%s", $f); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $v; +my $f = ""; +{ use feature 'say'; $v = 1 + (say STDIN "%s", $f); } +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $v; +my $f = ""; +$v = 1 + (unpack("",$f)); +EXPECT +Use of uninitialized value in addition (+) at - line 4. +######## +use warnings 'uninitialized'; +my $nofile = '/no/such/file'; +my $v; +my $f = ""; +$v = 1 + sysopen($f, $nofile, 0); +EXPECT +Use of uninitialized value in addition (+) at - line 5. +######## +use warnings 'uninitialized'; +my $v; +{ my $x = -1; $v = 1 + sysseek(STDIN, $x, 0); } +EXPECT +Use of uninitialized value in addition (+) at - line 3. End of Patch.