diff options
-rwxr-xr-x | lib/checksrc.pl | 109 |
1 files changed, 107 insertions, 2 deletions
diff --git a/lib/checksrc.pl b/lib/checksrc.pl index 79b3a889e..4e71ff303 100755 --- a/lib/checksrc.pl +++ b/lib/checksrc.pl @@ -31,7 +31,7 @@ my $file; my $dir="."; my $wlist; my $windows_os = $^O eq 'MSWin32' || $^O eq 'msys' || $^O eq 'cygwin'; - +my $verbose; my %whitelist; my %warnings = ( @@ -51,7 +51,9 @@ my %warnings = ( 'BRACEPOS' => 'wrong position for an open brace', 'INDENTATION' => 'wrong start column for code', 'COPYRIGHT' => 'file missing a copyright statement', -); + 'BADCOMMAND' => 'bad !checksrc! instruction', + 'UNUSEDIGNORE' => 'a warning ignore was not used' + ); sub readwhitelist { open(W, "<$dir/checksrc.whitelist"); @@ -67,8 +69,29 @@ sub checkwarn { my ($name, $num, $col, $file, $line, $msg, $error) = @_; my $w=$error?"error":"warning"; + my $nowarn=0; + + #if(!$warnings{$name}) { + # print STDERR "Dev! there's no description for $name!\n"; + #} + # checksrc.whitelist if($whitelist{$line}) { + $nowarn = 1; + } + # !checksrc! controlled + elsif($ignore{$name}) { + $ignore{$name}--; + $ignore_used{$name}++; + $nowarn = 1; + if(!$ignore{$name}) { + # reached zero, enable again + print "FOO\n"; + enable_warn($name, $line, $file, $l); + } + } + + if($nowarn) { $supressed++; if($w) { $swarnings++; @@ -122,6 +145,7 @@ if(!$file) { print "checksrc.pl [option] <file1> [file2] ...\n"; print " Options:\n"; print " -D[DIR] Directory to prepend file names\n"; + print " -h Show help output\n"; print " -W[file] Whitelist the given file - ignore all its flaws\n"; print "\nDetects and warns for these problems:\n"; for(sort keys %warnings) { @@ -142,6 +166,78 @@ do { } while($file); +sub checksrc_clear { + undef %ignore; + undef %ignore_set; + undef @ignore_line; +} + +sub checksrc_endoffile { + my ($file) = @_; + for(keys %ignore_set) { + if($ignore_set{$_} && !$ignore_used{$_}) { + checkwarn("UNUSEDIGNORE", $ignore_set{$_}, + length($_)+11, $file, + $ignore_line[$ignore_set{$_}], + "Unused ignore: $_"); + } + } +} + +sub enable_warn { + my ($what, $line, $file, $l) = @_; + + # switch it back on, but warn if not triggered! + if(!$ignore_used{$what}) { + checkwarn("UNUSEDIGNORE", + $line, length($what) + 11, $file, $l, + "No warning was inhibited!"); + } + $ignore_set{$what}=0; + $ignore_used{$what}=0; + $ignore{$what}=0; +} +sub checksrc { + my ($cmd, $line, $file, $l) = @_; + if($cmd =~ / *([^ ]*) *(.*)/) { + my ($enable, $what) = ($1, $2); + $what =~ s: *\*/$::; # cut off end of C comment + # print "ENABLE $enable WHAT $what\n"; + if($enable eq "disable") { + my ($warn, $scope)=($1, $2); + if($what =~ /([^ ]*) +(.*)/) { + ($warn, $scope)=($1, $2); + } + else { + $warn = $what; + $scope = 1; + } + # print "IGNORE $warn for SCOPE $scope\n"; + if($scope eq "all") { + $scope=999999; + } + + if($ignore_set{$warn}) { + checkwarn("BADCOMMAND", + $line, 0, $file, $l, + "$warn already disabled from line $ignore_set{$warn}"); + } + else { + $ignore{$warn}=$scope; + $ignore_set{$warn}=$line; + $ignore_line[$line]=$l; + } + } + elsif($enable eq "enable") { + enable_warn($what, $line, $file, $l); + } + else { + checkwarn("BADCOMMAND", + $line, 0, $file, $l, + "Illegal !checksrc! command"); + } + } +} sub scanfile { my ($file) = @_; @@ -152,12 +248,19 @@ sub scanfile { open(R, "<$file") || die "failed to open $file"; my $copyright=0; + checksrc_clear(); # for file based ignores while(<R>) { $windows_os ? $_ =~ s/\r?\n$// : chomp; my $l = $_; my $column = 0; + # check for !checksrc! commands + if($l =~ /\!checksrc\! (.*)/) { + my $cmd = $1; + checksrc($cmd, $line, $file, $l) + } + # check for a copyright statement if(!$copyright && ($l =~ /copyright .* \d\d\d\d/i)) { $copyright=1; @@ -320,6 +423,8 @@ sub scanfile { checkwarn("COPYRIGHT", 1, 0, $file, "", "Missing copyright statement", 1); } + checksrc_endoffile($file); + close(R); } |