diff options
author | Andy Whitcroft <apw@shadowen.org> | 2008-03-04 17:28:20 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-03-04 19:35:09 -0500 |
commit | cf655043d4ba6fb3e352d6295a6ad5c2361755c4 (patch) | |
tree | 98fe680d245e4c13cbc14fcbf08e0471d9de6b7b | |
parent | b6abdb0e6ca5c2c0a7caa4131da2af0750927e72 (diff) |
update checkpatch.pl to version 0.15
This version brings a number of minor fixes updating the type detector and
the unary tracker. It also brings a few small fixes for false positives.
It also reverts the --file warning. Of note:
- limit CVS checks to added lines
- improved type detections
- fixes to the unary tracker
Andy Whitcroft (13):
Version: 0.15
EXPORT_SYMBOL checks need to accept array variables
export checks must match DECLARE_foo and LIST_HEAD
possible types: cleanup debugging missing line
values: track values through preprocessor conditional paths
typeof is actually a type
possible types: detect definitions which cross lines
values: include line numbers on value debug information
values: ensure we find correctly record pending brackets
values: simplify the brace history stack
CVS keyword checks should only apply to added lines
loosen spacing for comments
allow braces for single statement blocks with multiline conditionals
Harvey Harrison (1):
checkpatch: remove fastcall
Ingo Molnar (1):
checkpatch.pl: revert wrong --file message
Uwe Kleine-Koenig (1):
fix typo "goot" -> "good"
Signed-off-by: Andy Whitcroft <apw@shadowen.org>
Cc: Randy Dunlap <rdunlap@xenotime.net>
Cc: Joel Schopp <jschopp@austin.ibm.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rwxr-xr-x | scripts/checkpatch.pl | 323 |
1 files changed, 206 insertions, 117 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 2086a856400a..2a7cef9726e4 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
@@ -9,7 +9,7 @@ use strict; | |||
9 | my $P = $0; | 9 | my $P = $0; |
10 | $P =~ s@.*/@@g; | 10 | $P =~ s@.*/@@g; |
11 | 11 | ||
12 | my $V = '0.14'; | 12 | my $V = '0.15'; |
13 | 13 | ||
14 | use Getopt::Long qw(:config no_auto_abbrev); | 14 | use Getopt::Long qw(:config no_auto_abbrev); |
15 | 15 | ||
@@ -105,8 +105,7 @@ our $Sparse = qr{ | |||
105 | __iomem| | 105 | __iomem| |
106 | __must_check| | 106 | __must_check| |
107 | __init_refok| | 107 | __init_refok| |
108 | __kprobes| | 108 | __kprobes |
109 | fastcall | ||
110 | }x; | 109 | }x; |
111 | our $Attribute = qr{ | 110 | our $Attribute = qr{ |
112 | const| | 111 | const| |
@@ -158,7 +157,10 @@ sub build_types { | |||
158 | \b | 157 | \b |
159 | (?:const\s+)? | 158 | (?:const\s+)? |
160 | (?:unsigned\s+)? | 159 | (?:unsigned\s+)? |
161 | $all | 160 | (?: |
161 | $all| | ||
162 | (?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\) | ||
163 | ) | ||
162 | (?:\s+$Sparse|\s+const)* | 164 | (?:\s+$Sparse|\s+const)* |
163 | \b | 165 | \b |
164 | }x; | 166 | }x; |
@@ -362,6 +364,7 @@ sub ctx_statement_block { | |||
362 | 364 | ||
363 | my $type = ''; | 365 | my $type = ''; |
364 | my $level = 0; | 366 | my $level = 0; |
367 | my $p; | ||
365 | my $c; | 368 | my $c; |
366 | my $len = 0; | 369 | my $len = 0; |
367 | 370 | ||
@@ -386,6 +389,7 @@ sub ctx_statement_block { | |||
386 | last; | 389 | last; |
387 | } | 390 | } |
388 | } | 391 | } |
392 | $p = $c; | ||
389 | $c = substr($blk, $off, 1); | 393 | $c = substr($blk, $off, 1); |
390 | $remainder = substr($blk, $off); | 394 | $remainder = substr($blk, $off); |
391 | 395 | ||
@@ -397,8 +401,9 @@ sub ctx_statement_block { | |||
397 | } | 401 | } |
398 | 402 | ||
399 | # An else is really a conditional as long as its not else if | 403 | # An else is really a conditional as long as its not else if |
400 | if ($level == 0 && $remainder =~ /(\s+else)(?:\s|{)/ && | 404 | if ($level == 0 && (!defined($p) || $p =~ /(?:\s|\})/) && |
401 | $remainder !~ /\s+else\s+if\b/) { | 405 | $remainder =~ /(else)(?:\s|{)/ && |
406 | $remainder !~ /else\s+if\b/) { | ||
402 | $coff = $off + length($1); | 407 | $coff = $off + length($1); |
403 | } | 408 | } |
404 | 409 | ||
@@ -445,21 +450,73 @@ sub ctx_statement_block { | |||
445 | $line, $remain + 1, $off - $loff + 1, $level); | 450 | $line, $remain + 1, $off - $loff + 1, $level); |
446 | } | 451 | } |
447 | 452 | ||
453 | sub statement_lines { | ||
454 | my ($stmt) = @_; | ||
455 | |||
456 | # Strip the diff line prefixes and rip blank lines at start and end. | ||
457 | $stmt =~ s/(^|\n)./$1/g; | ||
458 | $stmt =~ s/^\s*//; | ||
459 | $stmt =~ s/\s*$//; | ||
460 | |||
461 | my @stmt_lines = ($stmt =~ /\n/g); | ||
462 | |||
463 | return $#stmt_lines + 2; | ||
464 | } | ||
465 | |||
466 | sub statement_rawlines { | ||
467 | my ($stmt) = @_; | ||
468 | |||
469 | my @stmt_lines = ($stmt =~ /\n/g); | ||
470 | |||
471 | return $#stmt_lines + 2; | ||
472 | } | ||
473 | |||
474 | sub statement_block_size { | ||
475 | my ($stmt) = @_; | ||
476 | |||
477 | $stmt =~ s/(^|\n)./$1/g; | ||
478 | $stmt =~ s/^\s*{//; | ||
479 | $stmt =~ s/}\s*$//; | ||
480 | $stmt =~ s/^\s*//; | ||
481 | $stmt =~ s/\s*$//; | ||
482 | |||
483 | my @stmt_lines = ($stmt =~ /\n/g); | ||
484 | my @stmt_statements = ($stmt =~ /;/g); | ||
485 | |||
486 | my $stmt_lines = $#stmt_lines + 2; | ||
487 | my $stmt_statements = $#stmt_statements + 1; | ||
488 | |||
489 | if ($stmt_lines > $stmt_statements) { | ||
490 | return $stmt_lines; | ||
491 | } else { | ||
492 | return $stmt_statements; | ||
493 | } | ||
494 | } | ||
495 | |||
448 | sub ctx_statement_full { | 496 | sub ctx_statement_full { |
449 | my ($linenr, $remain, $off) = @_; | 497 | my ($linenr, $remain, $off) = @_; |
450 | my ($statement, $condition, $level); | 498 | my ($statement, $condition, $level); |
451 | 499 | ||
452 | my (@chunks); | 500 | my (@chunks); |
453 | 501 | ||
502 | # Grab the first conditional/block pair. | ||
454 | ($statement, $condition, $linenr, $remain, $off, $level) = | 503 | ($statement, $condition, $linenr, $remain, $off, $level) = |
455 | ctx_statement_block($linenr, $remain, $off); | 504 | ctx_statement_block($linenr, $remain, $off); |
456 | #print "F: c<$condition> s<$statement>\n"; | 505 | #print "F: c<$condition> s<$statement>\n"; |
506 | push(@chunks, [ $condition, $statement ]); | ||
507 | if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) { | ||
508 | return ($level, $linenr, @chunks); | ||
509 | } | ||
510 | |||
511 | # Pull in the following conditional/block pairs and see if they | ||
512 | # could continue the statement. | ||
457 | for (;;) { | 513 | for (;;) { |
458 | push(@chunks, [ $condition, $statement ]); | ||
459 | last if (!($remain > 0 && $condition =~ /^.\s*(?:if|else|do)/)); | ||
460 | ($statement, $condition, $linenr, $remain, $off, $level) = | 514 | ($statement, $condition, $linenr, $remain, $off, $level) = |
461 | ctx_statement_block($linenr, $remain, $off); | 515 | ctx_statement_block($linenr, $remain, $off); |
462 | #print "C: c<$condition> s<$statement>\n"; | 516 | #print "C: c<$condition> s<$statement> remain<$remain>\n"; |
517 | last if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:else|do)\b/s)); | ||
518 | #print "C: push\n"; | ||
519 | push(@chunks, [ $condition, $statement ]); | ||
463 | } | 520 | } |
464 | 521 | ||
465 | return ($level, $linenr, @chunks); | 522 | return ($level, $linenr, @chunks); |
@@ -593,13 +650,13 @@ sub cat_vet { | |||
593 | } | 650 | } |
594 | 651 | ||
595 | my $av_preprocessor = 0; | 652 | my $av_preprocessor = 0; |
596 | my $av_paren = 0; | 653 | my $av_pending; |
597 | my @av_paren_type; | 654 | my @av_paren_type; |
598 | 655 | ||
599 | sub annotate_reset { | 656 | sub annotate_reset { |
600 | $av_preprocessor = 0; | 657 | $av_preprocessor = 0; |
601 | $av_paren = 0; | 658 | $av_pending = '_'; |
602 | @av_paren_type = (); | 659 | @av_paren_type = ('E'); |
603 | } | 660 | } |
604 | 661 | ||
605 | sub annotate_values { | 662 | sub annotate_values { |
@@ -611,12 +668,13 @@ sub annotate_values { | |||
611 | print "$stream\n" if ($dbg_values > 1); | 668 | print "$stream\n" if ($dbg_values > 1); |
612 | 669 | ||
613 | while (length($cur)) { | 670 | while (length($cur)) { |
614 | print " <$type> " if ($dbg_values > 1); | 671 | print " <" . join('', @av_paren_type) . |
672 | "> <$type> " if ($dbg_values > 1); | ||
615 | if ($cur =~ /^(\s+)/o) { | 673 | if ($cur =~ /^(\s+)/o) { |
616 | print "WS($1)\n" if ($dbg_values > 1); | 674 | print "WS($1)\n" if ($dbg_values > 1); |
617 | if ($1 =~ /\n/ && $av_preprocessor) { | 675 | if ($1 =~ /\n/ && $av_preprocessor) { |
676 | $type = pop(@av_paren_type); | ||
618 | $av_preprocessor = 0; | 677 | $av_preprocessor = 0; |
619 | $type = 'N'; | ||
620 | } | 678 | } |
621 | 679 | ||
622 | } elsif ($cur =~ /^($Type)/) { | 680 | } elsif ($cur =~ /^($Type)/) { |
@@ -626,11 +684,33 @@ sub annotate_values { | |||
626 | } elsif ($cur =~ /^(#\s*define\s*$Ident)(\(?)/o) { | 684 | } elsif ($cur =~ /^(#\s*define\s*$Ident)(\(?)/o) { |
627 | print "DEFINE($1)\n" if ($dbg_values > 1); | 685 | print "DEFINE($1)\n" if ($dbg_values > 1); |
628 | $av_preprocessor = 1; | 686 | $av_preprocessor = 1; |
629 | $av_paren_type[$av_paren] = 'N'; | 687 | $av_pending = 'N'; |
630 | 688 | ||
631 | } elsif ($cur =~ /^(#\s*(?:ifdef|ifndef|if|else|elif|endif))/o) { | 689 | } elsif ($cur =~ /^(#\s*(?:ifdef|ifndef|if))/o) { |
632 | print "PRE($1)\n" if ($dbg_values > 1); | 690 | print "PRE_START($1)\n" if ($dbg_values > 1); |
633 | $av_preprocessor = 1; | 691 | $av_preprocessor = 1; |
692 | |||
693 | push(@av_paren_type, $type); | ||
694 | push(@av_paren_type, $type); | ||
695 | $type = 'N'; | ||
696 | |||
697 | } elsif ($cur =~ /^(#\s*(?:else|elif))/o) { | ||
698 | print "PRE_RESTART($1)\n" if ($dbg_values > 1); | ||
699 | $av_preprocessor = 1; | ||
700 | |||
701 | push(@av_paren_type, $av_paren_type[$#av_paren_type]); | ||
702 | |||
703 | $type = 'N'; | ||
704 | |||
705 | } elsif ($cur =~ /^(#\s*(?:endif))/o) { | ||
706 | print "PRE_END($1)\n" if ($dbg_values > 1); | ||
707 | |||
708 | $av_preprocessor = 1; | ||
709 | |||
710 | # Assume all arms of the conditional end as this | ||
711 | # one does, and continue as if the #endif was not here. | ||
712 | pop(@av_paren_type); | ||
713 | push(@av_paren_type, $type); | ||
634 | $type = 'N'; | 714 | $type = 'N'; |
635 | 715 | ||
636 | } elsif ($cur =~ /^(\\\n)/o) { | 716 | } elsif ($cur =~ /^(\\\n)/o) { |
@@ -639,13 +719,13 @@ sub annotate_values { | |||
639 | } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { | 719 | } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { |
640 | print "SIZEOF($1)\n" if ($dbg_values > 1); | 720 | print "SIZEOF($1)\n" if ($dbg_values > 1); |
641 | if (defined $2) { | 721 | if (defined $2) { |
642 | $av_paren_type[$av_paren] = 'V'; | 722 | $av_pending = 'V'; |
643 | } | 723 | } |
644 | $type = 'N'; | 724 | $type = 'N'; |
645 | 725 | ||
646 | } elsif ($cur =~ /^(if|while|typeof|__typeof__|for)\b/o) { | 726 | } elsif ($cur =~ /^(if|while|typeof|__typeof__|for)\b/o) { |
647 | print "COND($1)\n" if ($dbg_values > 1); | 727 | print "COND($1)\n" if ($dbg_values > 1); |
648 | $av_paren_type[$av_paren] = 'N'; | 728 | $av_pending = 'N'; |
649 | $type = 'N'; | 729 | $type = 'N'; |
650 | 730 | ||
651 | } elsif ($cur =~/^(return|case|else)/o) { | 731 | } elsif ($cur =~/^(return|case|else)/o) { |
@@ -654,14 +734,14 @@ sub annotate_values { | |||
654 | 734 | ||
655 | } elsif ($cur =~ /^(\()/o) { | 735 | } elsif ($cur =~ /^(\()/o) { |
656 | print "PAREN('$1')\n" if ($dbg_values > 1); | 736 | print "PAREN('$1')\n" if ($dbg_values > 1); |
657 | $av_paren++; | 737 | push(@av_paren_type, $av_pending); |
738 | $av_pending = '_'; | ||
658 | $type = 'N'; | 739 | $type = 'N'; |
659 | 740 | ||
660 | } elsif ($cur =~ /^(\))/o) { | 741 | } elsif ($cur =~ /^(\))/o) { |
661 | $av_paren-- if ($av_paren > 0); | 742 | my $new_type = pop(@av_paren_type); |
662 | if (defined $av_paren_type[$av_paren]) { | 743 | if ($new_type ne '_') { |
663 | $type = $av_paren_type[$av_paren]; | 744 | $type = $new_type; |
664 | undef $av_paren_type[$av_paren]; | ||
665 | print "PAREN('$1') -> $type\n" | 745 | print "PAREN('$1') -> $type\n" |
666 | if ($dbg_values > 1); | 746 | if ($dbg_values > 1); |
667 | } else { | 747 | } else { |
@@ -670,7 +750,7 @@ sub annotate_values { | |||
670 | 750 | ||
671 | } elsif ($cur =~ /^($Ident)\(/o) { | 751 | } elsif ($cur =~ /^($Ident)\(/o) { |
672 | print "FUNC($1)\n" if ($dbg_values > 1); | 752 | print "FUNC($1)\n" if ($dbg_values > 1); |
673 | $av_paren_type[$av_paren] = 'V'; | 753 | $av_pending = 'V'; |
674 | 754 | ||
675 | } elsif ($cur =~ /^($Ident|$Constant)/o) { | 755 | } elsif ($cur =~ /^($Ident|$Constant)/o) { |
676 | print "IDENT($1)\n" if ($dbg_values > 1); | 756 | print "IDENT($1)\n" if ($dbg_values > 1); |
@@ -680,11 +760,11 @@ sub annotate_values { | |||
680 | print "ASSIGN($1)\n" if ($dbg_values > 1); | 760 | print "ASSIGN($1)\n" if ($dbg_values > 1); |
681 | $type = 'N'; | 761 | $type = 'N'; |
682 | 762 | ||
683 | } elsif ($cur =~/^(;)/) { | 763 | } elsif ($cur =~/^(;|{|})/) { |
684 | print "END($1)\n" if ($dbg_values > 1); | 764 | print "END($1)\n" if ($dbg_values > 1); |
685 | $type = 'E'; | 765 | $type = 'E'; |
686 | 766 | ||
687 | } elsif ($cur =~ /^(;|{|}|\?|:|\[)/o) { | 767 | } elsif ($cur =~ /^(;|\?|:|\[)/o) { |
688 | print "CLOSE($1)\n" if ($dbg_values > 1); | 768 | print "CLOSE($1)\n" if ($dbg_values > 1); |
689 | $type = 'N'; | 769 | $type = 'N'; |
690 | 770 | ||
@@ -988,7 +1068,7 @@ sub process { | |||
988 | } | 1068 | } |
989 | 1069 | ||
990 | # check for RCS/CVS revision markers | 1070 | # check for RCS/CVS revision markers |
991 | if ($rawline =~ /\$(Revision|Log|Id)(?:\$|)/) { | 1071 | if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) { |
992 | WARN("CVS style keyword markers, these will _not_ be updated\n". $herecurr); | 1072 | WARN("CVS style keyword markers, these will _not_ be updated\n". $herecurr); |
993 | } | 1073 | } |
994 | 1074 | ||
@@ -999,41 +1079,44 @@ sub process { | |||
999 | 1079 | ||
1000 | # Check for potential 'bare' types | 1080 | # Check for potential 'bare' types |
1001 | if ($realcnt) { | 1081 | if ($realcnt) { |
1082 | my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); | ||
1083 | $s =~ s/\n./ /g; | ||
1084 | $s =~ s/{.*$//; | ||
1085 | |||
1002 | # Ignore goto labels. | 1086 | # Ignore goto labels. |
1003 | if ($line =~ /$Ident:\*$/) { | 1087 | if ($s =~ /$Ident:\*$/) { |
1004 | 1088 | ||
1005 | # Ignore functions being called | 1089 | # Ignore functions being called |
1006 | } elsif ($line =~ /^.\s*$Ident\s*\(/) { | 1090 | } elsif ($s =~ /^.\s*$Ident\s*\(/) { |
1007 | 1091 | ||
1008 | # definitions in global scope can only start with types | 1092 | # definitions in global scope can only start with types |
1009 | } elsif ($line =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b/) { | 1093 | } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b/) { |
1010 | possible($1, $line); | 1094 | possible($1, $s); |
1011 | 1095 | ||
1012 | # declarations always start with types | 1096 | # declarations always start with types |
1013 | } elsif ($prev_values eq 'E' && $line =~ /^.\s*(?:$Storage\s+)?(?:const\s+)?($Ident)\b(:?\s+$Sparse)?\s*\**\s*$Ident\s*(?:;|=|,)/) { | 1097 | } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:const\s+)?($Ident)\b(:?\s+$Sparse)?\s*\**\s*$Ident\s*(?:;|=|,)/) { |
1014 | possible($1); | 1098 | possible($1, $s); |
1015 | } | 1099 | } |
1016 | 1100 | ||
1017 | # any (foo ... *) is a pointer cast, and foo is a type | 1101 | # any (foo ... *) is a pointer cast, and foo is a type |
1018 | while ($line =~ /\(($Ident)(?:\s+$Sparse)*\s*\*+\s*\)/g) { | 1102 | while ($s =~ /\(($Ident)(?:\s+$Sparse)*\s*\*+\s*\)/g) { |
1019 | possible($1, $line); | 1103 | possible($1, $s); |
1020 | } | 1104 | } |
1021 | 1105 | ||
1022 | # Check for any sort of function declaration. | 1106 | # Check for any sort of function declaration. |
1023 | # int foo(something bar, other baz); | 1107 | # int foo(something bar, other baz); |
1024 | # void (*store_gdt)(x86_descr_ptr *); | 1108 | # void (*store_gdt)(x86_descr_ptr *); |
1025 | if ($prev_values eq 'E' && $line =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/) { | 1109 | if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/) { |
1026 | my ($name_len) = length($1); | 1110 | my ($name_len) = length($1); |
1027 | my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, $name_len); | ||
1028 | my $ctx = join("\n", @ctx); | ||
1029 | 1111 | ||
1030 | $ctx =~ s/\n.//; | 1112 | my $ctx = $s; |
1031 | substr($ctx, 0, $name_len + 1) = ''; | 1113 | substr($ctx, 0, $name_len + 1) = ''; |
1032 | $ctx =~ s/\)[^\)]*$//; | 1114 | $ctx =~ s/\)[^\)]*$//; |
1115 | |||
1033 | for my $arg (split(/\s*,\s*/, $ctx)) { | 1116 | for my $arg (split(/\s*,\s*/, $ctx)) { |
1034 | if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/ || $arg =~ /^($Ident)$/) { | 1117 | if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/ || $arg =~ /^($Ident)$/) { |
1035 | 1118 | ||
1036 | possible($1, $line); | 1119 | possible($1, $s); |
1037 | } | 1120 | } |
1038 | } | 1121 | } |
1039 | } | 1122 | } |
@@ -1100,8 +1183,8 @@ sub process { | |||
1100 | $curr_values = $prev_values . $curr_values; | 1183 | $curr_values = $prev_values . $curr_values; |
1101 | if ($dbg_values) { | 1184 | if ($dbg_values) { |
1102 | my $outline = $opline; $outline =~ s/\t/ /g; | 1185 | my $outline = $opline; $outline =~ s/\t/ /g; |
1103 | warn "--> .$outline\n"; | 1186 | print "$linenr > .$outline\n"; |
1104 | warn "--> $curr_values\n"; | 1187 | print "$linenr > $curr_values\n"; |
1105 | } | 1188 | } |
1106 | $prev_values = substr($curr_values, -1); | 1189 | $prev_values = substr($curr_values, -1); |
1107 | 1190 | ||
@@ -1148,7 +1231,9 @@ sub process { | |||
1148 | if (($prevline !~ /^}/) && | 1231 | if (($prevline !~ /^}/) && |
1149 | ($prevline !~ /^\+}/) && | 1232 | ($prevline !~ /^\+}/) && |
1150 | ($prevline !~ /^ }/) && | 1233 | ($prevline !~ /^ }/) && |
1151 | ($prevline !~ /\b\Q$name\E(?:\s+$Attribute)?\s*(?:;|=)/)) { | 1234 | ($prevline !~ /^.DECLARE_$Ident\(\Q$name\E\)/) && |
1235 | ($prevline !~ /^.LIST_HEAD\(\Q$name\E\)/) && | ||
1236 | ($prevline !~ /\b\Q$name\E(?:\s+$Attribute)?\s*(?:;|=|\[)/)) { | ||
1152 | WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); | 1237 | WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); |
1153 | } | 1238 | } |
1154 | } | 1239 | } |
@@ -1266,7 +1351,7 @@ sub process { | |||
1266 | =>|->|<<|>>|<|>|=|!|~| | 1351 | =>|->|<<|>>|<|>|=|!|~| |
1267 | &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|% | 1352 | &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|% |
1268 | }x; | 1353 | }x; |
1269 | my @elements = split(/($;+|$ops|;)/, $opline); | 1354 | my @elements = split(/($ops|;)/, $opline); |
1270 | my $off = 0; | 1355 | my $off = 0; |
1271 | 1356 | ||
1272 | my $blank = copy_spacing($opline); | 1357 | my $blank = copy_spacing($opline); |
@@ -1277,6 +1362,7 @@ sub process { | |||
1277 | my $a = ''; | 1362 | my $a = ''; |
1278 | $a = 'V' if ($elements[$n] ne ''); | 1363 | $a = 'V' if ($elements[$n] ne ''); |
1279 | $a = 'W' if ($elements[$n] =~ /\s$/); | 1364 | $a = 'W' if ($elements[$n] =~ /\s$/); |
1365 | $a = 'C' if ($elements[$n] =~ /$;$/); | ||
1280 | $a = 'B' if ($elements[$n] =~ /(\[|\()$/); | 1366 | $a = 'B' if ($elements[$n] =~ /(\[|\()$/); |
1281 | $a = 'O' if ($elements[$n] eq ''); | 1367 | $a = 'O' if ($elements[$n] eq ''); |
1282 | $a = 'E' if ($elements[$n] eq '' && $n == 0); | 1368 | $a = 'E' if ($elements[$n] eq '' && $n == 0); |
@@ -1287,6 +1373,7 @@ sub process { | |||
1287 | if (defined $elements[$n + 2]) { | 1373 | if (defined $elements[$n + 2]) { |
1288 | $c = 'V' if ($elements[$n + 2] ne ''); | 1374 | $c = 'V' if ($elements[$n + 2] ne ''); |
1289 | $c = 'W' if ($elements[$n + 2] =~ /^\s/); | 1375 | $c = 'W' if ($elements[$n + 2] =~ /^\s/); |
1376 | $c = 'C' if ($elements[$n + 2] =~ /^$;/); | ||
1290 | $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/); | 1377 | $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/); |
1291 | $c = 'O' if ($elements[$n + 2] eq ''); | 1378 | $c = 'O' if ($elements[$n + 2] eq ''); |
1292 | $c = 'E' if ($elements[$n + 2] =~ /\s*\\$/); | 1379 | $c = 'E' if ($elements[$n + 2] =~ /\s*\\$/); |
@@ -1330,13 +1417,13 @@ sub process { | |||
1330 | if ($op_type ne 'V' && | 1417 | if ($op_type ne 'V' && |
1331 | $ca =~ /\s$/ && $cc =~ /^\s*,/) { | 1418 | $ca =~ /\s$/ && $cc =~ /^\s*,/) { |
1332 | 1419 | ||
1333 | # Ignore comments | 1420 | # # Ignore comments |
1334 | } elsif ($op =~ /^$;+$/) { | 1421 | # } elsif ($op =~ /^$;+$/) { |
1335 | 1422 | ||
1336 | # ; should have either the end of line or a space or \ after it | 1423 | # ; should have either the end of line or a space or \ after it |
1337 | } elsif ($op eq ';') { | 1424 | } elsif ($op eq ';') { |
1338 | if ($ctx !~ /.x[WEB]/ && $cc !~ /^\\/ && | 1425 | if ($ctx !~ /.x[WEBC]/ && |
1339 | $cc !~ /^;/) { | 1426 | $cc !~ /^\\/ && $cc !~ /^;/) { |
1340 | ERROR("need space after that '$op' $at\n" . $hereptr); | 1427 | ERROR("need space after that '$op' $at\n" . $hereptr); |
1341 | } | 1428 | } |
1342 | 1429 | ||
@@ -1351,7 +1438,7 @@ sub process { | |||
1351 | 1438 | ||
1352 | # , must have a space on the right. | 1439 | # , must have a space on the right. |
1353 | } elsif ($op eq ',') { | 1440 | } elsif ($op eq ',') { |
1354 | if ($ctx !~ /.xW|.xE/ && $cc !~ /^}/) { | 1441 | if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) { |
1355 | ERROR("need space after that '$op' $at\n" . $hereptr); | 1442 | ERROR("need space after that '$op' $at\n" . $hereptr); |
1356 | } | 1443 | } |
1357 | 1444 | ||
@@ -1364,7 +1451,7 @@ sub process { | |||
1364 | # unary operator, or a cast | 1451 | # unary operator, or a cast |
1365 | } elsif ($op eq '!' || $op eq '~' || | 1452 | } elsif ($op eq '!' || $op eq '~' || |
1366 | ($is_unary && ($op eq '*' || $op eq '-' || $op eq '&'))) { | 1453 | ($is_unary && ($op eq '*' || $op eq '-' || $op eq '&'))) { |
1367 | if ($ctx !~ /[WEB]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { | 1454 | if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { |
1368 | ERROR("need space before that '$op' $at\n" . $hereptr); | 1455 | ERROR("need space before that '$op' $at\n" . $hereptr); |
1369 | } | 1456 | } |
1370 | if ($ctx =~ /.xW/) { | 1457 | if ($ctx =~ /.xW/) { |
@@ -1373,7 +1460,7 @@ sub process { | |||
1373 | 1460 | ||
1374 | # unary ++ and unary -- are allowed no space on one side. | 1461 | # unary ++ and unary -- are allowed no space on one side. |
1375 | } elsif ($op eq '++' or $op eq '--') { | 1462 | } elsif ($op eq '++' or $op eq '--') { |
1376 | if ($ctx !~ /[WOB]x[^W]/ && $ctx !~ /[^W]x[WOBE]/) { | 1463 | if ($ctx !~ /[WOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) { |
1377 | ERROR("need space one side of that '$op' $at\n" . $hereptr); | 1464 | ERROR("need space one side of that '$op' $at\n" . $hereptr); |
1378 | } | 1465 | } |
1379 | if ($ctx =~ /WxB/ || ($ctx =~ /Wx./ && $cc =~ /^;/)) { | 1466 | if ($ctx =~ /WxB/ || ($ctx =~ /Wx./ && $cc =~ /^;/)) { |
@@ -1387,13 +1474,13 @@ sub process { | |||
1387 | $op eq '*' or $op eq '/' or | 1474 | $op eq '*' or $op eq '/' or |
1388 | $op eq '%') | 1475 | $op eq '%') |
1389 | { | 1476 | { |
1390 | if ($ctx !~ /VxV|WxW|VxE|WxE|VxO/) { | 1477 | if ($ctx !~ /VxV|WxW|VxE|WxE|VxO|Cx.|.xC/) { |
1391 | ERROR("need consistent spacing around '$op' $at\n" . | 1478 | ERROR("need consistent spacing around '$op' $at\n" . |
1392 | $hereptr); | 1479 | $hereptr); |
1393 | } | 1480 | } |
1394 | 1481 | ||
1395 | # All the others need spaces both sides. | 1482 | # All the others need spaces both sides. |
1396 | } elsif ($ctx !~ /[EW]x[WE]/) { | 1483 | } elsif ($ctx !~ /[EWC]x[CWE]/) { |
1397 | # Ignore email addresses <foo@bar> | 1484 | # Ignore email addresses <foo@bar> |
1398 | if (!($op eq '<' && $cb =~ /$;\S+\@\S+>/) && | 1485 | if (!($op eq '<' && $cb =~ /$;\S+\@\S+>/) && |
1399 | !($op eq '>' && $cb =~ /<\S+\@\S+$;/)) { | 1486 | !($op eq '>' && $cb =~ /<\S+\@\S+$;/)) { |
@@ -1551,7 +1638,7 @@ sub process { | |||
1551 | 1638 | ||
1552 | # multi-statement macros should be enclosed in a do while loop, grab the | 1639 | # multi-statement macros should be enclosed in a do while loop, grab the |
1553 | # first statement and ensure its the whole macro if its not enclosed | 1640 | # first statement and ensure its the whole macro if its not enclosed |
1554 | # in a known goot container | 1641 | # in a known good container |
1555 | if ($prevline =~ /\#define.*\\/ && | 1642 | if ($prevline =~ /\#define.*\\/ && |
1556 | $prevline !~/(?:do\s+{|\(\{|\{)/ && | 1643 | $prevline !~/(?:do\s+{|\(\{|\{)/ && |
1557 | $line !~ /(?:do\s+{|\(\{|\{)/ && | 1644 | $line !~ /(?:do\s+{|\(\{|\{)/ && |
@@ -1599,84 +1686,95 @@ sub process { | |||
1599 | # check for redundant bracing round if etc | 1686 | # check for redundant bracing round if etc |
1600 | if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { | 1687 | if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { |
1601 | my ($level, $endln, @chunks) = | 1688 | my ($level, $endln, @chunks) = |
1602 | ctx_statement_full($linenr, $realcnt, 0); | 1689 | ctx_statement_full($linenr, $realcnt, 1); |
1603 | #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n"; | 1690 | #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n"; |
1604 | if ($#chunks > 1 && $level == 0) { | 1691 | #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n"; |
1692 | if ($#chunks > 0 && $level == 0) { | ||
1605 | my $allowed = 0; | 1693 | my $allowed = 0; |
1606 | my $seen = 0; | 1694 | my $seen = 0; |
1695 | my $herectx = $here . "\n";; | ||
1696 | my $ln = $linenr - 1; | ||
1607 | for my $chunk (@chunks) { | 1697 | for my $chunk (@chunks) { |
1608 | my ($cond, $block) = @{$chunk}; | 1698 | my ($cond, $block) = @{$chunk}; |
1609 | 1699 | ||
1700 | $herectx .= "$rawlines[$ln]\n[...]\n"; | ||
1701 | $ln += statement_rawlines($block) - 1; | ||
1702 | |||
1610 | substr($block, 0, length($cond)) = ''; | 1703 | substr($block, 0, length($cond)) = ''; |
1611 | 1704 | ||
1612 | $seen++ if ($block =~ /^\s*{/); | 1705 | $seen++ if ($block =~ /^\s*{/); |
1613 | 1706 | ||
1614 | $block =~ s/(^|\n)./$1/g; | 1707 | #print "cond<$cond> block<$block> allowed<$allowed>\n"; |
1615 | $block =~ s/^\s*{//; | 1708 | if (statement_lines($cond) > 1) { |
1616 | $block =~ s/}\s*$//; | 1709 | #print "APW: ALLOWED: cond<$cond>\n"; |
1617 | $block =~ s/^\s*//; | ||
1618 | $block =~ s/\s*$//; | ||
1619 | |||
1620 | my @lines = ($block =~ /\n/g); | ||
1621 | my @statements = ($block =~ /;/g); | ||
1622 | |||
1623 | #print "cond<$cond> block<$block> lines<" . scalar(@lines) . "> statements<" . scalar(@statements) . "> seen<$seen> allowed<$allowed>\n"; | ||
1624 | if (scalar(@lines) != 0) { | ||
1625 | $allowed = 1; | 1710 | $allowed = 1; |
1626 | } | 1711 | } |
1627 | if ($block =~/\b(?:if|for|while)\b/) { | 1712 | if ($block =~/\b(?:if|for|while)\b/) { |
1713 | #print "APW: ALLOWED: block<$block>\n"; | ||
1628 | $allowed = 1; | 1714 | $allowed = 1; |
1629 | } | 1715 | } |
1630 | if (scalar(@statements) > 1) { | 1716 | if (statement_block_size($block) > 1) { |
1717 | #print "APW: ALLOWED: lines block<$block>\n"; | ||
1631 | $allowed = 1; | 1718 | $allowed = 1; |
1632 | } | 1719 | } |
1633 | } | 1720 | } |
1634 | if ($seen && !$allowed) { | 1721 | if ($seen && !$allowed) { |
1635 | WARN("braces {} are not necessary for any arm of this statement\n" . $herecurr); | 1722 | WARN("braces {} are not necessary for any arm of this statement\n" . $herectx); |
1636 | $suppress_ifbraces = $endln; | ||
1637 | } | 1723 | } |
1724 | # Either way we have looked over this whole | ||
1725 | # statement and said what needs to be said. | ||
1726 | $suppress_ifbraces = $endln; | ||
1638 | } | 1727 | } |
1639 | } | 1728 | } |
1640 | if ($linenr > $suppress_ifbraces && | 1729 | if ($linenr > $suppress_ifbraces && |
1641 | $line =~ /\b(if|while|for|else)\b/) { | 1730 | $line =~ /\b(if|while|for|else)\b/) { |
1642 | # Locate the end of the opening statement. | 1731 | my ($level, $endln, @chunks) = |
1643 | my @control = ctx_statement($linenr, $realcnt, 0); | 1732 | ctx_statement_full($linenr, $realcnt, $-[0]); |
1644 | my $nr = $linenr + (scalar(@control) - 1); | 1733 | |
1645 | my $cnt = $realcnt - (scalar(@control) - 1); | 1734 | my $allowed = 0; |
1646 | 1735 | ||
1647 | my $off = $realcnt - $cnt; | 1736 | # Check the pre-context. |
1648 | #print "$off: line<$line>end<" . $lines[$nr - 1] . ">\n"; | 1737 | if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) { |
1649 | 1738 | #print "APW: ALLOWED: pre<$1>\n"; | |
1650 | # If this is is a braced statement group check it | 1739 | $allowed = 1; |
1651 | if ($lines[$nr - 1] =~ /{\s*$/) { | 1740 | } |
1652 | my ($lvl, @block) = ctx_block_level($nr, $cnt); | 1741 | # Check the condition. |
1653 | 1742 | my ($cond, $block) = @{$chunks[0]}; | |
1654 | my $stmt = join("\n", @block); | 1743 | if (defined $cond) { |
1655 | # Drop the diff line leader. | 1744 | substr($block, 0, length($cond)) = ''; |
1656 | $stmt =~ s/\n./\n/g; | 1745 | } |
1657 | # Drop the code outside the block. | 1746 | if (statement_lines($cond) > 1) { |
1658 | $stmt =~ s/(^[^{]*){\s*//; | 1747 | #print "APW: ALLOWED: cond<$cond>\n"; |
1659 | my $before = $1; | 1748 | $allowed = 1; |
1660 | $stmt =~ s/\s*}([^}]*$)//; | 1749 | } |
1661 | my $after = $1; | 1750 | if ($block =~/\b(?:if|for|while)\b/) { |
1662 | 1751 | #print "APW: ALLOWED: block<$block>\n"; | |
1663 | #print "block<" . join(' ', @block) . "><" . scalar(@block) . ">\n"; | 1752 | $allowed = 1; |
1664 | #print "before<$before> stmt<$stmt> after<$after>\n\n"; | 1753 | } |
1665 | 1754 | if (statement_block_size($block) > 1) { | |
1666 | # Count the newlines, if there is only one | 1755 | #print "APW: ALLOWED: lines block<$block>\n"; |
1667 | # then the block should not have {}'s. | 1756 | $allowed = 1; |
1668 | my @lines = ($stmt =~ /\n/g); | 1757 | } |
1669 | my @statements = ($stmt =~ /;/g); | 1758 | # Check the post-context. |
1670 | #print "lines<" . scalar(@lines) . ">\n"; | 1759 | if (defined $chunks[1]) { |
1671 | #print "statements<" . scalar(@statements) . ">\n"; | 1760 | my ($cond, $block) = @{$chunks[1]}; |
1672 | if ($lvl == 0 && scalar(@lines) == 0 && | 1761 | if (defined $cond) { |
1673 | scalar(@statements) < 2 && | 1762 | substr($block, 0, length($cond)) = ''; |
1674 | $stmt !~ /{/ && $stmt !~ /\bif\b/ && | 1763 | } |
1675 | $before !~ /}/ && $after !~ /{/) { | 1764 | if ($block =~ /^\s*\{/) { |
1676 | my $herectx = "$here\n" . join("\n", @control, @block[1 .. $#block]) . "\n"; | 1765 | #print "APW: ALLOWED: chunk-1 block<$block>\n"; |
1677 | shift(@block); | 1766 | $allowed = 1; |
1678 | WARN("braces {} are not necessary for single statement blocks\n" . $herectx); | 1767 | } |
1768 | } | ||
1769 | if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) { | ||
1770 | my $herectx = $here . "\n";; | ||
1771 | my $end = $linenr + statement_rawlines($block) - 1; | ||
1772 | |||
1773 | for (my $ln = $linenr - 1; $ln < $end; $ln++) { | ||
1774 | $herectx .= $rawlines[$ln] . "\n";; | ||
1679 | } | 1775 | } |
1776 | |||
1777 | WARN("braces {} are not necessary for single statement blocks\n" . $herectx); | ||
1680 | } | 1778 | } |
1681 | } | 1779 | } |
1682 | 1780 | ||
@@ -1828,15 +1926,6 @@ sub process { | |||
1828 | print "are false positives report them to the maintainer, see\n"; | 1926 | print "are false positives report them to the maintainer, see\n"; |
1829 | print "CHECKPATCH in MAINTAINERS.\n"; | 1927 | print "CHECKPATCH in MAINTAINERS.\n"; |
1830 | } | 1928 | } |
1831 | print <<EOL if ($file == 1 && $quiet == 0); | ||
1832 | |||
1833 | WARNING: Using --file mode. Please do not send patches to linux-kernel | ||
1834 | that change whole existing files if you did not significantly change most | ||
1835 | of the the file for other reasons anyways or just wrote the file newly | ||
1836 | from scratch. Pure code style patches have a significant cost in a | ||
1837 | quickly changing code base like Linux because they cause rejects | ||
1838 | with other changes. | ||
1839 | EOL | ||
1840 | 1929 | ||
1841 | return $clean; | 1930 | return $clean; |
1842 | } | 1931 | } |