pjcj / Devel--Cover

Code coverage metrics for Perl
http://www.pjcj.net/perl.html
93 stars 87 forks source link

Huge amount of warnings while collecting coverage data #292

Closed KalessinD closed 2 years ago

KalessinD commented 2 years ago

Hi!

We had updated Perl upto 5.34.0 and got an impressive amount of warnings with the following message:

Use of uninitialized value in numeric comparison (<=>) at lib/Devel/Cover.pm line 684

These messages occures at check_files method because of lambda function returns undefined values.

    my $l = sub {
        my ($cv) = @_;
        my $line = 0;
        my ($name, $start) = sub_info($cv);
        if ($start) {
            local ($Line, $File);
            get_location($start);
            $line = $Line;
            # print STDERR "$name - $File:$Line\n";
        }
        ($line, $name)
    };

In my case the reason was the situation when $start->can('file') is false. I'd made some debug and found that it happens only if ref($start) eq 'lineseq' and $name eq '_after_some_event' or $name eq 'apply_update_defaults'.

I made a simple hotfix. It is posted below:

diff --git lib/Devel/Cover.pm lib/Devel/Cover.pm
index d3b599ace3..4efdc929da 100644
--- lib/Devel/Cover.pm
+++ lib/Devel/Cover.pm
@@ -684,2 +684,3 @@ sub check_files {
            sort { $a->[1] <=> $b->[1] || $a->[2] cmp $b->[2] }
+           grep { defined $_->[1] }
            {$name} then $start->can('file') is undef
            map  [ $_, $l->($_) ],

Hope that this information will help you to make a correct fix for new perl version.

atoomic commented 2 years ago

Alternatively we could just make sure the values returned by the $l function call are set

     my $l = sub {
         my ($cv) = @_;
         my $line = 0;
         my ($name, $start) = sub_info($cv);
         if ($start) {
             local ($Line, $File);
             get_location($start);
             $line = $Line;
             # print STDERR "$name - $File:$Line\n";
         }
+         $line = 0 unless defined $line;
+         $name = '' unless defined $name;
         ($line, $name)
     };
eaibmz commented 2 years ago

Hi,

and i'm seeing this on s390 architecture:

[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 557.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in substitution (s///) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 558.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in exists at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 562.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 563.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 563.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in exists at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 461.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in substitution (s///) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 466.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in substitution (s///) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 467.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in exists at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 469.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 478.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 478.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 478.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 478.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 478.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 478.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in -e at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 486.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in substitution (s///) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 496.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in open at /usr/local/lib64/perl5/5.32/Devel/Cover/DB/Structure.pm line 189.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in lc at /usr/local/lib64/perl5/5.32/Devel/Cover/DB/Structure.pm line 193.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $f in hash element at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 504.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $f in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 573.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $f in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 574.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $f in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 574.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $f in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 574.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $f in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 574.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $f in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 574.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $f in pattern match (m//) at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 574.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in -e at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 577.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in hash element at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 577.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in hash element at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 579.
[2022-02-10T09:08:21.082Z] Use of uninitialized value $file in hash element at /usr/local/lib64/perl5/5.32/Devel/Cover.pm line 583.
eaibmz commented 2 years ago

Sorry for the noise, updating my Docker fedora:latest image to Fedora 35 solved the issue, it seems.

okurz commented 2 years ago

We can reproduce the issue in openSUSE Tumbleweed with perl version 5.34 as well.

pjcj commented 2 years ago

Thanks to everyone for the information and fixes!