aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/checkpatch.pl
diff options
context:
space:
mode:
authorAndy Whitcroft <apw@shadowen.org>2007-07-16 02:37:22 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-07-16 12:05:34 -0400
commitde7d4f0e1172a72277d660fa0be59654ea02bed0 (patch)
tree6774ab290e4bb257a6207005f7072788895cce05 /scripts/checkpatch.pl
parentf2a11b158a24301e9158e9c873fa88e5eb775486 (diff)
update checkpatch.pl to version 0.07
This version brings a number of new checks, fixes for flase positives, plus a clarification of the output to better guide use. Of note: - checks for documentation for new __setup calls - clearer reporting where braces and parenthesis are involved - reports for closing brace and semi-colon spacing - reports on unwanted externs This patch includes an update to the documentation on checkpatch.pl itself to clarify when it should be used and to indicate that it is not intended as the final arbitor of style. Full changelog: Andy Whitcroft (19): Version: 0.07 ensure we do not apply control brace checks to preprocesor directives add {u,s}{8,16,32,64} to the type matcher accept lack of spacing after the semicolons in for (;;) report new externs in .c files fix up typedef exclusion for function prototypes else trailing statements check need to account for \ at end of line add enums to the type matcher add missing check descriptions suppress double reporting of ** spacing report on do{ spacing issues include an example of the brace/parenthesis in output check for spacing after closing braces prevent double reports on pointer spacing issues handle blank continuation lines on macros classify all reports error, warning, or check revamp hanging { checks and apply in context no spaces after the last ; in a for is ok check __setup has a corresponding addition to documentation David Woodhouse (1): limit character set used in patches and descriptions to UTF-8 Signed-off-by: Andy Whitcroft <apw@shadowen.org> Cc: David Woodhouse <dwmw2@infradead.org> Cc: "Randy.Dunlap" <rdunlap@xenotime.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'scripts/checkpatch.pl')
-rwxr-xr-xscripts/checkpatch.pl374
1 files changed, 178 insertions, 196 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 277c32647f36..25e20a27fc59 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -9,7 +9,7 @@ use strict;
9my $P = $0; 9my $P = $0;
10$P =~ s@.*/@@g; 10$P =~ s@.*/@@g;
11 11
12my $V = '0.06'; 12my $V = '0.07';
13 13
14use Getopt::Long qw(:config no_auto_abbrev); 14use Getopt::Long qw(:config no_auto_abbrev);
15 15
@@ -246,6 +246,19 @@ sub cat_vet {
246 return $vet; 246 return $vet;
247} 247}
248 248
249sub ERROR {
250 print "ERROR: $_[0]\n";
251 our $clean = 0;
252}
253sub WARN {
254 print "WARNING: $_[0]\n";
255 our $clean = 0;
256}
257sub CHK {
258 print "CHECK: $_[0]\n";
259 our $clean = 0;
260}
261
249sub process { 262sub process {
250 my $filename = shift; 263 my $filename = shift;
251 my @lines = @_; 264 my @lines = @_;
@@ -259,7 +272,7 @@ sub process {
259 my $previndent=0; 272 my $previndent=0;
260 my $stashindent=0; 273 my $stashindent=0;
261 274
262 my $clean = 1; 275 our $clean = 1;
263 my $signoff = 0; 276 my $signoff = 0;
264 my $is_patch = 0; 277 my $is_patch = 0;
265 278
@@ -290,8 +303,11 @@ sub process {
290 long\s+int| 303 long\s+int|
291 long\s+long| 304 long\s+long|
292 long\s+long\s+int| 305 long\s+long\s+int|
306 u8|u16|u32|u64|
307 s8|s16|s32|s64|
293 struct\s+$Ident| 308 struct\s+$Ident|
294 union\s+$Ident| 309 union\s+$Ident|
310 enum\s+$Ident|
295 ${Ident}_t 311 ${Ident}_t
296 ) 312 )
297 (?:\s+$Sparse)* 313 (?:\s+$Sparse)*
@@ -304,6 +320,23 @@ sub process {
304 my $Declare = qr{(?:$Storage\s+)?$Type}; 320 my $Declare = qr{(?:$Storage\s+)?$Type};
305 my $Attribute = qr{__read_mostly|__init|__initdata}; 321 my $Attribute = qr{__read_mostly|__init|__initdata};
306 322
323 # Pre-scan the patch looking for any __setup documentation.
324 my @setup_docs = ();
325 my $setup_docs = 0;
326 foreach my $line (@lines) {
327 if ($line=~/^\+\+\+\s+(\S+)/) {
328 $setup_docs = 0;
329 if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
330 $setup_docs = 1;
331 }
332 next;
333 }
334
335 if ($setup_docs && $line =~ /^\+/) {
336 push(@setup_docs, $line);
337 }
338 }
339
307 foreach my $line (@lines) { 340 foreach my $line (@lines) {
308 $linenr++; 341 $linenr++;
309 342
@@ -369,30 +402,42 @@ sub process {
369 $here .= "FILE: $realfile:$realline:" if ($realcnt != 0); 402 $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
370 403
371 my $hereline = "$here\n$line\n"; 404 my $hereline = "$here\n$line\n";
372 my $herecurr = "$here\n$line\n\n"; 405 my $herecurr = "$here\n$line\n";
373 my $hereprev = "$here\n$prevline\n$line\n\n"; 406 my $hereprev = "$here\n$prevline\n$line\n";
374 407
375#check the patch for a signoff: 408#check the patch for a signoff:
376 if ($line =~ /^\s*signed-off-by:/i) { 409 if ($line =~ /^\s*signed-off-by:/i) {
377 # This is a signoff, if ugly, so do not double report. 410 # This is a signoff, if ugly, so do not double report.
378 $signoff++; 411 $signoff++;
379 if (!($line =~ /^\s*Signed-off-by:/)) { 412 if (!($line =~ /^\s*Signed-off-by:/)) {
380 print "Signed-off-by: is the preferred form\n"; 413 WARN("Signed-off-by: is the preferred form\n" .
381 print "$herecurr"; 414 $herecurr);
382 $clean = 0;
383 } 415 }
384 if ($line =~ /^\s*signed-off-by:\S/i) { 416 if ($line =~ /^\s*signed-off-by:\S/i) {
385 print "need space after Signed-off-by:\n"; 417 WARN("need space after Signed-off-by:\n" .
386 print "$herecurr"; 418 $herecurr);
387 $clean = 0;
388 } 419 }
389 } 420 }
390 421
391# Check for wrappage within a valid hunk of the file 422# Check for wrappage within a valid hunk of the file
392 if ($realcnt != 0 && $line !~ m{^(?:\+|-| |$)}) { 423 if ($realcnt != 0 && $line !~ m{^(?:\+|-| |$)}) {
393 print "patch seems to be corrupt (line wrapped?) [$realcnt]\n"; 424 ERROR("patch seems to be corrupt (line wrapped?)\n" .
394 print "$herecurr"; 425 $herecurr);
395 $clean = 0; 426 }
427
428# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
429 if (($realfile =~ /^$/ || $line =~ /^\+/) &&
430 !($line =~ m/^(
431 [\x09\x0A\x0D\x20-\x7E] # ASCII
432 | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
433 | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
434 | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
435 | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
436 | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
437 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
438 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
439 )*$/x )) {
440 ERROR("Invalid UTF-8\n" . $herecurr);
396 } 441 }
397 442
398#ignore lines being removed 443#ignore lines being removed
@@ -403,16 +448,12 @@ sub process {
403 448
404#trailing whitespace 449#trailing whitespace
405 if ($line =~ /^\+.*\S\s+$/ || $line =~ /^\+\s+$/) { 450 if ($line =~ /^\+.*\S\s+$/ || $line =~ /^\+\s+$/) {
406 my $herevet = "$here\n" . cat_vet($line) . "\n\n"; 451 my $herevet = "$here\n" . cat_vet($line) . "\n";
407 print "trailing whitespace\n"; 452 ERROR("trailing whitespace\n" . $herevet);
408 print "$herevet";
409 $clean = 0;
410 } 453 }
411#80 column limit 454#80 column limit
412 if ($line =~ /^\+/ && !($prevline=~/\/\*\*/) && $length > 80) { 455 if ($line =~ /^\+/ && !($prevline=~/\/\*\*/) && $length > 80) {
413 print "line over 80 characters\n"; 456 WARN("line over 80 characters\n" . $herecurr);
414 print "$herecurr";
415 $clean = 0;
416 } 457 }
417 458
418# check we are in a valid source file *.[hc] if not then ignore this hunk 459# check we are in a valid source file *.[hc] if not then ignore this hunk
@@ -421,10 +462,8 @@ sub process {
421# at the beginning of a line any tabs must come first and anything 462# at the beginning of a line any tabs must come first and anything
422# more than 8 must use tabs. 463# more than 8 must use tabs.
423 if ($line=~/^\+\s* \t\s*\S/ or $line=~/^\+\s* \s*/) { 464 if ($line=~/^\+\s* \t\s*\S/ or $line=~/^\+\s* \s*/) {
424 my $herevet = "$here\n" . cat_vet($line) . "\n\n"; 465 my $herevet = "$here\n" . cat_vet($line) . "\n";
425 print "use tabs not spaces\n"; 466 ERROR("use tabs not spaces\n" . $herevet);
426 print "$herevet";
427 $clean = 0;
428 } 467 }
429 468
430 # 469 #
@@ -463,9 +502,27 @@ sub process {
463 } 502 }
464 } 503 }
465 if ($err ne '') { 504 if ($err ne '') {
466 print "switch and case should be at the same indent\n"; 505 ERROR("switch and case should be at the same indent\n$hereline\n$err\n");
467 print "$here\n$line\n$err\n"; 506 }
468 $clean = 0; 507 }
508
509# if/while/etc brace do not go on next line, unless defining a do while loop,
510# or if that brace on the next line is for something else
511 if ($line =~ /\b(?:(if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.#/) {
512 my @ctx = ctx_statement($linenr, $realcnt);
513 my $ctx_ln = $linenr + $#ctx + 1;
514 my $ctx_cnt = $realcnt - $#ctx - 1;
515 my $ctx = join("\n", @ctx);
516
517 while ($ctx_cnt > 0 && $lines[$ctx_ln - 1] =~ /^-/) {
518 $ctx_ln++;
519 $ctx_cnt--;
520 }
521 ##warn "line<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>";
522
523 if ($ctx !~ /{\s*/ && $ctx_cnt > 0 && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
524 ERROR("That { should be on the previous line\n" .
525 "$here\n$ctx\n$lines[$ctx_ln - 1]");
469 } 526 }
470 } 527 }
471 528
@@ -474,9 +531,7 @@ sub process {
474 531
475# TEST: allow direct testing of the type matcher. 532# TEST: allow direct testing of the type matcher.
476 if ($tst_type && $line =~ /^.$Declare$/) { 533 if ($tst_type && $line =~ /^.$Declare$/) {
477 print "TEST: is type $Declare\n"; 534 ERROR("TEST: is type $Declare\n" . $herecurr);
478 print "$herecurr";
479 $clean = 0;
480 next; 535 next;
481 } 536 }
482 537
@@ -488,9 +543,8 @@ sub process {
488 if ($rawline =~ m{^.#\s*include\s+[<"](.*)[">]}) { 543 if ($rawline =~ m{^.#\s*include\s+[<"](.*)[">]}) {
489 my $path = $1; 544 my $path = $1;
490 if ($path =~ m{//}) { 545 if ($path =~ m{//}) {
491 print "malformed #include filename\n"; 546 ERROR("malformed #include filename\n" .
492 print "$herecurr"; 547 $herecurr);
493 $clean = 0;
494 } 548 }
495 # Sanitise this special form of string. 549 # Sanitise this special form of string.
496 $path = 'X' x length($path); 550 $path = 'X' x length($path);
@@ -499,9 +553,7 @@ sub process {
499 553
500# no C99 // comments 554# no C99 // comments
501 if ($line =~ m{//}) { 555 if ($line =~ m{//}) {
502 print "do not use C99 // comments\n"; 556 ERROR("do not use C99 // comments\n" . $herecurr);
503 print "$herecurr";
504 $clean = 0;
505 } 557 }
506 # Remove C99 comments. 558 # Remove C99 comments.
507 $line =~ s@//.*@@; 559 $line =~ s@//.*@@;
@@ -514,49 +566,40 @@ sub process {
514 ($prevline !~ /^\+}/) && 566 ($prevline !~ /^\+}/) &&
515 ($prevline !~ /^ }/) && 567 ($prevline !~ /^ }/) &&
516 ($prevline !~ /\s$name(?:\s+$Attribute)?\s*(?:;|=)/)) { 568 ($prevline !~ /\s$name(?:\s+$Attribute)?\s*(?:;|=)/)) {
517 print "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n"; 569 WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
518 print "$herecurr";
519 $clean = 0;
520 } 570 }
521 } 571 }
522 572
523# check for static initialisers. 573# check for static initialisers.
524 if ($line=~/\s*static\s.*=\s+(0|NULL);/) { 574 if ($line=~/\s*static\s.*=\s+(0|NULL);/) {
525 print "do not initialise statics to 0 or NULL\n"; 575 ERROR("do not initialise statics to 0 or NULL\n" .
526 print "$herecurr"; 576 $herecurr);
527 $clean = 0;
528 } 577 }
529 578
530# check for new typedefs, only function parameters and sparse annotations 579# check for new typedefs, only function parameters and sparse annotations
531# make sense. 580# make sense.
532 if ($line =~ /\btypedef\s/ && 581 if ($line =~ /\btypedef\s/ &&
533 $line !~ /\btypedef\s+$Type\s+\(\s*$Ident\s*\)\s*\(/ && 582 $line !~ /\btypedef\s+$Type\s+\(\s*\*$Ident\s*\)\s*\(/ &&
534 $line !~ /\b__bitwise(?:__|)\b/) { 583 $line !~ /\b__bitwise(?:__|)\b/) {
535 print "do not add new typedefs\n"; 584 WARN("do not add new typedefs\n" . $herecurr);
536 print "$herecurr";
537 $clean = 0;
538 } 585 }
539 586
540# * goes on variable not on type 587# * goes on variable not on type
541 if ($line =~ m{\($NonptrType(\*+)(?:\s+const)?\)}) { 588 if ($line =~ m{\($NonptrType(\*+)(?:\s+const)?\)}) {
542 print "\"(foo$1)\" should be \"(foo $1)\"\n"; 589 ERROR("\"(foo$1)\" should be \"(foo $1)\"\n" .
543 print "$herecurr"; 590 $herecurr);
544 $clean = 0;
545 591
546 } elsif ($line =~ m{\($NonptrType\s+(\*+)(?!\s+const)\s+\)}) { 592 } elsif ($line =~ m{\($NonptrType\s+(\*+)(?!\s+const)\s+\)}) {
547 print "\"(foo $1 )\" should be \"(foo $1)\"\n"; 593 ERROR("\"(foo $1 )\" should be \"(foo $1)\"\n" .
548 print "$herecurr"; 594 $herecurr);
549 $clean = 0;
550 595
551 } elsif ($line =~ m{$NonptrType(\*+)(?:\s+const)?\s+[A-Za-z\d_]+}) { 596 } elsif ($line =~ m{$NonptrType(\*+)(?:\s+const)?\s+[A-Za-z\d_]+}) {
552 print "\"foo$1 bar\" should be \"foo $1bar\"\n"; 597 ERROR("\"foo$1 bar\" should be \"foo $1bar\"\n" .
553 print "$herecurr"; 598 $herecurr);
554 $clean = 0;
555 599
556 } elsif ($line =~ m{$NonptrType\s+(\*+)(?!\s+const)\s+[A-Za-z\d_]+}) { 600 } elsif ($line =~ m{$NonptrType\s+(\*+)(?!\s+const)\s+[A-Za-z\d_]+}) {
557 print "\"foo $1 bar\" should be \"foo $1bar\"\n"; 601 ERROR("\"foo $1 bar\" should be \"foo $1bar\"\n" .
558 print "$herecurr"; 602 $herecurr);
559 $clean = 0;
560 } 603 }
561 604
562# # no BUG() or BUG_ON() 605# # no BUG() or BUG_ON()
@@ -585,9 +628,7 @@ sub process {
585 } 628 }
586 } 629 }
587 if ($ok == 0) { 630 if ($ok == 0) {
588 print "printk() should include KERN_ facility level\n"; 631 WARN("printk() should include KERN_ facility level\n" . $herecurr);
589 print "$herecurr";
590 $clean = 0;
591 } 632 }
592 } 633 }
593 634
@@ -595,9 +636,7 @@ sub process {
595# or if closed on same line 636# or if closed on same line
596 if (($line=~/$Type\s*[A-Za-z\d_]+\(.*\).* {/) and 637 if (($line=~/$Type\s*[A-Za-z\d_]+\(.*\).* {/) and
597 !($line=~/\#define.*do\s{/) and !($line=~/}/)) { 638 !($line=~/\#define.*do\s{/) and !($line=~/}/)) {
598 print "braces following function declarations go on the next line\n"; 639 ERROR("open brace '{' following function declarations go on the next line\n" . $herecurr);
599 print "$herecurr";
600 $clean = 0;
601 } 640 }
602 641
603# Check operator spacing. 642# Check operator spacing.
@@ -633,27 +672,27 @@ sub process {
633 } 672 }
634 673
635 # Pick up the preceeding and succeeding characters. 674 # Pick up the preceeding and succeeding characters.
636 my $ca = substr($opline, $off - 1, 1); 675 my $ca = substr($opline, 0, $off);
637 my $cc = ''; 676 my $cc = '';
638 if (length($opline) >= ($off + length($elements[$n + 1]))) { 677 if (length($opline) >= ($off + length($elements[$n + 1]))) {
639 $cc = substr($opline, $off + length($elements[$n + 1])); 678 $cc = substr($opline, $off + length($elements[$n + 1]));
640 } 679 }
680 my $cb = "$ca$;$cc";
641 681
642 my $ctx = "${a}x${c}"; 682 my $ctx = "${a}x${c}";
643 683
644 my $at = "(ctx:$ctx)"; 684 my $at = "(ctx:$ctx)";
645 685
646 my $ptr = (" " x $off) . "^"; 686 my $ptr = (" " x $off) . "^";
647 my $hereptr = "$hereline$ptr\n\n"; 687 my $hereptr = "$hereline$ptr\n";
648 688
649 ##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>\n"; 689 ##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>\n";
650 690
651 # ; should have either the end of line or a space or \ after it 691 # ; should have either the end of line or a space or \ after it
652 if ($op eq ';') { 692 if ($op eq ';') {
653 if ($ctx !~ /.x[WE]/ && $cc !~ /^\\/) { 693 if ($ctx !~ /.x[WEB]/ && $cc !~ /^\\/ &&
654 print "need space after that '$op' $at\n"; 694 $cc !~ /^;/) {
655 print "$hereptr"; 695 ERROR("need space after that '$op' $at\n" . $hereptr);
656 $clean = 0;
657 } 696 }
658 697
659 # // is a comment 698 # // is a comment
@@ -662,43 +701,31 @@ sub process {
662 # -> should have no spaces 701 # -> should have no spaces
663 } elsif ($op eq '->') { 702 } elsif ($op eq '->') {
664 if ($ctx =~ /Wx.|.xW/) { 703 if ($ctx =~ /Wx.|.xW/) {
665 print "no spaces around that '$op' $at\n"; 704 ERROR("no spaces around that '$op' $at\n" . $hereptr);
666 print "$hereptr";
667 $clean = 0;
668 } 705 }
669 706
670 # , must have a space on the right. 707 # , must have a space on the right.
671 } elsif ($op eq ',') { 708 } elsif ($op eq ',') {
672 if ($ctx !~ /.xW|.xE/ && $cc !~ /^}/) { 709 if ($ctx !~ /.xW|.xE/ && $cc !~ /^}/) {
673 print "need space after that '$op' $at\n"; 710 ERROR("need space after that '$op' $at\n" . $hereptr);
674 print "$hereptr";
675 $clean = 0;
676 } 711 }
677 712
678 # unary ! and unary ~ are allowed no space on the right 713 # unary ! and unary ~ are allowed no space on the right
679 } elsif ($op eq '!' or $op eq '~') { 714 } elsif ($op eq '!' or $op eq '~') {
680 if ($ctx !~ /[WOEB]x./) { 715 if ($ctx !~ /[WOEB]x./) {
681 print "need space before that '$op' $at\n"; 716 ERROR("need space before that '$op' $at\n" . $hereptr);
682 print "$hereptr";
683 $clean = 0;
684 } 717 }
685 if ($ctx =~ /.xW/) { 718 if ($ctx =~ /.xW/) {
686 print "no space after that '$op' $at\n"; 719 ERROR("no space after that '$op' $at\n" . $hereptr);
687 print "$hereptr";
688 $clean = 0;
689 } 720 }
690 721
691 # unary ++ and unary -- are allowed no space on one side. 722 # unary ++ and unary -- are allowed no space on one side.
692 } elsif ($op eq '++' or $op eq '--') { 723 } elsif ($op eq '++' or $op eq '--') {
693 if ($ctx !~ /[WOB]x[^W]/ && $ctx !~ /[^W]x[WOBE]/) { 724 if ($ctx !~ /[WOB]x[^W]/ && $ctx !~ /[^W]x[WOBE]/) {
694 print "need space one side of that '$op' $at\n"; 725 ERROR("need space one side of that '$op' $at\n" . $hereptr);
695 print "$hereptr";
696 $clean = 0;
697 } 726 }
698 if ($ctx =~ /Wx./ && $cc =~ /^;/) { 727 if ($ctx =~ /Wx./ && $cc =~ /^;/) {
699 print "no space before that '$op' $at\n"; 728 ERROR("no space before that '$op' $at\n" . $hereptr);
700 print "$hereptr";
701 $clean = 0;
702 } 729 }
703 730
704 # & is both unary and binary 731 # & is both unary and binary
@@ -715,9 +742,7 @@ sub process {
715 # 742 #
716 } elsif ($op eq '&' or $op eq '-') { 743 } elsif ($op eq '&' or $op eq '-') {
717 if ($ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]/) { 744 if ($ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]/) {
718 print "need space before that '$op' $at\n"; 745 ERROR("need space before that '$op' $at\n" . $hereptr);
719 print "$hereptr";
720 $clean = 0;
721 } 746 }
722 747
723 # * is the same as & only adding: 748 # * is the same as & only adding:
@@ -726,16 +751,9 @@ sub process {
726 # (foo **) 751 # (foo **)
727 # 752 #
728 } elsif ($op eq '*') { 753 } elsif ($op eq '*') {
729 if ($ca eq '*') { 754 if ($ca !~ /$Type$/ && $cb !~ /(\*$;|$;\*)/ &&
730 if ($cc =~ /^\s(?!\s*const)/) { 755 $ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]|OxV|WxB|BxB/) {
731 print "no space after that '$op' $at\n"; 756 ERROR("need space before that '$op' $at\n" . $hereptr);
732 print "$hereptr";
733 $clean = 0;
734 }
735 } elsif ($ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]|OxV|WxB|BxB/) {
736 print "need space before that '$op' $at\n";
737 print "$hereptr";
738 $clean = 0;
739 } 757 }
740 758
741 # << and >> may either have or not have spaces both sides 759 # << and >> may either have or not have spaces both sides
@@ -743,58 +761,51 @@ sub process {
743 $op eq '^' or $op eq '|') 761 $op eq '^' or $op eq '|')
744 { 762 {
745 if ($ctx !~ /VxV|WxW|VxE|WxE/) { 763 if ($ctx !~ /VxV|WxW|VxE|WxE/) {
746 print "need consistent spacing around '$op' $at\n"; 764 ERROR("need consistent spacing around '$op' $at\n" .
747 print "$hereptr"; 765 $hereptr);
748 $clean = 0;
749 } 766 }
750 767
751 # All the others need spaces both sides. 768 # All the others need spaces both sides.
752 } elsif ($ctx !~ /[EW]x[WE]/) { 769 } elsif ($ctx !~ /[EW]x[WE]/) {
753 print "need spaces around that '$op' $at\n"; 770 ERROR("need spaces around that '$op' $at\n" . $hereptr);
754 print "$hereptr";
755 $clean = 0;
756 } 771 }
757 $off += length($elements[$n + 1]); 772 $off += length($elements[$n + 1]);
758 } 773 }
759 } 774 }
760 775
761#need space before brace following if, while, etc 776#need space before brace following if, while, etc
762 if ($line=~/\(.*\){/) { 777 if ($line =~ /\(.*\){/ || $line =~ /do{/) {
763 print "need a space before the brace\n"; 778 ERROR("need a space before the open brace '{'\n" . $herecurr);
764 print "$herecurr"; 779 }
765 $clean = 0; 780
781# closing brace should have a space following it when it has anything
782# on the line
783 if ($line =~ /}(?!(?:,|;|\)))\S/) {
784 ERROR("need a space after that close brace '}'\n" . $herecurr);
766 } 785 }
767 786
768#goto labels aren't indented, allow a single space however 787#goto labels aren't indented, allow a single space however
769 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and 788 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
770 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) { 789 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
771 print "labels should not be indented\n"; 790 WARN("labels should not be indented\n" . $herecurr);
772 print "$herecurr";
773 $clean = 0;
774 } 791 }
775 792
776# Need a space before open parenthesis after if, while etc 793# Need a space before open parenthesis after if, while etc
777 if ($line=~/\b(if|while|for|switch)\(/) { 794 if ($line=~/\b(if|while|for|switch)\(/) {
778 print "need a space before the open parenthesis\n"; 795 ERROR("need a space before the open parenthesis '('\n" . $herecurr);
779 print "$herecurr";
780 $clean = 0;
781 } 796 }
782 797
783# Check for illegal assignment in if conditional. 798# Check for illegal assignment in if conditional.
784 if ($line=~/\bif\s*\(.*[^<>!=]=[^=].*\)/) { 799 if ($line=~/\bif\s*\(.*[^<>!=]=[^=].*\)/) {
785 #next if ($line=~/\".*\Q$op\E.*\"/ or $line=~/\'\Q$op\E\'/); 800 #next if ($line=~/\".*\Q$op\E.*\"/ or $line=~/\'\Q$op\E\'/);
786 print "do not use assignment in if condition\n"; 801 ERROR("do not use assignment in if condition\n" . $herecurr);
787 print "$herecurr";
788 $clean = 0;
789 } 802 }
790 803
791 # Check for }<nl>else {, these must be at the same 804 # Check for }<nl>else {, these must be at the same
792 # indent level to be relevant to each other. 805 # indent level to be relevant to each other.
793 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and 806 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
794 $previndent == $indent) { 807 $previndent == $indent) {
795 print "else should follow close brace\n"; 808 ERROR("else should follow close brace '}'\n" . $hereprev);
796 print "$hereprev";
797 $clean = 0;
798 } 809 }
799 810
800#studly caps, commented out until figure out how to distinguish between use of existing and adding new 811#studly caps, commented out until figure out how to distinguish between use of existing and adding new
@@ -806,57 +817,22 @@ sub process {
806 817
807#no spaces allowed after \ in define 818#no spaces allowed after \ in define
808 if ($line=~/\#define.*\\\s$/) { 819 if ($line=~/\#define.*\\\s$/) {
809 print("Whitepspace after \\ makes next lines useless\n"); 820 WARN("Whitepspace after \\ makes next lines useless\n" . $herecurr);
810 print "$herecurr";
811 $clean = 0;
812 } 821 }
813 822
814#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line) 823#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
815 if ($tree && $rawline =~ m{^.\#\s*include\s*\<asm\/(.*)\.h\>}) { 824 if ($tree && $rawline =~ m{^.\#\s*include\s*\<asm\/(.*)\.h\>}) {
816 my $checkfile = "include/linux/$1.h"; 825 my $checkfile = "include/linux/$1.h";
817 if (-f $checkfile) { 826 if (-f $checkfile) {
818 print "Use #include <linux/$1.h> instead of <asm/$1.h>\n"; 827 CHK("Use #include <linux/$1.h> instead of <asm/$1.h>\n" .
819 print $herecurr; 828 $herecurr);
820 $clean = 0;
821 }
822 }
823
824# if/while/etc brace do not go on next line, unless defining a do while loop,
825# or if that brace on the next line is for something else
826 if ($prevline=~/\b(?:(if|while|for|switch)\s*\(|do\b|else\b)/) {
827 my @opened = $prevline=~/\(/g;
828 my @closed = $prevline=~/\)/g;
829 my $nr_line = $linenr;
830 my $remaining = $realcnt - 1;
831 my $next_line = $line;
832 my $extra_lines = 0;
833 my $display_segment = $prevline;
834
835 while ($remaining > 0 && scalar @opened > scalar @closed) {
836 $prevline .= $next_line;
837 $display_segment .= "\n" . $next_line;
838 $next_line = $lines[$nr_line];
839 $nr_line++;
840 $remaining--;
841
842 @opened = $prevline=~/\(/g;
843 @closed = $prevline=~/\)/g;
844 }
845
846 if (($prevline=~/\b(?:(if|while|for|switch)\s*\(.*\)|do|else)\s*$/) and ($next_line=~/{/) and
847 !($next_line=~/\b(?:if|while|for|switch|do|else)\b/) and !($next_line=~/\#define.*do.*while/)) {
848 print "That { should be on the previous line\n";
849 print "$here\n$display_segment\n$next_line\n\n";
850 $clean = 0;
851 } 829 }
852 } 830 }
853 831
854# if and else should not have general statements after it 832# if and else should not have general statements after it
855 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/ && 833 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/ &&
856 $1 !~ /^\s*(?:\sif|{|$)/) { 834 $1 !~ /^\s*(?:\sif|{|\\|$)/) {
857 print "trailing statements should be on next line\n"; 835 ERROR("trailing statements should be on next line\n" . $herecurr);
858 print "$herecurr";
859 $clean = 0;
860 } 836 }
861 837
862# multi-statement macros should be enclosed in a do while loop, grab the 838# multi-statement macros should be enclosed in a do while loop, grab the
@@ -877,49 +853,49 @@ sub process {
877 $ln--; 853 $ln--;
878 $cnt++; 854 $cnt++;
879 } 855 }
880 my $ctx = join('', ctx_statement($ln, $cnt)); 856 my @ctx = ctx_statement($ln, $cnt);
857 my $ctx_ln = $ln + $#ctx + 1;
858 my $ctx = join("\n", @ctx);
859
860 # Pull in any empty extension lines.
861 while ($ctx =~ /\\$/ &&
862 $lines[$ctx_ln - 1] =~ /^.\s*(?:\\)?$/) {
863 $ctx .= $lines[$ctx_ln - 1];
864 $ctx_ln++;
865 }
881 866
882 if ($ctx =~ /\\$/) { 867 if ($ctx =~ /\\$/) {
883 if ($ctx =~ /;/) { 868 if ($ctx =~ /;/) {
884 print "Macros with multiple statements should be enclosed in a do - while loop\n"; 869 ERROR("Macros with multiple statements should be enclosed in a do - while loop\n" . "$here\n$ctx\n");
885 } else { 870 } else {
886 print "Macros with complex values should be enclosed in parenthesis\n"; 871 ERROR("Macros with complex values should be enclosed in parenthesis\n" . "$here\n$ctx\n");
887 } 872 }
888 print "$hereprev";
889 $clean = 0;
890 } 873 }
891 } 874 }
892 875
893# don't include deprecated include files (uses RAW line) 876# don't include deprecated include files (uses RAW line)
894 for my $inc (@dep_includes) { 877 for my $inc (@dep_includes) {
895 if ($rawline =~ m@\#\s*include\s*\<$inc>@) { 878 if ($rawline =~ m@\#\s*include\s*\<$inc>@) {
896 print "Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n"; 879 ERROR("Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n" . $herecurr);
897 print "$herecurr";
898 $clean = 0;
899 } 880 }
900 } 881 }
901 882
902# don't use deprecated functions 883# don't use deprecated functions
903 for my $func (@dep_functions) { 884 for my $func (@dep_functions) {
904 if ($line =~ /\b$func\b/) { 885 if ($line =~ /\b$func\b/) {
905 print "Don't use $func(): see Documentation/feature-removal-schedule.txt\n"; 886 ERROR("Don't use $func(): see Documentation/feature-removal-schedule.txt\n" . $herecurr);
906 print "$herecurr";
907 $clean = 0;
908 } 887 }
909 } 888 }
910 889
911# no volatiles please 890# no volatiles please
912 if ($line =~ /\bvolatile\b/ && $line !~ /\basm\s+volatile\b/) { 891 if ($line =~ /\bvolatile\b/ && $line !~ /\basm\s+volatile\b/) {
913 print "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n"; 892 WARN("Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
914 print "$herecurr";
915 $clean = 0;
916 } 893 }
917 894
918# warn about #if 0 895# warn about #if 0
919 if ($line =~ /^.#\s*if\s+0\b/) { 896 if ($line =~ /^.#\s*if\s+0\b/) {
920 print "#if 0 -- if this code redundant remove it\n"; 897 CHK("if this code is redundant consider removing it\n" .
921 print "$herecurr"; 898 $herecurr);
922 $clean = 0;
923 } 899 }
924 900
925# warn about #ifdefs in C files 901# warn about #ifdefs in C files
@@ -933,41 +909,47 @@ sub process {
933 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/) { 909 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/) {
934 my $which = $1; 910 my $which = $1;
935 if (!ctx_has_comment($first_line, $linenr)) { 911 if (!ctx_has_comment($first_line, $linenr)) {
936 print "$1 definition without comment\n"; 912 CHK("$1 definition without comment\n" . $herecurr);
937 print "$herecurr";
938 $clean = 0;
939 } 913 }
940 } 914 }
941# check for memory barriers without a comment. 915# check for memory barriers without a comment.
942 if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) { 916 if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
943 if (!ctx_has_comment($first_line, $linenr)) { 917 if (!ctx_has_comment($first_line, $linenr)) {
944 print "memory barrier without comment\n"; 918 CHK("memory barrier without comment\n" . $herecurr);
945 print "$herecurr";
946 $clean = 0;
947 } 919 }
948 } 920 }
949# check of hardware specific defines 921# check of hardware specific defines
950 if ($line =~ m@^.#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@) { 922 if ($line =~ m@^.#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@) {
951 print "architecture specific defines should be avoided\n"; 923 CHK("architecture specific defines should be avoided\n" . $herecurr);
952 print "$herecurr";
953 $clean = 0;
954 } 924 }
955 925
926# check the location of the inline attribute, that it is between
927# storage class and type.
956 if ($line =~ /$Type\s+(?:inline|__always_inline)\b/ || 928 if ($line =~ /$Type\s+(?:inline|__always_inline)\b/ ||
957 $line =~ /\b(?:inline|always_inline)\s+$Storage/) { 929 $line =~ /\b(?:inline|always_inline)\s+$Storage/) {
958 print "inline keyword should sit between storage class and type\n"; 930 ERROR("inline keyword should sit between storage class and type\n" . $herecurr);
959 print "$herecurr"; 931 }
960 $clean = 0; 932
933# check for new externs in .c files.
934 if ($line =~ /^.\s*extern\s/ && ($realfile =~ /\.c$/)) {
935 WARN("externs should be avoided in .c files\n" . $herecurr);
936 }
937
938# checks for new __setup's
939 if ($rawline =~ /\b__setup\("([^"]*)"/) {
940 my $name = $1;
941
942 if (!grep(/$name/, @setup_docs)) {
943 CHK("__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
944 }
961 } 945 }
962 } 946 }
963 947
964 if ($chk_patch && !$is_patch) { 948 if ($chk_patch && !$is_patch) {
965 $clean = 0; 949 ERROR("Does not appear to be a unified-diff format patch\n");
966 print "Does not appear to be a unified-diff format patch\n";
967 } 950 }
968 if ($is_patch && $chk_signoff && $signoff == 0) { 951 if ($is_patch && $chk_signoff && $signoff == 0) {
969 $clean = 0; 952 ERROR("Missing Signed-off-by: line(s)\n");
970 print "Missing Signed-off-by: line(s)\n";
971 } 953 }
972 954
973 if ($clean == 1 && $quiet == 0) { 955 if ($clean == 1 && $quiet == 0) {