Re: Make all Perl warnings fatal
Peter Eisentraut <peter@eisentraut.org>
From: Peter Eisentraut <peter@eisentraut.org>
To: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2023-08-21T06:20:08Z
Lists: pgsql-hackers
Attachments
- v2-0001-Make-all-Perl-warnings-fatal.patch (text/plain) patch v2-0001
- v2-0002-Avoid-use-of-Perl-getprotobyname.patch (text/plain) patch v2-0002
To avoid a complete bloodbath on cfbot, here is an updated patch set
that includes a workaround for the getprotobyname() issue mentioned below.
On 10.08.23 07:58, Peter Eisentraut wrote:
> We have a lot of Perl scripts in the tree, mostly code generation and
> TAP tests. Occasionally, these scripts produce warnings. These are
> AFAICT always mistakes on the developer side (true positives). Typical
> examples are warnings from genbki.pl or related when you make a mess in
> the catalog files during development, or warnings from tests when they
> massage a config file that looks different on different hosts, or
> mistakes during merges (e.g., duplicate subroutine definitions), or just
> mistakes that weren't noticed, because, you know, there is a lot of
> output in a verbose build.
>
> I wanted to figure put if we can catch these more reliably, in the style
> of -Werror. AFAICT, there is no way to automatically turn all warnings
> into fatal errors. But there is a way to do it per script, by replacing
>
> use warnings;
>
> by
>
> use warnings FATAL => 'all';
>
> See attached patch to try it out.
>
> The documentation at <https://perldoc.perl.org/warnings#Fatal-Warnings>
> appears to sort of hand-wave against doing that. Their argument appears
> to be something like, the modules you use might in the future produce
> additional warnings, thus breaking your scripts. On balance, I'd take
> that risk, if it means I would notice the warnings in a more timely and
> robust way. But that's just me at a moment in time.
>
> Thoughts?
>
>
> Now to some funny business. If you apply this patch, the Cirrus CI
> Linux tasks will fail, because they get an undefined return from
> getprotobyname() in PostgreSQL/Test/Cluster.pm. Huh? I need this patch
> to get past that:
>
> diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm
> b/src/test/perl/PostgreSQL/Test/Cluster.pm
> index 3fa679ff97..dfe7bc7b1a 100644
> --- a/src/test/perl/PostgreSQL/Test/Cluster.pm
> +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm
> @@ -1570,7 +1570,7 @@ sub can_bind
> my ($host, $port) = @_;
> my $iaddr = inet_aton($host);
> my $paddr = sockaddr_in($port, $iaddr);
> - my $proto = getprotobyname("tcp");
> + my $proto = getprotobyname("tcp") || 6;
>
> socket(SOCK, PF_INET, SOCK_STREAM, $proto)
> or die "socket failed: $!";
>
> What is going on there? Does this host not have /etc/protocols, or
> something like that?
>
>
> There are also a couple of issues in the MSVC legacy build system that
> would need to be tightened up in order to survive with fatal Perl
> warnings. Obviously, there is a question whether it's worth spending
> any time on that anymore.
Commits
-
Add missing FATAL => 'all' to a use warnings in Perl
- 014720c6d9fb 18.0 landed
-
Make all Perl warnings fatal in 043_wal_replay_wait.pl
- e1555645d729 18.0 landed
-
Add tap test for pg_signal_autovacuum role
- d2b74882cab8 18.0 cited
-
Implement pg_wal_replay_wait() stored procedure
- 06c418e163e9 17.0 cited
-
Fix an issue in PostgreSQL::Test::Cluster:psql()
- 686db12de3a0 17.0 landed
-
Make all Perl warnings fatal
- c5385929593d 17.0 landed
-
Fix a warning in Perl test code
- a7ebd82b9e50 17.0 landed
-
Avoid use of Perl getprotobyname
- 01226c682ce6 17.0 landed