aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Whitcroft <apw@shadowen.org>2007-06-23 20:16:44 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-06-24 11:59:12 -0400
commitd8aaf12142d066d3982475d58a9094c85a06a5a9 (patch)
tree2454f7a76be8b78833ae25fbc55d65956d8888bf
parentdebee0768ea1978c6efba03206a414685e4a9ed1 (diff)
update checkpatch.pl to version 0.06
Update to checkpatch.pl v0.06. Of note: - do { and else handled correctly as control structures for { matching - trailing whitespace correctly tripped when line otherwise empty - support for const, including const foo * const bar - multiline macros defining values correctly reported This version of checkpatch.pl can be found at the following URL: http://www.kernel.org/pub/linux/kernel/people/apw/checkpatch/checkpatch.pl-0.06 Full Changelog: Andy Whitcroft (14): Version: 0.06 cleanup the Type regular expression declarations fix up block counting end of line counts as a space for ++ and -- do { needs the same checks as if, for et al handle "const foo * const a" as a valid type add spacing checks following ; complete whitespace lines should trip trailing whitespace check else is also a block control structure badly formatted else can trip function declaration detect and report trailing statements after else types need to be terminated by a boundary multiline macros defining values should be surrounded by parentheses soften the wording of the Signed-off-by: warnings Signed-off-by: Andy Whitcroft <apw@shadowen.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>
-rwxr-xr-xscripts/checkpatch.pl145
1 files changed, 92 insertions, 53 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 56c364c1df81..277c32647f36 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.05'; 12my $V = '0.06';
13 13
14use Getopt::Long qw(:config no_auto_abbrev); 14use Getopt::Long qw(:config no_auto_abbrev);
15 15
@@ -271,24 +271,38 @@ sub process {
271 my $in_comment = 0; 271 my $in_comment = 0;
272 my $first_line = 0; 272 my $first_line = 0;
273 273
274 my $ident = '[A-Za-z\d_]+'; 274 my $Ident = qr{[A-Za-z\d_]+};
275 my $storage = '(?:extern|static)'; 275 my $Storage = qr{extern|static};
276 my $sparse = '(?:__user|__kernel|__force|__iomem)'; 276 my $Sparse = qr{__user|__kernel|__force|__iomem};
277 my $type = '(?:unsigned\s+)?' . 277 my $NonptrType = qr{
278 '(?:void|char|short|int|long|unsigned|float|double|' . 278 \b
279 'long\s+long|' . 279 (?:const\s+)?
280 "struct\\s+${ident}|" . 280 (?:unsigned\s+)?
281 "union\\s+${ident}|" . 281 (?:
282 "${ident}_t)" . 282 void|
283 "(?:\\s+$sparse)*" . 283 char|
284 '(?:\s*\*+)?'; 284 short|
285 my $attribute = '(?:__read_mostly|__init|__initdata)'; 285 int|
286 286 long|
287 my $Ident = $ident; 287 unsigned|
288 my $Type = $type; 288 float|
289 my $Storage = $storage; 289 double|
290 my $Declare = "(?:$storage\\s+)?$type"; 290 long\s+int|
291 my $Attribute = $attribute; 291 long\s+long|
292 long\s+long\s+int|
293 struct\s+$Ident|
294 union\s+$Ident|
295 ${Ident}_t
296 )
297 (?:\s+$Sparse)*
298 \b
299 }x;
300 my $Type = qr{
301 \b$NonptrType\b
302 (?:\s*\*+\s*const|\s*\*+)?
303 }x;
304 my $Declare = qr{(?:$Storage\s+)?$Type};
305 my $Attribute = qr{__read_mostly|__init|__initdata};
292 306
293 foreach my $line (@lines) { 307 foreach my $line (@lines) {
294 $linenr++; 308 $linenr++;
@@ -321,6 +335,7 @@ sub process {
321# blank context lines so we need to count that too. 335# blank context lines so we need to count that too.
322 if ($line =~ /^( |\+|$)/) { 336 if ($line =~ /^( |\+|$)/) {
323 $realline++; 337 $realline++;
338 $realcnt-- if ($realcnt != 0);
324 339
325 # track any sort of multi-line comment. Obviously if 340 # track any sort of multi-line comment. Obviously if
326 # the added text or context do not include the whole 341 # the added text or context do not include the whole
@@ -345,8 +360,9 @@ sub process {
345 # Track the previous line. 360 # Track the previous line.
346 ($prevline, $stashline) = ($stashline, $line); 361 ($prevline, $stashline) = ($stashline, $line);
347 ($previndent, $stashindent) = ($stashindent, $indent); 362 ($previndent, $stashindent) = ($stashindent, $indent);
363 } elsif ($realcnt == 1) {
364 $realcnt--;
348 } 365 }
349 $realcnt-- if ($realcnt != 0);
350 366
351#make up the handle for any error we report on this line 367#make up the handle for any error we report on this line
352 $here = "#$linenr: "; 368 $here = "#$linenr: ";
@@ -357,14 +373,11 @@ sub process {
357 my $hereprev = "$here\n$prevline\n$line\n\n"; 373 my $hereprev = "$here\n$prevline\n$line\n\n";
358 374
359#check the patch for a signoff: 375#check the patch for a signoff:
360 if ($line =~ /^\s*Signed-off-by:\s/) { 376 if ($line =~ /^\s*signed-off-by:/i) {
361 $signoff++;
362
363 } elsif ($line =~ /^\s*signed-off-by:/i) {
364 # This is a signoff, if ugly, so do not double report. 377 # This is a signoff, if ugly, so do not double report.
365 $signoff++; 378 $signoff++;
366 if (!($line =~ /^\s*Signed-off-by:/)) { 379 if (!($line =~ /^\s*Signed-off-by:/)) {
367 print "use Signed-off-by:\n"; 380 print "Signed-off-by: is the preferred form\n";
368 print "$herecurr"; 381 print "$herecurr";
369 $clean = 0; 382 $clean = 0;
370 } 383 }
@@ -389,7 +402,7 @@ sub process {
389 next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/); 402 next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
390 403
391#trailing whitespace 404#trailing whitespace
392 if ($line=~/^\+.*\S\s+$/) { 405 if ($line =~ /^\+.*\S\s+$/ || $line =~ /^\+\s+$/) {
393 my $herevet = "$here\n" . cat_vet($line) . "\n\n"; 406 my $herevet = "$here\n" . cat_vet($line) . "\n\n";
394 print "trailing whitespace\n"; 407 print "trailing whitespace\n";
395 print "$herevet"; 408 print "$herevet";
@@ -525,24 +538,23 @@ sub process {
525 } 538 }
526 539
527# * goes on variable not on type 540# * goes on variable not on type
528 if ($line =~ m{[A-Za-z\d_]+(\*+) [A-Za-z\d_]+}) { 541 if ($line =~ m{\($NonptrType(\*+)(?:\s+const)?\)}) {
529 print "\"foo$1 bar\" should be \"foo $1bar\"\n"; 542 print "\"(foo$1)\" should be \"(foo $1)\"\n";
530 print "$herecurr"; 543 print "$herecurr";
531 $clean = 0; 544 $clean = 0;
532 } 545
533 if ($line =~ m{$Type (\*) [A-Za-z\d_]+} || 546 } elsif ($line =~ m{\($NonptrType\s+(\*+)(?!\s+const)\s+\)}) {
534 $line =~ m{[A-Za-z\d_]+ (\*\*+) [A-Za-z\d_]+}) { 547 print "\"(foo $1 )\" should be \"(foo $1)\"\n";
535 print "\"foo $1 bar\" should be \"foo $1bar\"\n";
536 print "$herecurr"; 548 print "$herecurr";
537 $clean = 0; 549 $clean = 0;
538 } 550
539 if ($line =~ m{\([A-Za-z\d_\s]+[A-Za-z\d_](\*+)\)}) { 551 } elsif ($line =~ m{$NonptrType(\*+)(?:\s+const)?\s+[A-Za-z\d_]+}) {
540 print "\"(foo$1)\" should be \"(foo $1)\"\n"; 552 print "\"foo$1 bar\" should be \"foo $1bar\"\n";
541 print "$herecurr"; 553 print "$herecurr";
542 $clean = 0; 554 $clean = 0;
543 } 555
544 if ($line =~ m{\([A-Za-z\d_\s]+[A-Za-z\d_]\s+(\*+)\s+\)}) { 556 } elsif ($line =~ m{$NonptrType\s+(\*+)(?!\s+const)\s+[A-Za-z\d_]+}) {
545 print "\"(foo $1 )\" should be \"(foo $1)\"\n"; 557 print "\"foo $1 bar\" should be \"foo $1bar\"\n";
546 print "$herecurr"; 558 print "$herecurr";
547 $clean = 0; 559 $clean = 0;
548 } 560 }
@@ -581,7 +593,7 @@ sub process {
581 593
582# function brace can't be on same line, except for #defines of do while, 594# function brace can't be on same line, except for #defines of do while,
583# or if closed on same line 595# or if closed on same line
584 if (($line=~/[A-Za-z\d_]+\**\s+\**[A-Za-z\d_]+\(.*\).* {/) and 596 if (($line=~/$Type\s*[A-Za-z\d_]+\(.*\).* {/) and
585 !($line=~/\#define.*do\s{/) and !($line=~/}/)) { 597 !($line=~/\#define.*do\s{/) and !($line=~/}/)) {
586 print "braces following function declarations go on the next line\n"; 598 print "braces following function declarations go on the next line\n";
587 print "$herecurr"; 599 print "$herecurr";
@@ -624,7 +636,7 @@ sub process {
624 my $ca = substr($opline, $off - 1, 1); 636 my $ca = substr($opline, $off - 1, 1);
625 my $cc = ''; 637 my $cc = '';
626 if (length($opline) >= ($off + length($elements[$n + 1]))) { 638 if (length($opline) >= ($off + length($elements[$n + 1]))) {
627 $cc = substr($opline, $off + length($elements[$n + 1]), 1); 639 $cc = substr($opline, $off + length($elements[$n + 1]));
628 } 640 }
629 641
630 my $ctx = "${a}x${c}"; 642 my $ctx = "${a}x${c}";
@@ -636,8 +648,16 @@ sub process {
636 648
637 ##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>\n"; 649 ##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>\n";
638 650
639 # We need ; as an operator. // is a comment. 651 # ; should have either the end of line or a space or \ after it
640 if ($op eq ';' or $op eq '//') { 652 if ($op eq ';') {
653 if ($ctx !~ /.x[WE]/ && $cc !~ /^\\/) {
654 print "need space after that '$op' $at\n";
655 print "$hereptr";
656 $clean = 0;
657 }
658
659 # // is a comment
660 } elsif ($op eq '//') {
641 661
642 # -> should have no spaces 662 # -> should have no spaces
643 } elsif ($op eq '->') { 663 } elsif ($op eq '->') {
@@ -649,7 +669,7 @@ sub process {
649 669
650 # , must have a space on the right. 670 # , must have a space on the right.
651 } elsif ($op eq ',') { 671 } elsif ($op eq ',') {
652 if ($ctx !~ /.xW|.xE/ && $cc ne '}') { 672 if ($ctx !~ /.xW|.xE/ && $cc !~ /^}/) {
653 print "need space after that '$op' $at\n"; 673 print "need space after that '$op' $at\n";
654 print "$hereptr"; 674 print "$hereptr";
655 $clean = 0; 675 $clean = 0;
@@ -670,12 +690,12 @@ sub process {
670 690
671 # unary ++ and unary -- are allowed no space on one side. 691 # unary ++ and unary -- are allowed no space on one side.
672 } elsif ($op eq '++' or $op eq '--') { 692 } elsif ($op eq '++' or $op eq '--') {
673 if ($ctx !~ /[WOB]x[^W]/ && $ctx !~ /[^W]x[WOB]/) { 693 if ($ctx !~ /[WOB]x[^W]/ && $ctx !~ /[^W]x[WOBE]/) {
674 print "need space one side of that '$op' $at\n"; 694 print "need space one side of that '$op' $at\n";
675 print "$hereptr"; 695 print "$hereptr";
676 $clean = 0; 696 $clean = 0;
677 } 697 }
678 if ($ctx =~ /Wx./ && $cc eq ';') { 698 if ($ctx =~ /Wx./ && $cc =~ /^;/) {
679 print "no space before that '$op' $at\n"; 699 print "no space before that '$op' $at\n";
680 print "$hereptr"; 700 print "$hereptr";
681 $clean = 0; 701 $clean = 0;
@@ -707,7 +727,7 @@ sub process {
707 # 727 #
708 } elsif ($op eq '*') { 728 } elsif ($op eq '*') {
709 if ($ca eq '*') { 729 if ($ca eq '*') {
710 if ($cc =~ /\s/) { 730 if ($cc =~ /^\s(?!\s*const)/) {
711 print "no space after that '$op' $at\n"; 731 print "no space after that '$op' $at\n";
712 print "$hereptr"; 732 print "$hereptr";
713 $clean = 0; 733 $clean = 0;
@@ -803,7 +823,7 @@ sub process {
803 823
804# if/while/etc brace do not go on next line, unless defining a do while loop, 824# if/while/etc brace do not go on next line, unless defining a do while loop,
805# or if that brace on the next line is for something else 825# or if that brace on the next line is for something else
806 if ($prevline=~/\b(if|while|for|switch)\s*\(/) { 826 if ($prevline=~/\b(?:(if|while|for|switch)\s*\(|do\b|else\b)/) {
807 my @opened = $prevline=~/\(/g; 827 my @opened = $prevline=~/\(/g;
808 my @closed = $prevline=~/\)/g; 828 my @closed = $prevline=~/\)/g;
809 my $nr_line = $linenr; 829 my $nr_line = $linenr;
@@ -823,14 +843,22 @@ sub process {
823 @closed = $prevline=~/\)/g; 843 @closed = $prevline=~/\)/g;
824 } 844 }
825 845
826 if (($prevline=~/\b(if|while|for|switch)\s*\(.*\)\s*$/) and ($next_line=~/{/) and 846 if (($prevline=~/\b(?:(if|while|for|switch)\s*\(.*\)|do|else)\s*$/) and ($next_line=~/{/) and
827 !($next_line=~/\b(if|while|for|switch)/) and !($next_line=~/\#define.*do.*while/)) { 847 !($next_line=~/\b(?:if|while|for|switch|do|else)\b/) and !($next_line=~/\#define.*do.*while/)) {
828 print "That { should be on the previous line\n"; 848 print "That { should be on the previous line\n";
829 print "$here\n$display_segment\n$next_line\n\n"; 849 print "$here\n$display_segment\n$next_line\n\n";
830 $clean = 0; 850 $clean = 0;
831 } 851 }
832 } 852 }
833 853
854# if and else should not have general statements after it
855 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/ &&
856 $1 !~ /^\s*(?:\sif|{|$)/) {
857 print "trailing statements should be on next line\n";
858 print "$herecurr";
859 $clean = 0;
860 }
861
834# multi-statement macros should be enclosed in a do while loop, grab the 862# multi-statement macros should be enclosed in a do while loop, grab the
835# first statement and ensure its the whole macro if its not enclosed 863# first statement and ensure its the whole macro if its not enclosed
836# in a known goot container 864# in a known goot container
@@ -841,11 +869,22 @@ sub process {
841 # Grab the first statement, if that is the entire macro 869 # Grab the first statement, if that is the entire macro
842 # its ok. This may start either on the #define line 870 # its ok. This may start either on the #define line
843 # or the one below. 871 # or the one below.
844 my $ctx1 = join('', ctx_statement($linenr - 1, $realcnt + 1)); 872 my $ln = $linenr;
845 my $ctx2 = join('', ctx_statement($linenr, $realcnt)); 873 my $cnt = $realcnt;
846 874
847 if ($ctx1 =~ /\\$/ && $ctx2 =~ /\\$/) { 875 # If the macro starts on the define line start there.
848 print "Macros with multiple statements should be enclosed in a do - while loop\n"; 876 if ($prevline !~ m{^.#\s*define\s*$Ident(?:\([^\)]*\))?\s*\\\s*$}) {
877 $ln--;
878 $cnt++;
879 }
880 my $ctx = join('', ctx_statement($ln, $cnt));
881
882 if ($ctx =~ /\\$/) {
883 if ($ctx =~ /;/) {
884 print "Macros with multiple statements should be enclosed in a do - while loop\n";
885 } else {
886 print "Macros with complex values should be enclosed in parenthesis\n";
887 }
849 print "$hereprev"; 888 print "$hereprev";
850 $clean = 0; 889 $clean = 0;
851 } 890 }