diff options
Diffstat (limited to 'support-files')
-rw-r--r-- | support-files/ccfilter | 104 | ||||
-rw-r--r-- | support-files/compiler_warnings.supp | 20 |
2 files changed, 124 insertions, 0 deletions
diff --git a/support-files/ccfilter b/support-files/ccfilter new file mode 100644 index 00000000000..e2957cd3228 --- /dev/null +++ b/support-files/ccfilter @@ -0,0 +1,104 @@ +#! /usr/bin/perl + +# Post-processor for compiler output to filter out warnings matched in +# support-files/compiler_warnings.supp. This makes it easier to check +# that no new warnings are introduced without needing to submit a build +# for Buildbot. +# +# Use by setting CC="ccfilter gcc" CXX="ccfilter gcc" before ./configure. +# +# By default, just filters the output for suppressed warnings. If the +# FAILONWARNING environment variable is set, then instead will fail the +# compile on encountering a non-suppressed warnings. + +use strict; +use warnings; + +my $suppressions; + +open STDOUT_COPY, ">&STDOUT" + or die "Failed to dup stdout: $!]n"; + +my $pid= open(PIPE, '-|'); + +if (!defined($pid)) { + die "Error: Cannot fork(): $!\n"; +} elsif (!$pid) { + # Child. + # actually want to send the STDERR to the parent, not the STDOUT. + # So shuffle things around a bit. + open STDERR, ">&STDOUT" + or die "Child: Failed to dup pipe to parent: $!\n"; + open STDOUT, ">&STDOUT_COPY" + or die "Child: Failed to dup parent stdout: $!\n"; + close STDOUT_COPY; + exec { $ARGV[0] } @ARGV; + die "Child: exec() failed: $!\n"; +} else { + # Parent. + close STDOUT_COPY; + my $cwd= qx(pwd); + chomp($cwd); + while (<PIPE>) { + my $line= $_; + if (/^(.*?):([0-9]+): [Ww]arning: (.*)$/) { + my ($file, $lineno, $msg)= ($1, $2, $3); + $file= "$cwd/$file"; + + next + if check_if_suppressed($file, $lineno, $msg); + die "$line\nGot warning, terminating.\n" + if $ENV{FAILONWARNING}; + print STDERR $line; + next; + } + + print STDERR $line; + } + close(PIPE); +} + +exit 0; + +sub check_if_suppressed { + my ($file, $lineno, $msg)= @_; + load_suppressions() unless defined($suppressions); + for my $s (@$suppressions) { + my ($file_re, $msg_re, $start, $end)= @$s; + if ($file =~ /$file_re/ && + $msg =~ /$msg_re/ && + (!defined($start) || $start <= $lineno) && + (!defined($end) || $end >= $lineno)) { + return 1; + } + } + return undef; +} + +sub load_suppressions { + # First find the suppressions file, might be we need to move up to + # the base directory. + my $path = "support-files/compiler_warnings.supp"; + my $exists; + for (1..10) { + $exists= -f $path; + last if $exists; + $path= '../'. $path; + } + die "Error: Could not find suppression file (out of source dir?).\n" + unless $exists; + + $suppressions= []; + open "F", "<", $path + or die "Error: Could not read suppression file '$path': $!\n"; + while (<F>) { + # Skip comment and empty lines. + next if /^\s*(\#.*)?$/; + die "Invalid syntax in suppression file '$path', line $.:\n$_" + unless /^\s*(.+?)\s*:\s*(.+?)\s*(?:[:]\s*([0-9]+)(?:-([0-9]+))?\s*)?$/; + my ($file_re, $line_re, $start, $end)= ($1, $2, $3, $4); + $end = $start + if defined($start) && !defined($end); + push @$suppressions, [$file_re, $line_re, $start, $end]; + } +} diff --git a/support-files/compiler_warnings.supp b/support-files/compiler_warnings.supp index fbe4b3d21c9..535b8666ec1 100644 --- a/support-files/compiler_warnings.supp +++ b/support-files/compiler_warnings.supp @@ -25,6 +25,9 @@ sql_yacc.cc : .*switch statement contains 'default' but no 'case' labels.* pars0grm.tab.c: .*'yyerrorlab' : unreferenced label.* _flex_tmp.c: .*not enough actual parameters for macro 'yywrap'.* pars0lex.l: .*conversion from 'ulint' to 'int', possible loss of data.* +btr/btr0cur\.c: .*value computed is not used.*: 3175-3375 +include/buf0buf\.ic: unused parameter ‘mtr’ +fil/fil0fil\.c: comparison between signed and unsigned : 3100-3199 # # bdb is not critical to keep up to date @@ -41,6 +44,12 @@ db_vrfy.c : .*comparison is always false due to limited range of data type.* .*/cmd-line-utils/readline/.* : .* # +# Ignore some warnings in libevent, which is not maintained by us. +# +.*/extra/libevent/.* : .*unused parameter.* +.*/extra/libevent/select\.c : .*comparison between signed and unsigned.* : 270-280 + +# # Ignore all conversion warnings on windows 64 # (Is safe as we are not yet supporting strings >= 2G) # @@ -75,6 +84,17 @@ db_vrfy.c : .*comparison is always false due to limited range of data type.* storage/maria/ma_pagecache.c: .*'info_check_pin' defined but not used # +# I think these are due to mix of C and C++. +# +storage/pbxt/ : typedef.*was ignored in this declaration + + +# +# Groff warnings on OpenSUSE. +# +.*/dbug/.*(groff|<standard input>) : .* + +# # Unexplanable (?) stuff # listener.cc : .*conversion from 'SOCKET' to 'int'.* |