aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/checkpatch.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/checkpatch.pl')
-rwxr-xr-xscripts/checkpatch.pl183
1 files changed, 129 insertions, 54 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index aea90d30d229..56c364c1df81 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.04'; 12my $V = '0.05';
13 13
14use Getopt::Long qw(:config no_auto_abbrev); 14use Getopt::Long qw(:config no_auto_abbrev);
15 15
@@ -17,11 +17,13 @@ my $quiet = 0;
17my $tree = 1; 17my $tree = 1;
18my $chk_signoff = 1; 18my $chk_signoff = 1;
19my $chk_patch = 1; 19my $chk_patch = 1;
20my $tst_type = 0;
20GetOptions( 21GetOptions(
21 'q|quiet' => \$quiet, 22 'q|quiet' => \$quiet,
22 'tree!' => \$tree, 23 'tree!' => \$tree,
23 'signoff!' => \$chk_signoff, 24 'signoff!' => \$chk_signoff,
24 'patch!' => \$chk_patch, 25 'patch!' => \$chk_patch,
26 'test-type!' => \$tst_type,
25) or exit; 27) or exit;
26 28
27my $exit = 0; 29my $exit = 0;
@@ -151,7 +153,7 @@ sub sanitise_line {
151} 153}
152 154
153sub ctx_block_get { 155sub ctx_block_get {
154 my ($linenr, $remain, $outer) = @_; 156 my ($linenr, $remain, $outer, $open, $close) = @_;
155 my $line; 157 my $line;
156 my $start = $linenr - 1; 158 my $start = $linenr - 1;
157 my $blk = ''; 159 my $blk = '';
@@ -165,8 +167,8 @@ sub ctx_block_get {
165 167
166 $blk .= $rawlines[$line]; 168 $blk .= $rawlines[$line];
167 169
168 @o = ($blk =~ /\{/g); 170 @o = ($blk =~ /$open/g);
169 @c = ($blk =~ /\}/g); 171 @c = ($blk =~ /$close/g);
170 172
171 if (!$outer || (scalar(@o) - scalar(@c)) == 1) { 173 if (!$outer || (scalar(@o) - scalar(@c)) == 1) {
172 push(@res, $rawlines[$line]); 174 push(@res, $rawlines[$line]);
@@ -180,12 +182,17 @@ sub ctx_block_get {
180sub ctx_block_outer { 182sub ctx_block_outer {
181 my ($linenr, $remain) = @_; 183 my ($linenr, $remain) = @_;
182 184
183 return ctx_block_get($linenr, $remain, 1); 185 return ctx_block_get($linenr, $remain, 1, '\{', '\}');
184} 186}
185sub ctx_block { 187sub ctx_block {
186 my ($linenr, $remain) = @_; 188 my ($linenr, $remain) = @_;
187 189
188 return ctx_block_get($linenr, $remain, 0); 190 return ctx_block_get($linenr, $remain, 0, '\{', '\}');
191}
192sub ctx_statement {
193 my ($linenr, $remain) = @_;
194
195 return ctx_block_get($linenr, $remain, 0, '\(', '\)');
189} 196}
190 197
191sub ctx_locate_comment { 198sub ctx_locate_comment {
@@ -264,9 +271,30 @@ sub process {
264 my $in_comment = 0; 271 my $in_comment = 0;
265 my $first_line = 0; 272 my $first_line = 0;
266 273
274 my $ident = '[A-Za-z\d_]+';
275 my $storage = '(?:extern|static)';
276 my $sparse = '(?:__user|__kernel|__force|__iomem)';
277 my $type = '(?:unsigned\s+)?' .
278 '(?:void|char|short|int|long|unsigned|float|double|' .
279 'long\s+long|' .
280 "struct\\s+${ident}|" .
281 "union\\s+${ident}|" .
282 "${ident}_t)" .
283 "(?:\\s+$sparse)*" .
284 '(?:\s*\*+)?';
285 my $attribute = '(?:__read_mostly|__init|__initdata)';
286
287 my $Ident = $ident;
288 my $Type = $type;
289 my $Storage = $storage;
290 my $Declare = "(?:$storage\\s+)?$type";
291 my $Attribute = $attribute;
292
267 foreach my $line (@lines) { 293 foreach my $line (@lines) {
268 $linenr++; 294 $linenr++;
269 295
296 my $rawline = $line;
297
270#extract the filename as it passes 298#extract the filename as it passes
271 if ($line=~/^\+\+\+\s+(\S+)/) { 299 if ($line=~/^\+\+\+\s+(\S+)/) {
272 $realfile=$1; 300 $realfile=$1;
@@ -361,7 +389,7 @@ sub process {
361 next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/); 389 next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
362 390
363#trailing whitespace 391#trailing whitespace
364 if ($line=~/\+.*\S\s+$/) { 392 if ($line=~/^\+.*\S\s+$/) {
365 my $herevet = "$here\n" . cat_vet($line) . "\n\n"; 393 my $herevet = "$here\n" . cat_vet($line) . "\n\n";
366 print "trailing whitespace\n"; 394 print "trailing whitespace\n";
367 print "$herevet"; 395 print "$herevet";
@@ -392,17 +420,20 @@ sub process {
392 # 420 #
393 next if ($in_comment); 421 next if ($in_comment);
394 422
395 # Remove comments from the line before processing. 423# Remove comments from the line before processing.
396 $line =~ s@/\*.*\*/@@g; 424 $line =~ s@/\*.*\*/@@g;
397 $line =~ s@/\*.*@@; 425 $line =~ s@/\*.*@@;
398 $line =~ s@.*\*/@@; 426 $line =~ s@.*\*/@@;
399 427
400 # 428# Standardise the strings and chars within the input to simplify matching.
401 # Checks which may be anchored in the context. 429 $line = sanitise_line($line);
402 # 430
431#
432# Checks which may be anchored in the context.
433#
403 434
404 # Check for switch () and associated case and default 435# Check for switch () and associated case and default
405 # statements should be at the same indent. 436# statements should be at the same indent.
406 if ($line=~/\bswitch\s*\(.*\)/) { 437 if ($line=~/\bswitch\s*\(.*\)/) {
407 my $err = ''; 438 my $err = '';
408 my $sep = ''; 439 my $sep = '';
@@ -428,9 +459,30 @@ sub process {
428#ignore lines not being added 459#ignore lines not being added
429 if ($line=~/^[^\+]/) {next;} 460 if ($line=~/^[^\+]/) {next;}
430 461
431 # 462# TEST: allow direct testing of the type matcher.
432 # Checks which are anchored on the added line. 463 if ($tst_type && $line =~ /^.$Declare$/) {
433 # 464 print "TEST: is type $Declare\n";
465 print "$herecurr";
466 $clean = 0;
467 next;
468 }
469
470#
471# Checks which are anchored on the added line.
472#
473
474# check for malformed paths in #include statements (uses RAW line)
475 if ($rawline =~ m{^.#\s*include\s+[<"](.*)[">]}) {
476 my $path = $1;
477 if ($path =~ m{//}) {
478 print "malformed #include filename\n";
479 print "$herecurr";
480 $clean = 0;
481 }
482 # Sanitise this special form of string.
483 $path = 'X' x length($path);
484 $line =~ s{\<.*\>}{<$path>};
485 }
434 486
435# no C99 // comments 487# no C99 // comments
436 if ($line =~ m{//}) { 488 if ($line =~ m{//}) {
@@ -441,47 +493,44 @@ sub process {
441 # Remove C99 comments. 493 # Remove C99 comments.
442 $line =~ s@//.*@@; 494 $line =~ s@//.*@@;
443 495
444 # Standardise the strings and chars within the input
445 # to simplify matching.
446 $line = sanitise_line($line);
447
448#EXPORT_SYMBOL should immediately follow its function closing }. 496#EXPORT_SYMBOL should immediately follow its function closing }.
449 if (($line =~ /EXPORT_SYMBOL.*\(.*\)/) || 497 if (($line =~ /EXPORT_SYMBOL.*\((.*)\)/) ||
450 ($line =~ /EXPORT_UNUSED_SYMBOL.*\(.*\)/)) { 498 ($line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
499 my $name = $1;
451 if (($prevline !~ /^}/) && 500 if (($prevline !~ /^}/) &&
452 ($prevline !~ /^\+}/) && 501 ($prevline !~ /^\+}/) &&
453 ($prevline !~ /^ }/)) { 502 ($prevline !~ /^ }/) &&
454 print "EXPORT_SYMBOL(func); should immediately follow its function\n"; 503 ($prevline !~ /\s$name(?:\s+$Attribute)?\s*(?:;|=)/)) {
504 print "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n";
455 print "$herecurr"; 505 print "$herecurr";
456 $clean = 0; 506 $clean = 0;
457 } 507 }
458 } 508 }
459 509
460 # check for static initialisers. 510# check for static initialisers.
461 if ($line=~/\s*static\s.*=\s+(0|NULL);/) { 511 if ($line=~/\s*static\s.*=\s+(0|NULL);/) {
462 print "do not initialise statics to 0 or NULL\n"; 512 print "do not initialise statics to 0 or NULL\n";
463 print "$herecurr"; 513 print "$herecurr";
464 $clean = 0; 514 $clean = 0;
465 } 515 }
466 516
467 # check for new typedefs. 517# check for new typedefs, only function parameters and sparse annotations
468 if ($line=~/\s*typedef\s/) { 518# make sense.
519 if ($line =~ /\btypedef\s/ &&
520 $line !~ /\btypedef\s+$Type\s+\(\s*$Ident\s*\)\s*\(/ &&
521 $line !~ /\b__bitwise(?:__|)\b/) {
469 print "do not add new typedefs\n"; 522 print "do not add new typedefs\n";
470 print "$herecurr"; 523 print "$herecurr";
471 $clean = 0; 524 $clean = 0;
472 } 525 }
473 526
474# * goes on variable not on type 527# * goes on variable not on type
475 my $type = '(?:char|short|int|long|unsigned|float|double|' .
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_]+}) { 528 if ($line =~ m{[A-Za-z\d_]+(\*+) [A-Za-z\d_]+}) {
480 print "\"foo$1 bar\" should be \"foo $1bar\"\n"; 529 print "\"foo$1 bar\" should be \"foo $1bar\"\n";
481 print "$herecurr"; 530 print "$herecurr";
482 $clean = 0; 531 $clean = 0;
483 } 532 }
484 if ($line =~ m{$type (\*) [A-Za-z\d_]+} || 533 if ($line =~ m{$Type (\*) [A-Za-z\d_]+} ||
485 $line =~ m{[A-Za-z\d_]+ (\*\*+) [A-Za-z\d_]+}) { 534 $line =~ m{[A-Za-z\d_]+ (\*\*+) [A-Za-z\d_]+}) {
486 print "\"foo $1 bar\" should be \"foo $1bar\"\n"; 535 print "\"foo $1 bar\" should be \"foo $1bar\"\n";
487 print "$herecurr"; 536 print "$herecurr";
@@ -530,13 +579,16 @@ sub process {
530 } 579 }
531 } 580 }
532 581
533#function brace can't be on same line, except for #defines of do while, or if closed on same line 582# function brace can't be on same line, except for #defines of do while,
583# or if closed on same line
534 if (($line=~/[A-Za-z\d_]+\**\s+\**[A-Za-z\d_]+\(.*\).* {/) and 584 if (($line=~/[A-Za-z\d_]+\**\s+\**[A-Za-z\d_]+\(.*\).* {/) and
535 !($line=~/\#define.*do\s{/) and !($line=~/}/)) { 585 !($line=~/\#define.*do\s{/) and !($line=~/}/)) {
536 print "braces following function declarations go on the next line\n"; 586 print "braces following function declarations go on the next line\n";
537 print "$herecurr"; 587 print "$herecurr";
538 $clean = 0; 588 $clean = 0;
539 } 589 }
590
591# Check operator spacing.
540 # Note we expand the line with the leading + as the real 592 # Note we expand the line with the leading + as the real
541 # line will be displayed with the leading + and the tabs 593 # line will be displayed with the leading + and the tabs
542 # will therefore also expand that way. 594 # will therefore also expand that way.
@@ -544,7 +596,6 @@ sub process {
544 $opline = expand_tabs($opline); 596 $opline = expand_tabs($opline);
545 $opline =~ s/^./ /; 597 $opline =~ s/^./ /;
546 if (!($line=~/\#\s*include/)) { 598 if (!($line=~/\#\s*include/)) {
547 # Check operator spacing.
548 my @elements = split(/(<<=|>>=|<=|>=|==|!=|\+=|-=|\*=|\/=|%=|\^=|\|=|&=|->|<<|>>|<|>|=|!|~|&&|\|\||,|\^|\+\+|--|;|&|\||\+|-|\*|\/\/|\/)/, $opline); 599 my @elements = split(/(<<=|>>=|<=|>=|==|!=|\+=|-=|\*=|\/=|%=|\^=|\|=|&=|->|<<|>>|<|>|=|!|~|&&|\|\||,|\^|\+\+|--|;|&|\||\+|-|\*|\/\/|\/)/, $opline);
549 my $off = 0; 600 my $off = 0;
550 for (my $n = 0; $n < $#elements; $n += 2) { 601 for (my $n = 0; $n < $#elements; $n += 2) {
@@ -572,8 +623,8 @@ sub process {
572 # Pick up the preceeding and succeeding characters. 623 # Pick up the preceeding and succeeding characters.
573 my $ca = substr($opline, $off - 1, 1); 624 my $ca = substr($opline, $off - 1, 1);
574 my $cc = ''; 625 my $cc = '';
575 if (length($opline) > ($off + length($elements[$n]))) { 626 if (length($opline) >= ($off + length($elements[$n + 1]))) {
576 $cc = substr($opline, $off + 1 + length($elements[$n]), 1); 627 $cc = substr($opline, $off + length($elements[$n + 1]), 1);
577 } 628 }
578 629
579 my $ctx = "${a}x${c}"; 630 my $ctx = "${a}x${c}";
@@ -598,7 +649,7 @@ sub process {
598 649
599 # , must have a space on the right. 650 # , must have a space on the right.
600 } elsif ($op eq ',') { 651 } elsif ($op eq ',') {
601 if ($ctx !~ /.xW|.xE/) { 652 if ($ctx !~ /.xW|.xE/ && $cc ne '}') {
602 print "need space after that '$op' $at\n"; 653 print "need space after that '$op' $at\n";
603 print "$hereptr"; 654 print "$hereptr";
604 $clean = 0; 655 $clean = 0;
@@ -619,11 +670,16 @@ sub process {
619 670
620 # unary ++ and unary -- are allowed no space on one side. 671 # unary ++ and unary -- are allowed no space on one side.
621 } elsif ($op eq '++' or $op eq '--') { 672 } elsif ($op eq '++' or $op eq '--') {
622 if ($ctx !~ /[WOB]x[^W]|[^W]x[WOB]/) { 673 if ($ctx !~ /[WOB]x[^W]/ && $ctx !~ /[^W]x[WOB]/) {
623 print "need space one side of that '$op' $at\n"; 674 print "need space one side of that '$op' $at\n";
624 print "$hereptr"; 675 print "$hereptr";
625 $clean = 0; 676 $clean = 0;
626 } 677 }
678 if ($ctx =~ /Wx./ && $cc eq ';') {
679 print "no space before that '$op' $at\n";
680 print "$hereptr";
681 $clean = 0;
682 }
627 683
628 # & is both unary and binary 684 # & is both unary and binary
629 # unary: 685 # unary:
@@ -656,7 +712,7 @@ sub process {
656 print "$hereptr"; 712 print "$hereptr";
657 $clean = 0; 713 $clean = 0;
658 } 714 }
659 } elsif ($ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]|OxV|WxB/) { 715 } elsif ($ctx !~ /VxV|[EW]x[WE]|[EWB]x[VO]|OxV|WxB|BxB/) {
660 print "need space before that '$op' $at\n"; 716 print "need space before that '$op' $at\n";
661 print "$hereptr"; 717 print "$hereptr";
662 $clean = 0; 718 $clean = 0;
@@ -705,9 +761,9 @@ sub process {
705 } 761 }
706 762
707# Check for illegal assignment in if conditional. 763# Check for illegal assignment in if conditional.
708 if ($line=~/\b(if|while)\s*\(.*[^<>!=]=[^=].*\)/) { 764 if ($line=~/\bif\s*\(.*[^<>!=]=[^=].*\)/) {
709 #next if ($line=~/\".*\Q$op\E.*\"/ or $line=~/\'\Q$op\E\'/); 765 #next if ($line=~/\".*\Q$op\E.*\"/ or $line=~/\'\Q$op\E\'/);
710 print "do not use assignment in condition\n"; 766 print "do not use assignment in if condition\n";
711 print "$herecurr"; 767 print "$herecurr";
712 $clean = 0; 768 $clean = 0;
713 } 769 }
@@ -735,8 +791,8 @@ sub process {
735 $clean = 0; 791 $clean = 0;
736 } 792 }
737 793
738#warn if <asm/foo.h> is #included and <linux/foo.h> is available. 794#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
739 if ($tree && $line =~ qr|\s*\#\s*include\s*\<asm\/(.*)\.h\>|) { 795 if ($tree && $rawline =~ m{^.\#\s*include\s*\<asm\/(.*)\.h\>}) {
740 my $checkfile = "include/linux/$1.h"; 796 my $checkfile = "include/linux/$1.h";
741 if (-f $checkfile) { 797 if (-f $checkfile) {
742 print "Use #include <linux/$1.h> instead of <asm/$1.h>\n"; 798 print "Use #include <linux/$1.h> instead of <asm/$1.h>\n";
@@ -745,7 +801,8 @@ sub process {
745 } 801 }
746 } 802 }
747 803
748#if/while/etc brace do not go on next line, unless #defining a do while loop, or if that brace on the next line is for something else 804# 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
749 if ($prevline=~/\b(if|while|for|switch)\s*\(/) { 806 if ($prevline=~/\b(if|while|for|switch)\s*\(/) {
750 my @opened = $prevline=~/\(/g; 807 my @opened = $prevline=~/\(/g;
751 my @closed = $prevline=~/\)/g; 808 my @closed = $prevline=~/\)/g;
@@ -767,25 +824,36 @@ sub process {
767 } 824 }
768 825
769 if (($prevline=~/\b(if|while|for|switch)\s*\(.*\)\s*$/) and ($next_line=~/{/) and 826 if (($prevline=~/\b(if|while|for|switch)\s*\(.*\)\s*$/) and ($next_line=~/{/) and
770 !($next_line=~/\b(if|while|for)/) and !($next_line=~/\#define.*do.*while/)) { 827 !($next_line=~/\b(if|while|for|switch)/) and !($next_line=~/\#define.*do.*while/)) {
771 print "That { should be on the previous line\n"; 828 print "That { should be on the previous line\n";
772 print "$here\n$display_segment\n$next_line\n\n"; 829 print "$here\n$display_segment\n$next_line\n\n";
773 $clean = 0; 830 $clean = 0;
774 } 831 }
775 } 832 }
776 833
777#multiline macros should be enclosed in a do while loop 834# multi-statement macros should be enclosed in a do while loop, grab the
778 if (($prevline=~/\#define.*\\/) and !($prevline=~/do\s+{/) and 835# first statement and ensure its the whole macro if its not enclosed
779 !($prevline=~/\(\{/) and ($line=~/;\s*\\/) and 836# in a known goot container
780 !($line=~/do.*{/) and !($line=~/\(\{/)) { 837 if (($prevline=~/\#define.*\\/) and
781 print "Macros with multiple statements should be enclosed in a do - while loop\n"; 838 !($prevline=~/do\s+{/) and !($prevline=~/\(\{/) and
782 print "$hereprev"; 839 !($line=~/do.*{/) and !($line=~/\(\{/) and
783 $clean = 0; 840 !($line=~/^.\s*$Declare\s/)) {
841 # Grab the first statement, if that is the entire macro
842 # its ok. This may start either on the #define line
843 # or the one below.
844 my $ctx1 = join('', ctx_statement($linenr - 1, $realcnt + 1));
845 my $ctx2 = join('', ctx_statement($linenr, $realcnt));
846
847 if ($ctx1 =~ /\\$/ && $ctx2 =~ /\\$/) {
848 print "Macros with multiple statements should be enclosed in a do - while loop\n";
849 print "$hereprev";
850 $clean = 0;
851 }
784 } 852 }
785 853
786# don't include deprecated include files 854# don't include deprecated include files (uses RAW line)
787 for my $inc (@dep_includes) { 855 for my $inc (@dep_includes) {
788 if ($line =~ m@\#\s*include\s*\<$inc>@) { 856 if ($rawline =~ m@\#\s*include\s*\<$inc>@) {
789 print "Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n"; 857 print "Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n";
790 print "$herecurr"; 858 print "$herecurr";
791 $clean = 0; 859 $clean = 0;
@@ -845,6 +913,13 @@ sub process {
845 print "$herecurr"; 913 print "$herecurr";
846 $clean = 0; 914 $clean = 0;
847 } 915 }
916
917 if ($line =~ /$Type\s+(?:inline|__always_inline)\b/ ||
918 $line =~ /\b(?:inline|always_inline)\s+$Storage/) {
919 print "inline keyword should sit between storage class and type\n";
920 print "$herecurr";
921 $clean = 0;
922 }
848 } 923 }
849 924
850 if ($chk_patch && !$is_patch) { 925 if ($chk_patch && !$is_patch) {