diff options
| author | Andy Whitcroft <apw@shadowen.org> | 2007-06-08 16:47:06 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-06-08 20:23:34 -0400 |
| commit | 00df344fd06fd6ac71d0665f1ce8cc6870e4f564 (patch) | |
| tree | 78090d7216bfbb32ca2fe630fff5a5445b539862 /scripts | |
| parent | c7909234993973692414901055dfbebbca21e73f (diff) | |
update checkpatch.pl to version 0.04
This version brings a some new tests, and a host of changes to fix
false positives, of particular note:
- check for and report #if 0
- extend checking of line lengths and spacing for .pl, .sh etc
- extends the pointer type checks to multiple levels
- updates printk handling to track newlines
- adds a wrapped patch detector
- drops the leading component of the filenames
- extends switch indent handling to switch statmentes rooted in
the context
- adds foo * bar single pointer checks
This version of checkpatch.pl can be found at the following URL:
http://www.shadowen.org/~apw/public/checkpatch/checkpatch.pl-0.04
Full Changelog:
Andy Whitcroft (16):
allow checking line lengths and spacing on other source files
clean up that whitespace
sanitise the input line standardising the content of quotes
clean up pointer type * and space checks
fix up the sanitiser so it maintains the line length
apply the printk facility checks only to the first printk in a set
switch/case indent checks may anchor in the context
add a wrapped patch detector
put the #ifdef in C file checks on ice
asm volatile is acceptable
check for and report #if 0
drop the leading component of the filename as patches are -p1
use the original line when reporting operator errors
correct spelling of Joel's name
Version: 0.04
add support for struct foo * bar checks
Geert Uytterhoeven (1):
Fix checkpatch.pl name in usage template
Randy Dunlap (1):
checkpatch: produce fewer lines of output
Signed-off-by: Andy Whitcroft <apw@shadowen.org>
Cc: Randy Dunlap <rdunlap@xenotime.net>
Cc: Joel Schopp <jschopp@austin.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/checkpatch.pl | 274 |
1 files changed, 193 insertions, 81 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 39339529b99..aea90d30d22 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
| @@ -1,14 +1,15 @@ | |||
| 1 | #!/usr/bin/perl -w | 1 | #!/usr/bin/perl -w |
| 2 | # (c) 2001, Dave Jones. <davej@codemonkey.org.uk> (the file handling bit) | 2 | # (c) 2001, Dave Jones. <davej@codemonkey.org.uk> (the file handling bit) |
| 3 | # (c) 2005, Joel Scohpp <jschopp@austin.ibm.com> (the ugly bit) | 3 | # (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit) |
| 4 | # (c) 2007, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite, etc) | 4 | # (c) 2007, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite, etc) |
| 5 | # Licensed under the terms of the GNU GPL License version 2 | 5 | # Licensed under the terms of the GNU GPL License version 2 |
| 6 | 6 | ||
| 7 | use strict; | 7 | use strict; |
| 8 | 8 | ||
| 9 | my $P = $0; | 9 | my $P = $0; |
| 10 | $P =~ s@.*/@@g; | ||
| 10 | 11 | ||
| 11 | my $V = '0.03'; | 12 | my $V = '0.04'; |
| 12 | 13 | ||
| 13 | use Getopt::Long qw(:config no_auto_abbrev); | 14 | use Getopt::Long qw(:config no_auto_abbrev); |
| 14 | 15 | ||
| @@ -26,7 +27,7 @@ GetOptions( | |||
| 26 | my $exit = 0; | 27 | my $exit = 0; |
| 27 | 28 | ||
| 28 | if ($#ARGV < 0) { | 29 | if ($#ARGV < 0) { |
| 29 | print "usage: patchstylecheckemail.pl [options] patchfile\n"; | 30 | print "usage: $P [options] patchfile\n"; |
| 30 | print "version: $V\n"; | 31 | print "version: $V\n"; |
| 31 | print "options: -q => quiet\n"; | 32 | print "options: -q => quiet\n"; |
| 32 | print " --no-tree => run without a kernel tree\n"; | 33 | print " --no-tree => run without a kernel tree\n"; |
| @@ -59,15 +60,15 @@ if ($tree && -f $removal) { | |||
| 59 | } | 60 | } |
| 60 | } | 61 | } |
| 61 | 62 | ||
| 62 | my @lines = (); | 63 | my @rawlines = (); |
| 63 | while (<>) { | 64 | while (<>) { |
| 64 | chomp; | 65 | chomp; |
| 65 | push(@lines, $_); | 66 | push(@rawlines, $_); |
| 66 | if (eof(ARGV)) { | 67 | if (eof(ARGV)) { |
| 67 | if (!process($ARGV, @lines)) { | 68 | if (!process($ARGV, @rawlines)) { |
| 68 | $exit = 1; | 69 | $exit = 1; |
| 69 | } | 70 | } |
| 70 | @lines = (); | 71 | @rawlines = (); |
| 71 | } | 72 | } |
| 72 | } | 73 | } |
| 73 | 74 | ||
| @@ -118,24 +119,57 @@ sub line_stats { | |||
| 118 | return (length($line), length($white)); | 119 | return (length($line), length($white)); |
| 119 | } | 120 | } |
| 120 | 121 | ||
| 122 | sub sanitise_line { | ||
| 123 | my ($line) = @_; | ||
| 124 | |||
| 125 | my $res = ''; | ||
| 126 | my $l = ''; | ||
| 127 | |||
| 128 | my $quote = ''; | ||
| 129 | |||
| 130 | foreach my $c (split(//, $line)) { | ||
| 131 | if ($l ne "\\" && ($c eq "'" || $c eq '"')) { | ||
| 132 | if ($quote eq '') { | ||
| 133 | $quote = $c; | ||
| 134 | $res .= $c; | ||
| 135 | $l = $c; | ||
| 136 | next; | ||
| 137 | } elsif ($quote eq $c) { | ||
| 138 | $quote = ''; | ||
| 139 | } | ||
| 140 | } | ||
| 141 | if ($quote && $c ne "\t") { | ||
| 142 | $res .= "X"; | ||
| 143 | } else { | ||
| 144 | $res .= $c; | ||
| 145 | } | ||
| 146 | |||
| 147 | $l = $c; | ||
| 148 | } | ||
| 149 | |||
| 150 | return $res; | ||
| 151 | } | ||
| 152 | |||
| 121 | sub ctx_block_get { | 153 | sub ctx_block_get { |
| 122 | my ($linenr, $remain, $outer) = @_; | 154 | my ($linenr, $remain, $outer) = @_; |
| 123 | my $line; | 155 | my $line; |
| 124 | my $start = $linenr - 1; | 156 | my $start = $linenr - 1; |
| 125 | my $end = $linenr - 1 + $remain; | ||
| 126 | my $blk = ''; | 157 | my $blk = ''; |
| 127 | my @o; | 158 | my @o; |
| 128 | my @c; | 159 | my @c; |
| 129 | my @res = (); | 160 | my @res = (); |
| 130 | 161 | ||
| 131 | for ($line = $start; $line < $end; $line++) { | 162 | for ($line = $start; $remain > 0; $line++) { |
| 132 | $blk .= $lines[$line]; | 163 | next if ($rawlines[$line] =~ /^-/); |
| 164 | $remain--; | ||
| 165 | |||
| 166 | $blk .= $rawlines[$line]; | ||
| 133 | 167 | ||
| 134 | @o = ($blk =~ /\{/g); | 168 | @o = ($blk =~ /\{/g); |
| 135 | @c = ($blk =~ /\}/g); | 169 | @c = ($blk =~ /\}/g); |
| 136 | 170 | ||
| 137 | if (!$outer || (scalar(@o) - scalar(@c)) == 1) { | 171 | if (!$outer || (scalar(@o) - scalar(@c)) == 1) { |
| 138 | push(@res, $lines[$line]); | 172 | push(@res, $rawlines[$line]); |
| 139 | } | 173 | } |
| 140 | 174 | ||
| 141 | last if (scalar(@o) == scalar(@c)); | 175 | last if (scalar(@o) == scalar(@c)); |
| @@ -158,7 +192,7 @@ sub ctx_locate_comment { | |||
| 158 | my ($first_line, $end_line) = @_; | 192 | my ($first_line, $end_line) = @_; |
| 159 | 193 | ||
| 160 | # Catch a comment on the end of the line itself. | 194 | # Catch a comment on the end of the line itself. |
| 161 | my ($current_comment) = ($lines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*$@); | 195 | my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*$@); |
| 162 | return $current_comment if (defined $current_comment); | 196 | return $current_comment if (defined $current_comment); |
| 163 | 197 | ||
| 164 | # Look through the context and try and figure out if there is a | 198 | # Look through the context and try and figure out if there is a |
| @@ -166,8 +200,8 @@ sub ctx_locate_comment { | |||
| 166 | my $in_comment = 0; | 200 | my $in_comment = 0; |
| 167 | $current_comment = ''; | 201 | $current_comment = ''; |
| 168 | for (my $linenr = $first_line; $linenr < $end_line; $linenr++) { | 202 | for (my $linenr = $first_line; $linenr < $end_line; $linenr++) { |
| 169 | my $line = $lines[$linenr - 1]; | 203 | my $line = $rawlines[$linenr - 1]; |
| 170 | ##warn " $line\n"; | 204 | #warn " $line\n"; |
| 171 | if ($linenr == $first_line and $line =~ m@^.\s*\*@) { | 205 | if ($linenr == $first_line and $line =~ m@^.\s*\*@) { |
| 172 | $in_comment = 1; | 206 | $in_comment = 1; |
| 173 | } | 207 | } |
| @@ -190,7 +224,7 @@ sub ctx_has_comment { | |||
| 190 | my ($first_line, $end_line) = @_; | 224 | my ($first_line, $end_line) = @_; |
| 191 | my $cmt = ctx_locate_comment($first_line, $end_line); | 225 | my $cmt = ctx_locate_comment($first_line, $end_line); |
| 192 | 226 | ||
| 193 | ##print "LINE: $lines[$end_line - 1 ]\n"; | 227 | ##print "LINE: $rawlines[$end_line - 1 ]\n"; |
| 194 | ##print "CMMT: $cmt\n"; | 228 | ##print "CMMT: $cmt\n"; |
| 195 | 229 | ||
| 196 | return ($cmt ne ''); | 230 | return ($cmt ne ''); |
| @@ -205,10 +239,6 @@ sub cat_vet { | |||
| 205 | return $vet; | 239 | return $vet; |
| 206 | } | 240 | } |
| 207 | 241 | ||
| 208 | sub has_non_quoted { | ||
| 209 | return ($_[0] =~ m{$_[1]} and $_[0] !~ m{\".*$_[1].*\"}); | ||
| 210 | } | ||
| 211 | |||
| 212 | sub process { | 242 | sub process { |
| 213 | my $filename = shift; | 243 | my $filename = shift; |
| 214 | my @lines = @_; | 244 | my @lines = @_; |
| @@ -240,6 +270,7 @@ sub process { | |||
| 240 | #extract the filename as it passes | 270 | #extract the filename as it passes |
| 241 | if ($line=~/^\+\+\+\s+(\S+)/) { | 271 | if ($line=~/^\+\+\+\s+(\S+)/) { |
| 242 | $realfile=$1; | 272 | $realfile=$1; |
| 273 | $realfile =~ s@^[^/]*/@@; | ||
| 243 | $in_comment = 0; | 274 | $in_comment = 0; |
| 244 | next; | 275 | next; |
| 245 | } | 276 | } |
| @@ -262,7 +293,6 @@ sub process { | |||
| 262 | # blank context lines so we need to count that too. | 293 | # blank context lines so we need to count that too. |
| 263 | if ($line =~ /^( |\+|$)/) { | 294 | if ($line =~ /^( |\+|$)/) { |
| 264 | $realline++; | 295 | $realline++; |
| 265 | $realcnt-- if ($realcnt != 0); | ||
| 266 | 296 | ||
| 267 | # track any sort of multi-line comment. Obviously if | 297 | # track any sort of multi-line comment. Obviously if |
| 268 | # the added text or context do not include the whole | 298 | # the added text or context do not include the whole |
| @@ -288,11 +318,13 @@ sub process { | |||
| 288 | ($prevline, $stashline) = ($stashline, $line); | 318 | ($prevline, $stashline) = ($stashline, $line); |
| 289 | ($previndent, $stashindent) = ($stashindent, $indent); | 319 | ($previndent, $stashindent) = ($stashindent, $indent); |
| 290 | } | 320 | } |
| 321 | $realcnt-- if ($realcnt != 0); | ||
| 291 | 322 | ||
| 292 | #make up the handle for any error we report on this line | 323 | #make up the handle for any error we report on this line |
| 293 | $here = "#$linenr: "; | 324 | $here = "#$linenr: "; |
| 294 | $here .= "FILE: $realfile:$realline:" if ($realcnt != 0); | 325 | $here .= "FILE: $realfile:$realline:" if ($realcnt != 0); |
| 295 | 326 | ||
| 327 | my $hereline = "$here\n$line\n"; | ||
| 296 | my $herecurr = "$here\n$line\n\n"; | 328 | my $herecurr = "$here\n$line\n\n"; |
| 297 | my $hereprev = "$here\n$prevline\n$line\n\n"; | 329 | my $hereprev = "$here\n$prevline\n$line\n\n"; |
| 298 | 330 | ||
| @@ -315,21 +347,28 @@ sub process { | |||
| 315 | } | 347 | } |
| 316 | } | 348 | } |
| 317 | 349 | ||
| 318 | #ignore lines not being added | 350 | # Check for wrappage within a valid hunk of the file |
| 319 | if ($line=~/^[^\+]/) {next;} | 351 | if ($realcnt != 0 && $line !~ m{^(?:\+|-| |$)}) { |
| 352 | print "patch seems to be corrupt (line wrapped?) [$realcnt]\n"; | ||
| 353 | print "$herecurr"; | ||
| 354 | $clean = 0; | ||
| 355 | } | ||
| 356 | |||
| 357 | #ignore lines being removed | ||
| 358 | if ($line=~/^-/) {next;} | ||
| 320 | 359 | ||
| 321 | # check we are in a valid source file *.[hcsS] if not then ignore this hunk | 360 | # check we are in a valid source file if not then ignore this hunk |
| 322 | next if ($realfile !~ /\.[hcsS]$/); | 361 | next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/); |
| 323 | 362 | ||
| 324 | #trailing whitespace | 363 | #trailing whitespace |
| 325 | if ($line=~/\S\s+$/) { | 364 | if ($line=~/\+.*\S\s+$/) { |
| 326 | my $herevet = "$here\n" . cat_vet($line) . "\n\n"; | 365 | my $herevet = "$here\n" . cat_vet($line) . "\n\n"; |
| 327 | print "trailing whitespace\n"; | 366 | print "trailing whitespace\n"; |
| 328 | print "$herevet"; | 367 | print "$herevet"; |
| 329 | $clean = 0; | 368 | $clean = 0; |
| 330 | } | 369 | } |
| 331 | #80 column limit | 370 | #80 column limit |
| 332 | if (!($prevline=~/\/\*\*/) && $length > 80) { | 371 | if ($line =~ /^\+/ && !($prevline=~/\/\*\*/) && $length > 80) { |
| 333 | print "line over 80 characters\n"; | 372 | print "line over 80 characters\n"; |
| 334 | print "$herecurr"; | 373 | print "$herecurr"; |
| 335 | $clean = 0; | 374 | $clean = 0; |
| @@ -353,19 +392,59 @@ sub process { | |||
| 353 | # | 392 | # |
| 354 | next if ($in_comment); | 393 | next if ($in_comment); |
| 355 | 394 | ||
| 395 | # Remove comments from the line before processing. | ||
| 396 | $line =~ s@/\*.*\*/@@g; | ||
| 397 | $line =~ s@/\*.*@@; | ||
| 398 | $line =~ s@.*\*/@@; | ||
| 399 | |||
| 400 | # | ||
| 401 | # Checks which may be anchored in the context. | ||
| 402 | # | ||
| 403 | |||
| 404 | # Check for switch () and associated case and default | ||
| 405 | # statements should be at the same indent. | ||
| 406 | if ($line=~/\bswitch\s*\(.*\)/) { | ||
| 407 | my $err = ''; | ||
| 408 | my $sep = ''; | ||
| 409 | my @ctx = ctx_block_outer($linenr, $realcnt); | ||
| 410 | shift(@ctx); | ||
| 411 | for my $ctx (@ctx) { | ||
| 412 | my ($clen, $cindent) = line_stats($ctx); | ||
| 413 | if ($ctx =~ /^\+\s*(case\s+|default:)/ && | ||
| 414 | $indent != $cindent) { | ||
| 415 | $err .= "$sep$ctx\n"; | ||
| 416 | $sep = ''; | ||
| 417 | } else { | ||
| 418 | $sep = "[...]\n"; | ||
| 419 | } | ||
| 420 | } | ||
| 421 | if ($err ne '') { | ||
| 422 | print "switch and case should be at the same indent\n"; | ||
| 423 | print "$here\n$line\n$err\n"; | ||
| 424 | $clean = 0; | ||
| 425 | } | ||
| 426 | } | ||
| 427 | |||
| 428 | #ignore lines not being added | ||
| 429 | if ($line=~/^[^\+]/) {next;} | ||
| 430 | |||
| 431 | # | ||
| 432 | # Checks which are anchored on the added line. | ||
| 433 | # | ||
| 434 | |||
| 356 | # no C99 // comments | 435 | # no C99 // comments |
| 357 | if (has_non_quoted($line, '//')) { | 436 | if ($line =~ m{//}) { |
| 358 | print "do not use C99 // comments\n"; | 437 | print "do not use C99 // comments\n"; |
| 359 | print "$herecurr"; | 438 | print "$herecurr"; |
| 360 | $clean = 0; | 439 | $clean = 0; |
| 361 | } | 440 | } |
| 362 | 441 | # Remove C99 comments. | |
| 363 | # Remove comments from the line before processing. | ||
| 364 | $line =~ s@/\*.*\*/@@g; | ||
| 365 | $line =~ s@/\*.*@@; | ||
| 366 | $line =~ s@.*\*/@@; | ||
| 367 | $line =~ s@//.*@@; | 442 | $line =~ s@//.*@@; |
| 368 | 443 | ||
| 444 | # Standardise the strings and chars within the input | ||
| 445 | # to simplify matching. | ||
| 446 | $line = sanitise_line($line); | ||
| 447 | |||
| 369 | #EXPORT_SYMBOL should immediately follow its function closing }. | 448 | #EXPORT_SYMBOL should immediately follow its function closing }. |
| 370 | if (($line =~ /EXPORT_SYMBOL.*\(.*\)/) || | 449 | if (($line =~ /EXPORT_SYMBOL.*\(.*\)/) || |
| 371 | ($line =~ /EXPORT_UNUSED_SYMBOL.*\(.*\)/)) { | 450 | ($line =~ /EXPORT_UNUSED_SYMBOL.*\(.*\)/)) { |
| @@ -393,8 +472,28 @@ sub process { | |||
| 393 | } | 472 | } |
| 394 | 473 | ||
| 395 | # * goes on variable not on type | 474 | # * goes on variable not on type |
| 396 | if ($line=~/[A-Za-z\d_]+\* [A-Za-z\d_]+/) { | 475 | my $type = '(?:char|short|int|long|unsigned|float|double|' . |
| 397 | print "\"foo* bar\" should be \"foo *bar\"\n"; | 476 | 'struct\s+[A-Za-z\d_]+|' . |
| 477 | 'union\s+[A-Za-z\d_]+)'; | ||
| 478 | |||
| 479 | if ($line =~ m{[A-Za-z\d_]+(\*+) [A-Za-z\d_]+}) { | ||
| 480 | print "\"foo$1 bar\" should be \"foo $1bar\"\n"; | ||
| 481 | print "$herecurr"; | ||
| 482 | $clean = 0; | ||
| 483 | } | ||
| 484 | if ($line =~ m{$type (\*) [A-Za-z\d_]+} || | ||
| 485 | $line =~ m{[A-Za-z\d_]+ (\*\*+) [A-Za-z\d_]+}) { | ||
| 486 | print "\"foo $1 bar\" should be \"foo $1bar\"\n"; | ||
| 487 | print "$herecurr"; | ||
| 488 | $clean = 0; | ||
| 489 | } | ||
| 490 | if ($line =~ m{\([A-Za-z\d_\s]+[A-Za-z\d_](\*+)\)}) { | ||
| 491 | print "\"(foo$1)\" should be \"(foo $1)\"\n"; | ||
| 492 | print "$herecurr"; | ||
| 493 | $clean = 0; | ||
| 494 | } | ||
| 495 | if ($line =~ m{\([A-Za-z\d_\s]+[A-Za-z\d_]\s+(\*+)\s+\)}) { | ||
| 496 | print "\"(foo $1 )\" should be \"(foo $1)\"\n"; | ||
| 398 | print "$herecurr"; | 497 | print "$herecurr"; |
| 399 | $clean = 0; | 498 | $clean = 0; |
| 400 | } | 499 | } |
| @@ -406,11 +505,29 @@ sub process { | |||
| 406 | # $clean = 0; | 505 | # $clean = 0; |
| 407 | # } | 506 | # } |
| 408 | 507 | ||
| 409 | # printk should use KERN_* levels | 508 | # printk should use KERN_* levels. Note that follow on printk's on the |
| 509 | # same line do not need a level, so we use the current block context | ||
| 510 | # to try and find and validate the current printk. In summary the current | ||
| 511 | # printk includes all preceeding printk's which have no newline on the end. | ||
| 512 | # we assume the first bad printk is the one to report. | ||
| 410 | if ($line =~ /\bprintk\((?!KERN_)/) { | 513 | if ($line =~ /\bprintk\((?!KERN_)/) { |
| 411 | print "printk() should include KERN_ facility level\n"; | 514 | my $ok = 0; |
| 412 | print "$herecurr"; | 515 | for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) { |
| 413 | $clean = 0; | 516 | #print "CHECK<$lines[$ln - 1]\n"; |
| 517 | # we have a preceeding printk if it ends | ||
| 518 | # with "\n" ignore it, else it is to blame | ||
| 519 | if ($lines[$ln - 1] =~ m{\bprintk\(}) { | ||
| 520 | if ($rawlines[$ln - 1] !~ m{\\n"}) { | ||
| 521 | $ok = 1; | ||
| 522 | } | ||
| 523 | last; | ||
| 524 | } | ||
| 525 | } | ||
| 526 | if ($ok == 0) { | ||
| 527 | print "printk() should include KERN_ facility level\n"; | ||
| 528 | print "$herecurr"; | ||
| 529 | $clean = 0; | ||
| 530 | } | ||
| 414 | } | 531 | } |
| 415 | 532 | ||
| 416 | #function brace can't be on same line, except for #defines of do while, or if closed on same line | 533 | #function brace can't be on same line, except for #defines of do while, or if closed on same line |
| @@ -425,11 +542,11 @@ sub process { | |||
| 425 | # will therefore also expand that way. | 542 | # will therefore also expand that way. |
| 426 | my $opline = $line; | 543 | my $opline = $line; |
| 427 | $opline = expand_tabs($opline); | 544 | $opline = expand_tabs($opline); |
| 428 | $opline =~ s/^.//; | 545 | $opline =~ s/^./ /; |
| 429 | if (!($line=~/\#\s*include/)) { | 546 | if (!($line=~/\#\s*include/)) { |
| 430 | # Check operator spacing. | 547 | # Check operator spacing. |
| 431 | my @elements = split(/(<<=|>>=|<=|>=|==|!=|\+=|-=|\*=|\/=|%=|\^=|\|=|&=|->|<<|>>|<|>|=|!|~|&&|\|\||,|\^|\+\+|--|;|&|\||\+|-|\*|\/\/|\/)/, $opline); | 548 | my @elements = split(/(<<=|>>=|<=|>=|==|!=|\+=|-=|\*=|\/=|%=|\^=|\|=|&=|->|<<|>>|<|>|=|!|~|&&|\|\||,|\^|\+\+|--|;|&|\||\+|-|\*|\/\/|\/)/, $opline); |
| 432 | my $off = 1; | 549 | my $off = 0; |
| 433 | for (my $n = 0; $n < $#elements; $n += 2) { | 550 | for (my $n = 0; $n < $#elements; $n += 2) { |
| 434 | $off += length($elements[$n]); | 551 | $off += length($elements[$n]); |
| 435 | 552 | ||
| @@ -452,16 +569,21 @@ sub process { | |||
| 452 | $c = 'E'; | 569 | $c = 'E'; |
| 453 | } | 570 | } |
| 454 | 571 | ||
| 572 | # Pick up the preceeding and succeeding characters. | ||
| 573 | my $ca = substr($opline, $off - 1, 1); | ||
| 574 | my $cc = ''; | ||
| 575 | if (length($opline) > ($off + length($elements[$n]))) { | ||
| 576 | $cc = substr($opline, $off + 1 + length($elements[$n]), 1); | ||
| 577 | } | ||
| 578 | |||
| 455 | my $ctx = "${a}x${c}"; | 579 | my $ctx = "${a}x${c}"; |
| 456 | 580 | ||
| 457 | my $at = "(ctx:$ctx)"; | 581 | my $at = "(ctx:$ctx)"; |
| 458 | 582 | ||
| 459 | my $ptr = (" " x $off) . "^"; | 583 | my $ptr = (" " x $off) . "^"; |
| 460 | my $hereptr = "$here\n$line\n$ptr\n\n"; | 584 | my $hereptr = "$hereline$ptr\n\n"; |
| 461 | 585 | ||
| 462 | ##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>\n"; | 586 | ##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>\n"; |
| 463 | # Skip things apparently in quotes. | ||
| 464 | next if ($line=~/\".*\Q$op\E.*\"/ or $line=~/\'\Q$op\E\'/); | ||
| 465 | 587 | ||
| 466 | # We need ; as an operator. // is a comment. | 588 | # We need ; as an operator. // is a comment. |
| 467 | if ($op eq ';' or $op eq '//') { | 589 | if ($op eq ';' or $op eq '//') { |
| @@ -515,20 +637,26 @@ sub process { | |||
| 515 | # | 637 | # |
| 516 | # - is the same | 638 | # - is the same |
| 517 | # | 639 | # |
| 518 | # * is the same only adding: | ||
| 519 | # type: | ||
| 520 | # (foo *) | ||
| 521 | # (foo **) | ||
| 522 | # | ||
| 523 | } elsif ($op eq '&' or $op eq '-') { | 640 | } elsif ($op eq '&' or $op eq '-') { |
| 524 | if ($ctx !~ /VxV|[EWB]x[WE]|[EWB]x[VO]/) { | 641 | if ($ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]/) { |
| 525 | print "need space before that '$op' $at\n"; | 642 | print "need space before that '$op' $at\n"; |
| 526 | print "$hereptr"; | 643 | print "$hereptr"; |
| 527 | $clean = 0; | 644 | $clean = 0; |
| 528 | } | 645 | } |
| 529 | 646 | ||
| 647 | # * is the same as & only adding: | ||
| 648 | # type: | ||
| 649 | # (foo *) | ||
| 650 | # (foo **) | ||
| 651 | # | ||
| 530 | } elsif ($op eq '*') { | 652 | } elsif ($op eq '*') { |
| 531 | if ($ctx !~ /VxV|[EWB]x[WE]|[EWB]x[VO]|[EWO]x[OBV]/) { | 653 | if ($ca eq '*') { |
| 654 | if ($cc =~ /\s/) { | ||
| 655 | print "no space after that '$op' $at\n"; | ||
| 656 | print "$hereptr"; | ||
| 657 | $clean = 0; | ||
| 658 | } | ||
| 659 | } elsif ($ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]|OxV|WxB/) { | ||
| 532 | print "need space before that '$op' $at\n"; | 660 | print "need space before that '$op' $at\n"; |
| 533 | print "$hereptr"; | 661 | print "$hereptr"; |
| 534 | $clean = 0; | 662 | $clean = 0; |
| @@ -578,6 +706,7 @@ sub process { | |||
| 578 | 706 | ||
| 579 | # Check for illegal assignment in if conditional. | 707 | # Check for illegal assignment in if conditional. |
| 580 | if ($line=~/\b(if|while)\s*\(.*[^<>!=]=[^=].*\)/) { | 708 | if ($line=~/\b(if|while)\s*\(.*[^<>!=]=[^=].*\)/) { |
| 709 | #next if ($line=~/\".*\Q$op\E.*\"/ or $line=~/\'\Q$op\E\'/); | ||
| 581 | print "do not use assignment in condition\n"; | 710 | print "do not use assignment in condition\n"; |
| 582 | print "$herecurr"; | 711 | print "$herecurr"; |
| 583 | $clean = 0; | 712 | $clean = 0; |
| @@ -592,30 +721,6 @@ sub process { | |||
| 592 | $clean = 0; | 721 | $clean = 0; |
| 593 | } | 722 | } |
| 594 | 723 | ||
| 595 | # Check for switch () and associated case and default | ||
| 596 | # statements should be at the same indent. | ||
| 597 | if ($line=~/\bswitch\s*\(.*\)/) { | ||
| 598 | my $err = ''; | ||
| 599 | my $sep = ''; | ||
| 600 | my @ctx = ctx_block_outer($linenr, $realcnt); | ||
| 601 | shift(@ctx); | ||
| 602 | for my $ctx (@ctx) { | ||
| 603 | my ($clen, $cindent) = line_stats($ctx); | ||
| 604 | if ($ctx =~ /\s*(case\s+|default:)/ && | ||
| 605 | $indent != $cindent) { | ||
| 606 | $err .= "$sep$ctx\n"; | ||
| 607 | $sep = ''; | ||
| 608 | } else { | ||
| 609 | $sep = "[...]\n"; | ||
| 610 | } | ||
| 611 | } | ||
| 612 | if ($err ne '') { | ||
| 613 | print "switch and case should be at the same indent\n"; | ||
| 614 | print "$here\n$line\n$err\n"; | ||
| 615 | $clean = 0; | ||
| 616 | } | ||
| 617 | } | ||
| 618 | |||
| 619 | #studly caps, commented out until figure out how to distinguish between use of existing and adding new | 724 | #studly caps, commented out until figure out how to distinguish between use of existing and adding new |
| 620 | # if (($line=~/[\w_][a-z\d]+[A-Z]/) and !($line=~/print/)) { | 725 | # if (($line=~/[\w_][a-z\d]+[A-Z]/) and !($line=~/print/)) { |
| 621 | # print "No studly caps, use _\n"; | 726 | # print "No studly caps, use _\n"; |
| @@ -645,12 +750,12 @@ sub process { | |||
| 645 | my @opened = $prevline=~/\(/g; | 750 | my @opened = $prevline=~/\(/g; |
| 646 | my @closed = $prevline=~/\)/g; | 751 | my @closed = $prevline=~/\)/g; |
| 647 | my $nr_line = $linenr; | 752 | my $nr_line = $linenr; |
| 648 | my $remaining = $realcnt; | 753 | my $remaining = $realcnt - 1; |
| 649 | my $next_line = $line; | 754 | my $next_line = $line; |
| 650 | my $extra_lines = 0; | 755 | my $extra_lines = 0; |
| 651 | my $display_segment = $prevline; | 756 | my $display_segment = $prevline; |
| 652 | 757 | ||
| 653 | while ($remaining > 1 && scalar @opened > scalar @closed) { | 758 | while ($remaining > 0 && scalar @opened > scalar @closed) { |
| 654 | $prevline .= $next_line; | 759 | $prevline .= $next_line; |
| 655 | $display_segment .= "\n" . $next_line; | 760 | $display_segment .= "\n" . $next_line; |
| 656 | $next_line = $lines[$nr_line]; | 761 | $next_line = $lines[$nr_line]; |
| @@ -689,7 +794,7 @@ sub process { | |||
| 689 | 794 | ||
| 690 | # don't use deprecated functions | 795 | # don't use deprecated functions |
| 691 | for my $func (@dep_functions) { | 796 | for my $func (@dep_functions) { |
| 692 | if (has_non_quoted($line, '\b' . $func . '\b')) { | 797 | if ($line =~ /\b$func\b/) { |
| 693 | print "Don't use $func(): see Documentation/feature-removal-schedule.txt\n"; | 798 | print "Don't use $func(): see Documentation/feature-removal-schedule.txt\n"; |
| 694 | print "$herecurr"; | 799 | print "$herecurr"; |
| 695 | $clean = 0; | 800 | $clean = 0; |
| @@ -697,19 +802,26 @@ sub process { | |||
| 697 | } | 802 | } |
| 698 | 803 | ||
| 699 | # no volatiles please | 804 | # no volatiles please |
| 700 | if (has_non_quoted($line, '\bvolatile\b')) { | 805 | if ($line =~ /\bvolatile\b/ && $line !~ /\basm\s+volatile\b/) { |
| 701 | print "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n"; | 806 | print "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n"; |
| 702 | print "$herecurr"; | 807 | print "$herecurr"; |
| 703 | $clean = 0; | 808 | $clean = 0; |
| 704 | } | 809 | } |
| 705 | 810 | ||
| 706 | # warn about #ifdefs in C files | 811 | # warn about #if 0 |
| 707 | if ($line =~ /^.#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { | 812 | if ($line =~ /^.#\s*if\s+0\b/) { |
| 708 | print "#ifdef in C files should be avoided\n"; | 813 | print "#if 0 -- if this code redundant remove it\n"; |
| 709 | print "$herecurr"; | 814 | print "$herecurr"; |
| 710 | $clean = 0; | 815 | $clean = 0; |
| 711 | } | 816 | } |
| 712 | 817 | ||
| 818 | # warn about #ifdefs in C files | ||
| 819 | # if ($line =~ /^.#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { | ||
| 820 | # print "#ifdef in C files should be avoided\n"; | ||
| 821 | # print "$herecurr"; | ||
| 822 | # $clean = 0; | ||
| 823 | # } | ||
| 824 | |||
| 713 | # check for spinlock_t definitions without a comment. | 825 | # check for spinlock_t definitions without a comment. |
| 714 | if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/) { | 826 | if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/) { |
| 715 | my $which = $1; | 827 | my $which = $1; |
