diff options
Diffstat (limited to 'scripts/checkpatch.pl')
| -rwxr-xr-x | scripts/checkpatch.pl | 395 |
1 files changed, 287 insertions, 108 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index cbb42580a81d..579f50fa838c 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.11'; | 12 | my $V = '0.12'; |
| 13 | 13 | ||
| 14 | use Getopt::Long qw(:config no_auto_abbrev); | 14 | use Getopt::Long qw(:config no_auto_abbrev); |
| 15 | 15 | ||
| @@ -19,8 +19,11 @@ my $chk_signoff = 1; | |||
| 19 | my $chk_patch = 1; | 19 | my $chk_patch = 1; |
| 20 | my $tst_type = 0; | 20 | my $tst_type = 0; |
| 21 | my $emacs = 0; | 21 | my $emacs = 0; |
| 22 | my $terse = 0; | ||
| 22 | my $file = 0; | 23 | my $file = 0; |
| 23 | my $check = 0; | 24 | my $check = 0; |
| 25 | my $summary = 1; | ||
| 26 | my $mailback = 0; | ||
| 24 | my $root; | 27 | my $root; |
| 25 | GetOptions( | 28 | GetOptions( |
| 26 | 'q|quiet+' => \$quiet, | 29 | 'q|quiet+' => \$quiet, |
| @@ -29,10 +32,13 @@ GetOptions( | |||
| 29 | 'patch!' => \$chk_patch, | 32 | 'patch!' => \$chk_patch, |
| 30 | 'test-type!' => \$tst_type, | 33 | 'test-type!' => \$tst_type, |
| 31 | 'emacs!' => \$emacs, | 34 | 'emacs!' => \$emacs, |
| 35 | 'terse!' => \$terse, | ||
| 32 | 'file!' => \$file, | 36 | 'file!' => \$file, |
| 33 | 'subjective!' => \$check, | 37 | 'subjective!' => \$check, |
| 34 | 'strict!' => \$check, | 38 | 'strict!' => \$check, |
| 35 | 'root=s' => \$root, | 39 | 'root=s' => \$root, |
| 40 | 'summary!' => \$summary, | ||
| 41 | 'mailback!' => \$mailback, | ||
| 36 | ) or exit; | 42 | ) or exit; |
| 37 | 43 | ||
| 38 | my $exit = 0; | 44 | my $exit = 0; |
| @@ -42,6 +48,7 @@ if ($#ARGV < 0) { | |||
| 42 | print "version: $V\n"; | 48 | print "version: $V\n"; |
| 43 | print "options: -q => quiet\n"; | 49 | print "options: -q => quiet\n"; |
| 44 | print " --no-tree => run without a kernel tree\n"; | 50 | print " --no-tree => run without a kernel tree\n"; |
| 51 | print " --terse => one line per report\n"; | ||
| 45 | print " --emacs => emacs compile window format\n"; | 52 | print " --emacs => emacs compile window format\n"; |
| 46 | print " --file => check a source file\n"; | 53 | print " --file => check a source file\n"; |
| 47 | print " --strict => enable more subjective tests\n"; | 54 | print " --strict => enable more subjective tests\n"; |
| @@ -49,6 +56,11 @@ if ($#ARGV < 0) { | |||
| 49 | exit(1); | 56 | exit(1); |
| 50 | } | 57 | } |
| 51 | 58 | ||
| 59 | if ($terse) { | ||
| 60 | $emacs = 1; | ||
| 61 | $quiet++; | ||
| 62 | } | ||
| 63 | |||
| 52 | if ($tree) { | 64 | if ($tree) { |
| 53 | if (defined $root) { | 65 | if (defined $root) { |
| 54 | if (!top_of_kernel_tree($root)) { | 66 | if (!top_of_kernel_tree($root)) { |
| @@ -90,41 +102,6 @@ our $Attribute = qr{ | |||
| 90 | __(?:mem|cpu|dev|)(?:initdata|init) | 102 | __(?:mem|cpu|dev|)(?:initdata|init) |
| 91 | }x; | 103 | }x; |
| 92 | our $Inline = qr{inline|__always_inline|noinline}; | 104 | our $Inline = qr{inline|__always_inline|noinline}; |
| 93 | our $NonptrType = qr{ | ||
| 94 | \b | ||
| 95 | (?:const\s+)? | ||
| 96 | (?:unsigned\s+)? | ||
| 97 | (?: | ||
| 98 | void| | ||
| 99 | char| | ||
| 100 | short| | ||
| 101 | int| | ||
| 102 | long| | ||
| 103 | unsigned| | ||
| 104 | float| | ||
| 105 | double| | ||
| 106 | bool| | ||
| 107 | long\s+int| | ||
| 108 | long\s+long| | ||
| 109 | long\s+long\s+int| | ||
| 110 | (?:__)?(?:u|s|be|le)(?:8|16|32|64)| | ||
| 111 | struct\s+$Ident| | ||
| 112 | union\s+$Ident| | ||
| 113 | enum\s+$Ident| | ||
| 114 | ${Ident}_t| | ||
| 115 | ${Ident}_handler| | ||
| 116 | ${Ident}_handler_fn | ||
| 117 | ) | ||
| 118 | (?:\s+$Sparse)* | ||
| 119 | \b | ||
| 120 | }x; | ||
| 121 | |||
| 122 | our $Type = qr{ | ||
| 123 | \b$NonptrType\b | ||
| 124 | (?:\s*\*+\s*const|\s*\*+|(?:\s*\[\s*\])+)? | ||
| 125 | (?:\s+$Sparse|\s+$Attribute)* | ||
| 126 | }x; | ||
| 127 | our $Declare = qr{(?:$Storage\s+)?$Type}; | ||
| 128 | our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; | 105 | our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; |
| 129 | our $Lval = qr{$Ident(?:$Member)*}; | 106 | our $Lval = qr{$Ident(?:$Member)*}; |
| 130 | 107 | ||
| @@ -136,7 +113,50 @@ our $Operators = qr{ | |||
| 136 | &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/ | 113 | &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/ |
| 137 | }x; | 114 | }x; |
| 138 | 115 | ||
| 139 | our $Bare = ''; | 116 | our $NonptrType; |
| 117 | our $Type; | ||
| 118 | our $Declare; | ||
| 119 | |||
| 120 | our @typeList = ( | ||
| 121 | qr{void}, | ||
| 122 | qr{char}, | ||
| 123 | qr{short}, | ||
| 124 | qr{int}, | ||
| 125 | qr{long}, | ||
| 126 | qr{unsigned}, | ||
| 127 | qr{float}, | ||
| 128 | qr{double}, | ||
| 129 | qr{bool}, | ||
| 130 | qr{long\s+int}, | ||
| 131 | qr{long\s+long}, | ||
| 132 | qr{long\s+long\s+int}, | ||
| 133 | qr{(?:__)?(?:u|s|be|le)(?:8|16|32|64)}, | ||
| 134 | qr{struct\s+$Ident}, | ||
| 135 | qr{union\s+$Ident}, | ||
| 136 | qr{enum\s+$Ident}, | ||
| 137 | qr{${Ident}_t}, | ||
| 138 | qr{${Ident}_handler}, | ||
| 139 | qr{${Ident}_handler_fn}, | ||
| 140 | ); | ||
| 141 | |||
| 142 | sub build_types { | ||
| 143 | my $all = "(?: \n" . join("|\n ", @typeList) . "\n)"; | ||
| 144 | $NonptrType = qr{ | ||
| 145 | \b | ||
| 146 | (?:const\s+)? | ||
| 147 | (?:unsigned\s+)? | ||
| 148 | $all | ||
| 149 | (?:\s+$Sparse|\s+const)* | ||
| 150 | \b | ||
| 151 | }x; | ||
| 152 | $Type = qr{ | ||
| 153 | \b$NonptrType\b | ||
| 154 | (?:\s*\*+\s*const|\s*\*+|(?:\s*\[\s*\])+)? | ||
| 155 | (?:\s+$Sparse|\s+$Attribute)* | ||
| 156 | }x; | ||
| 157 | $Declare = qr{(?:$Storage\s+)?$Type}; | ||
| 158 | } | ||
| 159 | build_types(); | ||
| 140 | 160 | ||
| 141 | $chk_signoff = 0 if ($file); | 161 | $chk_signoff = 0 if ($file); |
| 142 | 162 | ||
| @@ -278,6 +298,81 @@ sub sanitise_line { | |||
| 278 | return $res; | 298 | return $res; |
| 279 | } | 299 | } |
| 280 | 300 | ||
| 301 | sub ctx_statement_block { | ||
| 302 | my ($linenr, $remain, $off) = @_; | ||
| 303 | my $line = $linenr - 1; | ||
| 304 | my $blk = ''; | ||
| 305 | my $soff = $off; | ||
| 306 | my $coff = $off - 1; | ||
| 307 | |||
| 308 | my $type = ''; | ||
| 309 | my $level = 0; | ||
| 310 | my $c; | ||
| 311 | my $len = 0; | ||
| 312 | while (1) { | ||
| 313 | #warn "CSB: blk<$blk>\n"; | ||
| 314 | # If we are about to drop off the end, pull in more | ||
| 315 | # context. | ||
| 316 | if ($off >= $len) { | ||
| 317 | for (; $remain > 0; $line++) { | ||
| 318 | next if ($rawlines[$line] =~ /^-/); | ||
| 319 | $remain--; | ||
| 320 | $blk .= sanitise_line($rawlines[$line]) . "\n"; | ||
| 321 | $len = length($blk); | ||
| 322 | $line++; | ||
| 323 | last; | ||
| 324 | } | ||
| 325 | # Bail if there is no further context. | ||
| 326 | #warn "CSB: blk<$blk> off<$off> len<$len>\n"; | ||
| 327 | if ($off == $len) { | ||
| 328 | last; | ||
| 329 | } | ||
| 330 | } | ||
| 331 | $c = substr($blk, $off, 1); | ||
| 332 | |||
| 333 | #warn "CSB: c<$c> type<$type> level<$level>\n"; | ||
| 334 | # Statement ends at the ';' or a close '}' at the | ||
| 335 | # outermost level. | ||
| 336 | if ($level == 0 && $c eq ';') { | ||
| 337 | last; | ||
| 338 | } | ||
| 339 | |||
| 340 | if (($type eq '' || $type eq '(') && $c eq '(') { | ||
| 341 | $level++; | ||
| 342 | $type = '('; | ||
| 343 | } | ||
| 344 | if ($type eq '(' && $c eq ')') { | ||
| 345 | $level--; | ||
| 346 | $type = ($level != 0)? '(' : ''; | ||
| 347 | |||
| 348 | if ($level == 0 && $coff < $soff) { | ||
| 349 | $coff = $off; | ||
| 350 | } | ||
| 351 | } | ||
| 352 | if (($type eq '' || $type eq '{') && $c eq '{') { | ||
| 353 | $level++; | ||
| 354 | $type = '{'; | ||
| 355 | } | ||
| 356 | if ($type eq '{' && $c eq '}') { | ||
| 357 | $level--; | ||
| 358 | $type = ($level != 0)? '{' : ''; | ||
| 359 | |||
| 360 | if ($level == 0) { | ||
| 361 | last; | ||
| 362 | } | ||
| 363 | } | ||
| 364 | $off++; | ||
| 365 | } | ||
| 366 | |||
| 367 | my $statement = substr($blk, $soff, $off - $soff + 1); | ||
| 368 | my $condition = substr($blk, $soff, $coff - $soff + 1); | ||
| 369 | |||
| 370 | #warn "STATEMENT<$statement>\n"; | ||
| 371 | #warn "CONDITION<$condition>\n"; | ||
| 372 | |||
| 373 | return ($statement, $condition); | ||
| 374 | } | ||
| 375 | |||
| 281 | sub ctx_block_get { | 376 | sub ctx_block_get { |
| 282 | my ($linenr, $remain, $outer, $open, $close, $off) = @_; | 377 | my ($linenr, $remain, $outer, $open, $close, $off) = @_; |
| 283 | my $line; | 378 | my $line; |
| @@ -421,9 +516,6 @@ sub annotate_values { | |||
| 421 | my $paren = 0; | 516 | my $paren = 0; |
| 422 | my @paren_type; | 517 | my @paren_type; |
| 423 | 518 | ||
| 424 | # Include any user defined types we may have found as we went. | ||
| 425 | my $type_match = "(?:$Type$Bare)"; | ||
| 426 | |||
| 427 | while (length($cur)) { | 519 | while (length($cur)) { |
| 428 | print " <$type> " if ($debug); | 520 | print " <$type> " if ($debug); |
| 429 | if ($cur =~ /^(\s+)/o) { | 521 | if ($cur =~ /^(\s+)/o) { |
| @@ -433,7 +525,7 @@ sub annotate_values { | |||
| 433 | $type = 'N'; | 525 | $type = 'N'; |
| 434 | } | 526 | } |
| 435 | 527 | ||
| 436 | } elsif ($cur =~ /^($type_match)/) { | 528 | } elsif ($cur =~ /^($Type)/) { |
| 437 | print "DECLARE($1)\n" if ($debug); | 529 | print "DECLARE($1)\n" if ($debug); |
| 438 | $type = 'T'; | 530 | $type = 'T'; |
| 439 | 531 | ||
| @@ -457,7 +549,7 @@ sub annotate_values { | |||
| 457 | } | 549 | } |
| 458 | $type = 'N'; | 550 | $type = 'N'; |
| 459 | 551 | ||
| 460 | } elsif ($cur =~ /^(if|while|typeof)\b/o) { | 552 | } elsif ($cur =~ /^(if|while|typeof|for)\b/o) { |
| 461 | print "COND($1)\n" if ($debug); | 553 | print "COND($1)\n" if ($debug); |
| 462 | $paren_type[$paren] = 'N'; | 554 | $paren_type[$paren] = 'N'; |
| 463 | $type = 'N'; | 555 | $type = 'N'; |
| @@ -515,11 +607,30 @@ sub annotate_values { | |||
| 515 | return $res; | 607 | return $res; |
| 516 | } | 608 | } |
| 517 | 609 | ||
| 610 | sub possible { | ||
| 611 | my ($possible) = @_; | ||
| 612 | |||
| 613 | #print "CHECK<$possible>\n"; | ||
| 614 | if ($possible !~ /^(?:$Storage|$Type|DEFINE_\S+)$/ && | ||
| 615 | $possible ne 'goto' && $possible ne 'return' && | ||
| 616 | $possible ne 'struct' && $possible ne 'enum' && | ||
| 617 | $possible ne 'case' && $possible ne 'else' && | ||
| 618 | $possible ne 'typedef') { | ||
| 619 | #print "POSSIBLE<$possible>\n"; | ||
| 620 | push(@typeList, $possible); | ||
| 621 | build_types(); | ||
| 622 | } | ||
| 623 | } | ||
| 624 | |||
| 518 | my $prefix = ''; | 625 | my $prefix = ''; |
| 519 | 626 | ||
| 520 | my @report = (); | 627 | my @report = (); |
| 521 | sub report { | 628 | sub report { |
| 522 | push(@report, $prefix . $_[0]); | 629 | my $line = $prefix . $_[0]; |
| 630 | |||
| 631 | $line = (split('\n', $line))[0] . "\n" if ($terse); | ||
| 632 | |||
| 633 | push(@report, $line); | ||
| 523 | } | 634 | } |
| 524 | sub report_dump { | 635 | sub report_dump { |
| 525 | @report; | 636 | @report; |
| @@ -574,9 +685,6 @@ sub process { | |||
| 574 | 685 | ||
| 575 | my $prev_values = 'N'; | 686 | my $prev_values = 'N'; |
| 576 | 687 | ||
| 577 | # Possible bare types. | ||
| 578 | my @bare = (); | ||
| 579 | |||
| 580 | # Pre-scan the patch looking for any __setup documentation. | 688 | # Pre-scan the patch looking for any __setup documentation. |
| 581 | my @setup_docs = (); | 689 | my @setup_docs = (); |
| 582 | my $setup_docs = 0; | 690 | my $setup_docs = 0; |
| @@ -631,21 +739,35 @@ sub process { | |||
| 631 | $realline++; | 739 | $realline++; |
| 632 | $realcnt-- if ($realcnt != 0); | 740 | $realcnt-- if ($realcnt != 0); |
| 633 | 741 | ||
| 634 | # track any sort of multi-line comment. Obviously if | 742 | # Guestimate if this is a continuing comment. Run |
| 635 | # the added text or context do not include the whole | 743 | # the context looking for a comment "edge". If this |
| 636 | # comment we will not see it. Such is life. | 744 | # edge is a close comment then we must be in a comment |
| 637 | # | 745 | # at context start. |
| 746 | if ($linenr == $first_line) { | ||
| 747 | my $edge; | ||
| 748 | for (my $ln = $first_line; $ln < ($linenr + $realcnt); $ln++) { | ||
| 749 | ($edge) = ($lines[$ln - 1] =~ m@(/\*|\*/)@); | ||
| 750 | last if (defined $edge); | ||
| 751 | } | ||
| 752 | if (defined $edge && $edge eq '*/') { | ||
| 753 | $in_comment = 1; | ||
| 754 | } | ||
| 755 | } | ||
| 756 | |||
| 638 | # Guestimate if this is a continuing comment. If this | 757 | # Guestimate if this is a continuing comment. If this |
| 639 | # is the start of a diff block and this line starts | 758 | # is the start of a diff block and this line starts |
| 640 | # ' *' then it is very likely a comment. | 759 | # ' *' then it is very likely a comment. |
| 641 | if ($linenr == $first_line and $line =~ m@^.\s*\*@) { | 760 | if ($linenr == $first_line and $line =~ m@^.\s*\*@) { |
| 642 | $in_comment = 1; | 761 | $in_comment = 1; |
| 643 | } | 762 | } |
| 644 | if ($line =~ m@/\*@) { | 763 | |
| 645 | $in_comment = 1; | 764 | # Find the last comment edge on _this_ line. |
| 646 | } | 765 | while (($line =~ m@(/\*|\*/)@g)) { |
| 647 | if ($line =~ m@\*/@) { | 766 | if ($1 eq '/*') { |
| 648 | $in_comment = 0; | 767 | $in_comment = 1; |
| 768 | } else { | ||
| 769 | $in_comment = 0; | ||
| 770 | } | ||
| 649 | } | 771 | } |
| 650 | 772 | ||
| 651 | # Measure the line length and indent. | 773 | # Measure the line length and indent. |
| @@ -687,7 +809,7 @@ sub process { | |||
| 687 | } | 809 | } |
| 688 | 810 | ||
| 689 | # Check for wrappage within a valid hunk of the file | 811 | # Check for wrappage within a valid hunk of the file |
| 690 | if ($realcnt != 0 && $line !~ m{^(?:\+|-| |$)}) { | 812 | if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) { |
| 691 | ERROR("patch seems to be corrupt (line wrapped?)\n" . | 813 | ERROR("patch seems to be corrupt (line wrapped?)\n" . |
| 692 | $herecurr) if (!$emitted_corrupt++); | 814 | $herecurr) if (!$emitted_corrupt++); |
| 693 | } | 815 | } |
| @@ -727,6 +849,11 @@ sub process { | |||
| 727 | WARN("line over 80 characters\n" . $herecurr); | 849 | WARN("line over 80 characters\n" . $herecurr); |
| 728 | } | 850 | } |
| 729 | 851 | ||
| 852 | # check for adding lines without a newline. | ||
| 853 | if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) { | ||
| 854 | WARN("adding a line without newline at end of file\n" . $herecurr); | ||
| 855 | } | ||
| 856 | |||
| 730 | # check we are in a valid source file *.[hc] if not then ignore this hunk | 857 | # check we are in a valid source file *.[hc] if not then ignore this hunk |
| 731 | next if ($realfile !~ /\.[hc]$/); | 858 | next if ($realfile !~ /\.[hc]$/); |
| 732 | 859 | ||
| @@ -752,30 +879,41 @@ sub process { | |||
| 752 | 879 | ||
| 753 | # Check for potential 'bare' types | 880 | # Check for potential 'bare' types |
| 754 | if ($realcnt && | 881 | if ($realcnt && |
| 755 | $line !~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?$Type\b/ && | ||
| 756 | $line !~ /$Ident:\s*$/ && | 882 | $line !~ /$Ident:\s*$/ && |
| 757 | $line !~ /^.\s*$Ident\s*\(/ && | 883 | ($line =~ /^.\s*$Ident\s*\(\*+\s*$Ident\)\s*\(/ || |
| 758 | # definitions in global scope can only start with types | 884 | $line !~ /^.\s*$Ident\s*\(/)) { |
| 759 | ($line =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?($Ident)\b/ || | 885 | # definitions in global scope can only start with types |
| 760 | # declarations always start with types | 886 | if ($line =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b/) { |
| 761 | $line =~ /^.\s*(?:$Storage\s+)?($Ident)\b\s*\**\s*$Ident\s*(?:;|=)/) || | 887 | possible($1); |
| 762 | # any (foo ... *) is a pointer cast, and foo is a type | 888 | |
| 763 | $line =~ /\(($Ident)(?:\s+$Sparse)*\s*\*+\s*\)/) { | 889 | # declarations always start with types |
| 764 | my $possible = $1; | 890 | } elsif ($prev_values eq 'N' && $line =~ /^.\s*(?:$Storage\s+)?($Ident)\b\s*\**\s*$Ident\s*(?:;|=)/) { |
| 765 | if ($possible !~ /^(?:$Storage|$Type|DEFINE_\S+)$/ && | 891 | possible($1); |
| 766 | $possible ne 'goto' && $possible ne 'return' && | 892 | |
| 767 | $possible ne 'struct' && $possible ne 'enum' && | 893 | # any (foo ... *) is a pointer cast, and foo is a type |
| 768 | $possible ne 'case' && $possible ne 'else' && | 894 | } elsif ($line =~ /\(($Ident)(?:\s+$Sparse)*\s*\*+\s*\)/) { |
| 769 | $possible ne 'typedef') { | 895 | possible($1); |
| 770 | #print "POSSIBLE<$possible>\n"; | 896 | } |
| 771 | push(@bare, $possible); | 897 | |
| 772 | my $bare = join("|", @bare); | 898 | # Check for any sort of function declaration. |
| 773 | $Bare = '|' . qr{ | 899 | # int foo(something bar, other baz); |
| 774 | \b(?:$bare)\b | 900 | # void (*store_gdt)(x86_descr_ptr *); |
| 775 | (?:\s*\*+\s*const|\s*\*+|(?:\s*\[\s*\])+)? | 901 | if ($prev_values eq 'N' && $line =~ /^(.(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/) { |
| 776 | (?:\s+$Sparse)* | 902 | my ($name_len) = length($1); |
| 777 | }x; | 903 | my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, $name_len); |
| 904 | my $ctx = join("\n", @ctx); | ||
| 905 | |||
| 906 | $ctx =~ s/\n.//; | ||
| 907 | substr($ctx, 0, $name_len + 1) = ''; | ||
| 908 | $ctx =~ s/\)[^\)]*$//; | ||
| 909 | for my $arg (split(/\s*,\s*/, $ctx)) { | ||
| 910 | if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/ || $arg =~ /^($Ident)$/) { | ||
| 911 | |||
| 912 | possible($1); | ||
| 913 | } | ||
| 914 | } | ||
| 778 | } | 915 | } |
| 916 | |||
| 779 | } | 917 | } |
| 780 | 918 | ||
| 781 | # | 919 | # |
| @@ -935,6 +1073,10 @@ sub process { | |||
| 935 | # $clean = 0; | 1073 | # $clean = 0; |
| 936 | # } | 1074 | # } |
| 937 | 1075 | ||
| 1076 | if ($line =~ /\bLINUX_VERSION_CODE\b/) { | ||
| 1077 | WARN("LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged" . $herecurr); | ||
| 1078 | } | ||
| 1079 | |||
| 938 | # printk should use KERN_* levels. Note that follow on printk's on the | 1080 | # printk should use KERN_* levels. Note that follow on printk's on the |
| 939 | # same line do not need a level, so we use the current block context | 1081 | # same line do not need a level, so we use the current block context |
| 940 | # to try and find and validate the current printk. In summary the current | 1082 | # to try and find and validate the current printk. In summary the current |
| @@ -965,6 +1107,12 @@ sub process { | |||
| 965 | ERROR("open brace '{' following function declarations go on the next line\n" . $herecurr); | 1107 | ERROR("open brace '{' following function declarations go on the next line\n" . $herecurr); |
| 966 | } | 1108 | } |
| 967 | 1109 | ||
| 1110 | # open braces for enum, union and struct go on the same line. | ||
| 1111 | if ($line =~ /^.\s*{/ && | ||
| 1112 | $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) { | ||
| 1113 | ERROR("open brace '{' following $1 go on the same line\n" . $hereprev); | ||
| 1114 | } | ||
| 1115 | |||
| 968 | # check for spaces between functions and their parentheses. | 1116 | # check for spaces between functions and their parentheses. |
| 969 | while ($line =~ /($Ident)\s+\(/g) { | 1117 | while ($line =~ /($Ident)\s+\(/g) { |
| 970 | if ($1 !~ /^(?:if|for|while|switch|return|volatile|__volatile__|__attribute__|format|__extension__|Copyright|case)$/ && | 1118 | if ($1 !~ /^(?:if|for|while|switch|return|volatile|__volatile__|__attribute__|format|__extension__|Copyright|case)$/ && |
| @@ -1172,9 +1320,27 @@ sub process { | |||
| 1172 | } | 1320 | } |
| 1173 | 1321 | ||
| 1174 | # Check for illegal assignment in if conditional. | 1322 | # Check for illegal assignment in if conditional. |
| 1175 | if ($line=~/\bif\s*\(.*[^<>!=]=[^=]/) { | 1323 | if ($line =~ /\bif\s*\(/) { |
| 1176 | #next if ($line=~/\".*\Q$op\E.*\"/ or $line=~/\'\Q$op\E\'/); | 1324 | my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); |
| 1177 | ERROR("do not use assignment in if condition\n" . $herecurr); | 1325 | |
| 1326 | if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/) { | ||
| 1327 | ERROR("do not use assignment in if condition ($c)\n" . $herecurr); | ||
| 1328 | } | ||
| 1329 | |||
| 1330 | # Find out what is on the end of the line after the | ||
| 1331 | # conditional. | ||
| 1332 | substr($s, 0, length($c)) = ''; | ||
| 1333 | $s =~ s/\n.*//g; | ||
| 1334 | |||
| 1335 | if (length($c) && $s !~ /^\s*({|;|\/\*.*\*\/)?\s*\\*\s*$/) { | ||
| 1336 | ERROR("trailing statements should be on next line\n" . $herecurr); | ||
| 1337 | } | ||
| 1338 | } | ||
| 1339 | |||
| 1340 | # if and else should not have general statements after it | ||
| 1341 | if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/ && | ||
| 1342 | $1 !~ /^\s*(?:\sif|{|\\|$)/) { | ||
| 1343 | ERROR("trailing statements should be on next line\n" . $herecurr); | ||
| 1178 | } | 1344 | } |
| 1179 | 1345 | ||
| 1180 | # Check for }<nl>else {, these must be at the same | 1346 | # Check for }<nl>else {, these must be at the same |
| @@ -1205,12 +1371,6 @@ sub process { | |||
| 1205 | } | 1371 | } |
| 1206 | } | 1372 | } |
| 1207 | 1373 | ||
| 1208 | # if and else should not have general statements after it | ||
| 1209 | if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/ && | ||
| 1210 | $1 !~ /^\s*(?:\sif|{|\\|$)/) { | ||
| 1211 | ERROR("trailing statements should be on next line\n" . $herecurr); | ||
| 1212 | } | ||
| 1213 | |||
| 1214 | # multi-statement macros should be enclosed in a do while loop, grab the | 1374 | # multi-statement macros should be enclosed in a do while loop, grab the |
| 1215 | # first statement and ensure its the whole macro if its not enclosed | 1375 | # first statement and ensure its the whole macro if its not enclosed |
| 1216 | # in a known goot container | 1376 | # in a known goot container |
| @@ -1233,6 +1393,10 @@ sub process { | |||
| 1233 | $off = length($1); | 1393 | $off = length($1); |
| 1234 | $ln--; | 1394 | $ln--; |
| 1235 | $cnt++; | 1395 | $cnt++; |
| 1396 | while ($lines[$ln - 1] =~ /^-/) { | ||
| 1397 | $ln--; | ||
| 1398 | $cnt++; | ||
| 1399 | } | ||
| 1236 | } | 1400 | } |
| 1237 | my @ctx = ctx_statement($ln, $cnt, $off); | 1401 | my @ctx = ctx_statement($ln, $cnt, $off); |
| 1238 | my $ctx_ln = $ln + $#ctx + 1; | 1402 | my $ctx_ln = $ln + $#ctx + 1; |
| @@ -1268,25 +1432,23 @@ sub process { | |||
| 1268 | if ($lines[$nr - 1] =~ /{\s*$/) { | 1432 | if ($lines[$nr - 1] =~ /{\s*$/) { |
| 1269 | my ($lvl, @block) = ctx_block_level($nr, $cnt); | 1433 | my ($lvl, @block) = ctx_block_level($nr, $cnt); |
| 1270 | 1434 | ||
| 1271 | my $stmt = join(' ', @block); | 1435 | my $stmt = join("\n", @block); |
| 1272 | $stmt =~ s/(^[^{]*){//; | 1436 | # Drop the diff line leader. |
| 1437 | $stmt =~ s/\n./\n/g; | ||
| 1438 | # Drop the code outside the block. | ||
| 1439 | $stmt =~ s/(^[^{]*){\s*//; | ||
| 1273 | my $before = $1; | 1440 | my $before = $1; |
| 1274 | $stmt =~ s/}([^}]*$)//; | 1441 | $stmt =~ s/\s*}([^}]*$)//; |
| 1275 | my $after = $1; | 1442 | my $after = $1; |
| 1276 | 1443 | ||
| 1277 | #print "block<" . join(' ', @block) . "><" . scalar(@block) . ">\n"; | 1444 | #print "block<" . join(' ', @block) . "><" . scalar(@block) . ">\n"; |
| 1278 | #print "stmt<$stmt>\n\n"; | 1445 | #print "stmt<$stmt>\n\n"; |
| 1279 | 1446 | ||
| 1280 | # Count the ;'s if there is fewer than two | 1447 | # Count the newlines, if there is only one |
| 1281 | # then there can only be one statement, | 1448 | # then the block should not have {}'s. |
| 1282 | # if there is a brace inside we cannot | 1449 | my @lines = ($stmt =~ /\n/g); |
| 1283 | # trivially detect if its one statement. | 1450 | #print "lines<" . scalar(@lines) . ">\n"; |
| 1284 | # Also nested if's often require braces to | 1451 | if ($lvl == 0 && scalar(@lines) == 0 && |
| 1285 | # disambiguate the else binding so shhh there. | ||
| 1286 | my @semi = ($stmt =~ /;/g); | ||
| 1287 | push(@semi, "/**/") if ($stmt =~ m@/\*@); | ||
| 1288 | ##print "semi<" . scalar(@semi) . ">\n"; | ||
| 1289 | if ($lvl == 0 && scalar(@semi) < 2 && | ||
| 1290 | $stmt !~ /{/ && $stmt !~ /\bif\b/ && | 1452 | $stmt !~ /{/ && $stmt !~ /\bif\b/ && |
| 1291 | $before !~ /}/ && $after !~ /{/) { | 1453 | $before !~ /}/ && $after !~ /{/) { |
| 1292 | my $herectx = "$here\n" . join("\n", @control, @block[1 .. $#block]) . "\n"; | 1454 | my $herectx = "$here\n" . join("\n", @control, @block[1 .. $#block]) . "\n"; |
| @@ -1372,6 +1534,11 @@ sub process { | |||
| 1372 | ERROR("inline keyword should sit between storage class and type\n" . $herecurr); | 1534 | ERROR("inline keyword should sit between storage class and type\n" . $herecurr); |
| 1373 | } | 1535 | } |
| 1374 | 1536 | ||
| 1537 | # Check for __inline__ and __inline, prefer inline | ||
| 1538 | if ($line =~ /\b(__inline__|__inline)\b/) { | ||
| 1539 | WARN("plain inline is preferred over $1\n" . $herecurr); | ||
| 1540 | } | ||
| 1541 | |||
| 1375 | # check for new externs in .c files. | 1542 | # check for new externs in .c files. |
| 1376 | if ($line =~ /^.\s*extern\s/ && ($realfile =~ /\.c$/)) { | 1543 | if ($line =~ /^.\s*extern\s/ && ($realfile =~ /\.c$/)) { |
| 1377 | WARN("externs should be avoided in .c files\n" . $herecurr); | 1544 | WARN("externs should be avoided in .c files\n" . $herecurr); |
| @@ -1392,21 +1559,33 @@ sub process { | |||
| 1392 | } | 1559 | } |
| 1393 | } | 1560 | } |
| 1394 | 1561 | ||
| 1395 | if ($chk_patch && !$is_patch) { | 1562 | # In mailback mode only produce a report in the negative, for |
| 1563 | # things that appear to be patches. | ||
| 1564 | if ($mailback && ($clean == 1 || !$is_patch)) { | ||
| 1565 | exit(0); | ||
| 1566 | } | ||
| 1567 | |||
| 1568 | # This is not a patch, and we are are in 'no-patch' mode so | ||
| 1569 | # just keep quiet. | ||
| 1570 | if (!$chk_patch && !$is_patch) { | ||
| 1571 | exit(0); | ||
| 1572 | } | ||
| 1573 | |||
| 1574 | if (!$is_patch) { | ||
| 1396 | ERROR("Does not appear to be a unified-diff format patch\n"); | 1575 | ERROR("Does not appear to be a unified-diff format patch\n"); |
| 1397 | } | 1576 | } |
| 1398 | if ($is_patch && $chk_signoff && $signoff == 0) { | 1577 | if ($is_patch && $chk_signoff && $signoff == 0) { |
| 1399 | ERROR("Missing Signed-off-by: line(s)\n"); | 1578 | ERROR("Missing Signed-off-by: line(s)\n"); |
| 1400 | } | 1579 | } |
| 1401 | 1580 | ||
| 1402 | if ($clean == 0 && ($chk_patch || $is_patch)) { | 1581 | print report_dump(); |
| 1403 | print report_dump(); | 1582 | if ($summary) { |
| 1404 | if ($quiet < 2) { | 1583 | print "total: $cnt_error errors, $cnt_warn warnings, " . |
| 1405 | print "total: $cnt_error errors, $cnt_warn warnings, " . | 1584 | (($check)? "$cnt_chk checks, " : "") . |
| 1406 | (($check)? "$cnt_chk checks, " : "") . | 1585 | "$cnt_lines lines checked\n"; |
| 1407 | "$cnt_lines lines checked\n"; | 1586 | print "\n" if ($quiet == 0); |
| 1408 | } | ||
| 1409 | } | 1587 | } |
| 1588 | |||
| 1410 | if ($clean == 1 && $quiet == 0) { | 1589 | if ($clean == 1 && $quiet == 0) { |
| 1411 | print "Your patch has no obvious style problems and is ready for submission.\n" | 1590 | print "Your patch has no obvious style problems and is ready for submission.\n" |
| 1412 | } | 1591 | } |
