summaryrefslogtreecommitdiff
path: root/support-files
diff options
context:
space:
mode:
Diffstat (limited to 'support-files')
-rw-r--r--support-files/ccfilter104
-rw-r--r--support-files/compiler_warnings.supp20
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'.*