diff options
Diffstat (limited to 'scripts')
-rwxr-xr-x | scripts/checkpatch.pl | 463 |
1 files changed, 279 insertions, 184 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 2a7cef9726e4..58a94947d655 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.15'; | 12 | my $V = '0.16'; |
13 | 13 | ||
14 | use Getopt::Long qw(:config no_auto_abbrev); | 14 | use Getopt::Long qw(:config no_auto_abbrev); |
15 | 15 | ||
@@ -18,6 +18,7 @@ my $tree = 1; | |||
18 | my $chk_signoff = 1; | 18 | 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 $tst_only; | ||
21 | my $emacs = 0; | 22 | my $emacs = 0; |
22 | my $terse = 0; | 23 | my $terse = 0; |
23 | my $file = 0; | 24 | my $file = 0; |
@@ -44,6 +45,7 @@ GetOptions( | |||
44 | 45 | ||
45 | 'debug=s' => \%debug, | 46 | 'debug=s' => \%debug, |
46 | 'test-type!' => \$tst_type, | 47 | 'test-type!' => \$tst_type, |
48 | 'test-only=s' => \$tst_only, | ||
47 | ) or exit; | 49 | ) or exit; |
48 | 50 | ||
49 | my $exit = 0; | 51 | my $exit = 0; |
@@ -263,17 +265,7 @@ sub expand_tabs { | |||
263 | return $res; | 265 | return $res; |
264 | } | 266 | } |
265 | sub copy_spacing { | 267 | sub copy_spacing { |
266 | my ($str) = @_; | 268 | (my $res = shift) =~ tr/\t/ /c; |
267 | |||
268 | my $res = ''; | ||
269 | for my $c (split(//, $str)) { | ||
270 | if ($c eq "\t") { | ||
271 | $res .= $c; | ||
272 | } else { | ||
273 | $res .= ' '; | ||
274 | } | ||
275 | } | ||
276 | |||
277 | return $res; | 269 | return $res; |
278 | } | 270 | } |
279 | 271 | ||
@@ -290,53 +282,76 @@ sub line_stats { | |||
290 | return (length($line), length($white)); | 282 | return (length($line), length($white)); |
291 | } | 283 | } |
292 | 284 | ||
285 | my $sanitise_quote = ''; | ||
286 | |||
287 | sub sanitise_line_reset { | ||
288 | my ($in_comment) = @_; | ||
289 | |||
290 | if ($in_comment) { | ||
291 | $sanitise_quote = '*/'; | ||
292 | } else { | ||
293 | $sanitise_quote = ''; | ||
294 | } | ||
295 | } | ||
293 | sub sanitise_line { | 296 | sub sanitise_line { |
294 | my ($line) = @_; | 297 | my ($line) = @_; |
295 | 298 | ||
296 | my $res = ''; | 299 | my $res = ''; |
297 | my $l = ''; | 300 | my $l = ''; |
298 | 301 | ||
299 | my $quote = ''; | ||
300 | my $qlen = 0; | 302 | my $qlen = 0; |
303 | my $off = 0; | ||
304 | my $c; | ||
301 | 305 | ||
302 | foreach my $c (split(//, $line)) { | 306 | # Always copy over the diff marker. |
303 | # The second backslash of a pair is not a "quote". | 307 | $res = substr($line, 0, 1); |
304 | if ($l eq "\\" && $c eq "\\") { | 308 | |
305 | $c = 'X'; | 309 | for ($off = 1; $off < length($line); $off++) { |
306 | } | 310 | $c = substr($line, $off, 1); |
307 | if ($l ne "\\" && ($c eq "'" || $c eq '"')) { | 311 | |
308 | if ($quote eq '') { | 312 | # Comments we are wacking completly including the begin |
309 | $quote = $c; | 313 | # and end, all to $;. |
310 | $res .= $c; | 314 | if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') { |
311 | $l = $c; | 315 | $sanitise_quote = '*/'; |
312 | $qlen = 0; | 316 | |
313 | next; | 317 | substr($res, $off, 2, "$;$;"); |
314 | } elsif ($quote eq $c) { | 318 | $off++; |
315 | $quote = ''; | 319 | next; |
316 | } | ||
317 | } | 320 | } |
318 | if ($quote eq "'" && $qlen > 1) { | 321 | if (substr($line, $off, 2) eq $sanitise_quote) { |
319 | $quote = ''; | 322 | $sanitise_quote = ''; |
323 | substr($res, $off, 2, "$;$;"); | ||
324 | $off++; | ||
325 | next; | ||
320 | } | 326 | } |
321 | if ($quote && $c ne "\t") { | 327 | |
322 | $res .= "X"; | 328 | # A \ in a string means ignore the next character. |
323 | $qlen++; | 329 | if (($sanitise_quote eq "'" || $sanitise_quote eq '"') && |
324 | } else { | 330 | $c eq "\\") { |
325 | $res .= $c; | 331 | substr($res, $off, 2, 'XX'); |
332 | $off++; | ||
333 | next; | ||
326 | } | 334 | } |
335 | # Regular quotes. | ||
336 | if ($c eq "'" || $c eq '"') { | ||
337 | if ($sanitise_quote eq '') { | ||
338 | $sanitise_quote = $c; | ||
327 | 339 | ||
328 | $l = $c; | 340 | substr($res, $off, 1, $c); |
329 | } | 341 | next; |
342 | } elsif ($sanitise_quote eq $c) { | ||
343 | $sanitise_quote = ''; | ||
344 | } | ||
345 | } | ||
330 | 346 | ||
331 | # Clear out the comments. | 347 | #print "SQ:$sanitise_quote\n"; |
332 | while ($res =~ m@(/\*.*?\*/)@g) { | 348 | if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") { |
333 | substr($res, $-[1], $+[1] - $-[1]) = $; x ($+[1] - $-[1]); | 349 | substr($res, $off, 1, $;); |
334 | } | 350 | } elsif ($off != 0 && $sanitise_quote && $c ne "\t") { |
335 | if ($res =~ m@(/\*.*)@) { | 351 | substr($res, $off, 1, 'X'); |
336 | substr($res, $-[1], $+[1] - $-[1]) = $; x ($+[1] - $-[1]); | 352 | } else { |
337 | } | 353 | substr($res, $off, 1, $c); |
338 | if ($res =~ m@^.(.*\*/)@) { | 354 | } |
339 | substr($res, $-[1], $+[1] - $-[1]) = $; x ($+[1] - $-[1]); | ||
340 | } | 355 | } |
341 | 356 | ||
342 | # The pathname on a #include may be surrounded by '<' and '>'. | 357 | # The pathname on a #include may be surrounded by '<' and '>'. |
@@ -359,6 +374,7 @@ sub ctx_statement_block { | |||
359 | my $blk = ''; | 374 | my $blk = ''; |
360 | my $soff = $off; | 375 | my $soff = $off; |
361 | my $coff = $off - 1; | 376 | my $coff = $off - 1; |
377 | my $coff_set = 0; | ||
362 | 378 | ||
363 | my $loff = 0; | 379 | my $loff = 0; |
364 | 380 | ||
@@ -370,7 +386,7 @@ sub ctx_statement_block { | |||
370 | 386 | ||
371 | my $remainder; | 387 | my $remainder; |
372 | while (1) { | 388 | while (1) { |
373 | #warn "CSB: blk<$blk>\n"; | 389 | #warn "CSB: blk<$blk> remain<$remain>\n"; |
374 | # If we are about to drop off the end, pull in more | 390 | # If we are about to drop off the end, pull in more |
375 | # context. | 391 | # context. |
376 | if ($off >= $len) { | 392 | if ($off >= $len) { |
@@ -393,7 +409,7 @@ sub ctx_statement_block { | |||
393 | $c = substr($blk, $off, 1); | 409 | $c = substr($blk, $off, 1); |
394 | $remainder = substr($blk, $off); | 410 | $remainder = substr($blk, $off); |
395 | 411 | ||
396 | #warn "CSB: c<$c> type<$type> level<$level>\n"; | 412 | #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n"; |
397 | # Statement ends at the ';' or a close '}' at the | 413 | # Statement ends at the ';' or a close '}' at the |
398 | # outermost level. | 414 | # outermost level. |
399 | if ($level == 0 && $c eq ';') { | 415 | if ($level == 0 && $c eq ';') { |
@@ -401,10 +417,14 @@ sub ctx_statement_block { | |||
401 | } | 417 | } |
402 | 418 | ||
403 | # An else is really a conditional as long as its not else if | 419 | # An else is really a conditional as long as its not else if |
404 | if ($level == 0 && (!defined($p) || $p =~ /(?:\s|\})/) && | 420 | if ($level == 0 && $coff_set == 0 && |
405 | $remainder =~ /(else)(?:\s|{)/ && | 421 | (!defined($p) || $p =~ /(?:\s|\}|\+)/) && |
406 | $remainder !~ /else\s+if\b/) { | 422 | $remainder =~ /^(else)(?:\s|{)/ && |
407 | $coff = $off + length($1); | 423 | $remainder !~ /^else\s+if\b/) { |
424 | $coff = $off + length($1) - 1; | ||
425 | $coff_set = 1; | ||
426 | #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n"; | ||
427 | #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n"; | ||
408 | } | 428 | } |
409 | 429 | ||
410 | if (($type eq '' || $type eq '(') && $c eq '(') { | 430 | if (($type eq '' || $type eq '(') && $c eq '(') { |
@@ -417,6 +437,8 @@ sub ctx_statement_block { | |||
417 | 437 | ||
418 | if ($level == 0 && $coff < $soff) { | 438 | if ($level == 0 && $coff < $soff) { |
419 | $coff = $off; | 439 | $coff = $off; |
440 | $coff_set = 1; | ||
441 | #warn "CSB: mark coff<$coff>\n"; | ||
420 | } | 442 | } |
421 | } | 443 | } |
422 | if (($type eq '' || $type eq '{') && $c eq '{') { | 444 | if (($type eq '' || $type eq '{') && $c eq '{') { |
@@ -444,7 +466,7 @@ sub ctx_statement_block { | |||
444 | #warn "STATEMENT<$statement>\n"; | 466 | #warn "STATEMENT<$statement>\n"; |
445 | #warn "CONDITION<$condition>\n"; | 467 | #warn "CONDITION<$condition>\n"; |
446 | 468 | ||
447 | #print "off<$off> loff<$loff>\n"; | 469 | #print "coff<$coff> soff<$off> loff<$loff>\n"; |
448 | 470 | ||
449 | return ($statement, $condition, | 471 | return ($statement, $condition, |
450 | $line, $remain + 1, $off - $loff + 1, $level); | 472 | $line, $remain + 1, $off - $loff + 1, $level); |
@@ -502,7 +524,7 @@ sub ctx_statement_full { | |||
502 | # Grab the first conditional/block pair. | 524 | # Grab the first conditional/block pair. |
503 | ($statement, $condition, $linenr, $remain, $off, $level) = | 525 | ($statement, $condition, $linenr, $remain, $off, $level) = |
504 | ctx_statement_block($linenr, $remain, $off); | 526 | ctx_statement_block($linenr, $remain, $off); |
505 | #print "F: c<$condition> s<$statement>\n"; | 527 | #print "F: c<$condition> s<$statement> remain<$remain>\n"; |
506 | push(@chunks, [ $condition, $statement ]); | 528 | push(@chunks, [ $condition, $statement ]); |
507 | if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) { | 529 | if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) { |
508 | return ($level, $linenr, @chunks); | 530 | return ($level, $linenr, @chunks); |
@@ -514,7 +536,7 @@ sub ctx_statement_full { | |||
514 | ($statement, $condition, $linenr, $remain, $off, $level) = | 536 | ($statement, $condition, $linenr, $remain, $off, $level) = |
515 | ctx_statement_block($linenr, $remain, $off); | 537 | ctx_statement_block($linenr, $remain, $off); |
516 | #print "C: c<$condition> s<$statement> remain<$remain>\n"; | 538 | #print "C: c<$condition> s<$statement> remain<$remain>\n"; |
517 | last if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:else|do)\b/s)); | 539 | last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s)); |
518 | #print "C: push\n"; | 540 | #print "C: push\n"; |
519 | push(@chunks, [ $condition, $statement ]); | 541 | push(@chunks, [ $condition, $statement ]); |
520 | } | 542 | } |
@@ -668,6 +690,7 @@ sub annotate_values { | |||
668 | print "$stream\n" if ($dbg_values > 1); | 690 | print "$stream\n" if ($dbg_values > 1); |
669 | 691 | ||
670 | while (length($cur)) { | 692 | while (length($cur)) { |
693 | @av_paren_type = ('E') if ($#av_paren_type < 0); | ||
671 | print " <" . join('', @av_paren_type) . | 694 | print " <" . join('', @av_paren_type) . |
672 | "> <$type> " if ($dbg_values > 1); | 695 | "> <$type> " if ($dbg_values > 1); |
673 | if ($cur =~ /^(\s+)/o) { | 696 | if ($cur =~ /^(\s+)/o) { |
@@ -804,28 +827,34 @@ sub possible { | |||
804 | my $prefix = ''; | 827 | my $prefix = ''; |
805 | 828 | ||
806 | sub report { | 829 | sub report { |
830 | if (defined $tst_only && $_[0] !~ /\Q$tst_only\E/) { | ||
831 | return 0; | ||
832 | } | ||
807 | my $line = $prefix . $_[0]; | 833 | my $line = $prefix . $_[0]; |
808 | 834 | ||
809 | $line = (split('\n', $line))[0] . "\n" if ($terse); | 835 | $line = (split('\n', $line))[0] . "\n" if ($terse); |
810 | 836 | ||
811 | push(our @report, $line); | 837 | push(our @report, $line); |
838 | |||
839 | return 1; | ||
812 | } | 840 | } |
813 | sub report_dump { | 841 | sub report_dump { |
814 | our @report; | 842 | our @report; |
815 | } | 843 | } |
816 | sub ERROR { | 844 | sub ERROR { |
817 | report("ERROR: $_[0]\n"); | 845 | if (report("ERROR: $_[0]\n")) { |
818 | our $clean = 0; | 846 | our $clean = 0; |
819 | our $cnt_error++; | 847 | our $cnt_error++; |
848 | } | ||
820 | } | 849 | } |
821 | sub WARN { | 850 | sub WARN { |
822 | report("WARNING: $_[0]\n"); | 851 | if (report("WARNING: $_[0]\n")) { |
823 | our $clean = 0; | 852 | our $clean = 0; |
824 | our $cnt_warn++; | 853 | our $cnt_warn++; |
854 | } | ||
825 | } | 855 | } |
826 | sub CHK { | 856 | sub CHK { |
827 | if ($check) { | 857 | if ($check && report("CHECK: $_[0]\n")) { |
828 | report("CHECK: $_[0]\n"); | ||
829 | our $clean = 0; | 858 | our $clean = 0; |
830 | our $cnt_chk++; | 859 | our $cnt_chk++; |
831 | } | 860 | } |
@@ -867,30 +896,76 @@ sub process { | |||
867 | my $prev_values = 'E'; | 896 | my $prev_values = 'E'; |
868 | 897 | ||
869 | # suppression flags | 898 | # suppression flags |
870 | my $suppress_ifbraces = 0; | 899 | my %suppress_ifbraces; |
871 | 900 | ||
872 | # Pre-scan the patch sanitizing the lines. | 901 | # Pre-scan the patch sanitizing the lines. |
873 | # Pre-scan the patch looking for any __setup documentation. | 902 | # Pre-scan the patch looking for any __setup documentation. |
874 | # | 903 | # |
875 | my @setup_docs = (); | 904 | my @setup_docs = (); |
876 | my $setup_docs = 0; | 905 | my $setup_docs = 0; |
906 | |||
907 | sanitise_line_reset(); | ||
877 | my $line; | 908 | my $line; |
878 | foreach my $rawline (@rawlines) { | 909 | foreach my $rawline (@rawlines) { |
879 | # Standardise the strings and chars within the input to | 910 | $linenr++; |
880 | # simplify matching. | 911 | $line = $rawline; |
881 | $line = sanitise_line($rawline); | ||
882 | push(@lines, $line); | ||
883 | |||
884 | ##print "==>$rawline\n"; | ||
885 | ##print "-->$line\n"; | ||
886 | 912 | ||
887 | if ($line=~/^\+\+\+\s+(\S+)/) { | 913 | if ($rawline=~/^\+\+\+\s+(\S+)/) { |
888 | $setup_docs = 0; | 914 | $setup_docs = 0; |
889 | if ($1 =~ m@Documentation/kernel-parameters.txt$@) { | 915 | if ($1 =~ m@Documentation/kernel-parameters.txt$@) { |
890 | $setup_docs = 1; | 916 | $setup_docs = 1; |
891 | } | 917 | } |
892 | next; | 918 | #next; |
919 | } | ||
920 | if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { | ||
921 | $realline=$1-1; | ||
922 | if (defined $2) { | ||
923 | $realcnt=$3+1; | ||
924 | } else { | ||
925 | $realcnt=1+1; | ||
926 | } | ||
927 | |||
928 | # Guestimate if this is a continuing comment. Run | ||
929 | # the context looking for a comment "edge". If this | ||
930 | # edge is a close comment then we must be in a comment | ||
931 | # at context start. | ||
932 | my $edge; | ||
933 | for (my $ln = $linenr; $ln < ($linenr + $realcnt); $ln++) { | ||
934 | next if ($line =~ /^-/); | ||
935 | ($edge) = ($rawlines[$ln - 1] =~ m@(/\*|\*/)@); | ||
936 | last if (defined $edge); | ||
937 | } | ||
938 | if (defined $edge && $edge eq '*/') { | ||
939 | $in_comment = 1; | ||
940 | } | ||
941 | |||
942 | # Guestimate if this is a continuing comment. If this | ||
943 | # is the start of a diff block and this line starts | ||
944 | # ' *' then it is very likely a comment. | ||
945 | if (!defined $edge && | ||
946 | $rawlines[$linenr] =~ m@^.\s* \*(?:\s|$)@) | ||
947 | { | ||
948 | $in_comment = 1; | ||
949 | } | ||
950 | |||
951 | ##print "COMMENT:$in_comment edge<$edge> $rawline\n"; | ||
952 | sanitise_line_reset($in_comment); | ||
953 | |||
954 | } elsif ($realcnt) { | ||
955 | # Standardise the strings and chars within the input to | ||
956 | # simplify matching. | ||
957 | $line = sanitise_line($rawline); | ||
893 | } | 958 | } |
959 | push(@lines, $line); | ||
960 | |||
961 | if ($realcnt > 1) { | ||
962 | $realcnt-- if ($line =~ /^(?:\+| |$)/); | ||
963 | } else { | ||
964 | $realcnt = 0; | ||
965 | } | ||
966 | |||
967 | #print "==>$rawline\n"; | ||
968 | #print "-->$line\n"; | ||
894 | 969 | ||
895 | if ($setup_docs && $line =~ /^\+/) { | 970 | if ($setup_docs && $line =~ /^\+/) { |
896 | push(@setup_docs, $line); | 971 | push(@setup_docs, $line); |
@@ -899,23 +974,17 @@ sub process { | |||
899 | 974 | ||
900 | $prefix = ''; | 975 | $prefix = ''; |
901 | 976 | ||
977 | $realcnt = 0; | ||
978 | $linenr = 0; | ||
902 | foreach my $line (@lines) { | 979 | foreach my $line (@lines) { |
903 | $linenr++; | 980 | $linenr++; |
904 | 981 | ||
905 | my $rawline = $rawlines[$linenr - 1]; | 982 | my $rawline = $rawlines[$linenr - 1]; |
906 | 983 | ||
907 | #extract the filename as it passes | ||
908 | if ($line=~/^\+\+\+\s+(\S+)/) { | ||
909 | $realfile=$1; | ||
910 | $realfile =~ s@^[^/]*/@@; | ||
911 | $in_comment = 0; | ||
912 | next; | ||
913 | } | ||
914 | #extract the line range in the file after the patch is applied | 984 | #extract the line range in the file after the patch is applied |
915 | if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { | 985 | if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { |
916 | $is_patch = 1; | 986 | $is_patch = 1; |
917 | $first_line = $linenr + 1; | 987 | $first_line = $linenr + 1; |
918 | $in_comment = 0; | ||
919 | $realline=$1-1; | 988 | $realline=$1-1; |
920 | if (defined $2) { | 989 | if (defined $2) { |
921 | $realcnt=$3+1; | 990 | $realcnt=$3+1; |
@@ -925,50 +994,16 @@ sub process { | |||
925 | annotate_reset(); | 994 | annotate_reset(); |
926 | $prev_values = 'E'; | 995 | $prev_values = 'E'; |
927 | 996 | ||
928 | $suppress_ifbraces = $linenr - 1; | 997 | %suppress_ifbraces = (); |
929 | next; | 998 | next; |
930 | } | ||
931 | 999 | ||
932 | # track the line number as we move through the hunk, note that | 1000 | # track the line number as we move through the hunk, note that |
933 | # new versions of GNU diff omit the leading space on completely | 1001 | # new versions of GNU diff omit the leading space on completely |
934 | # blank context lines so we need to count that too. | 1002 | # blank context lines so we need to count that too. |
935 | if ($line =~ /^( |\+|$)/) { | 1003 | } elsif ($line =~ /^( |\+|$)/) { |
936 | $realline++; | 1004 | $realline++; |
937 | $realcnt-- if ($realcnt != 0); | 1005 | $realcnt-- if ($realcnt != 0); |
938 | 1006 | ||
939 | # Guestimate if this is a continuing comment. Run | ||
940 | # the context looking for a comment "edge". If this | ||
941 | # edge is a close comment then we must be in a comment | ||
942 | # at context start. | ||
943 | if ($linenr == $first_line) { | ||
944 | my $edge; | ||
945 | for (my $ln = $first_line; $ln < ($linenr + $realcnt); $ln++) { | ||
946 | ($edge) = ($rawlines[$ln - 1] =~ m@(/\*|\*/)@); | ||
947 | last if (defined $edge); | ||
948 | } | ||
949 | if (defined $edge && $edge eq '*/') { | ||
950 | $in_comment = 1; | ||
951 | } | ||
952 | } | ||
953 | |||
954 | # Guestimate if this is a continuing comment. If this | ||
955 | # is the start of a diff block and this line starts | ||
956 | # ' *' then it is very likely a comment. | ||
957 | if ($linenr == $first_line and $rawline =~ m@^.\s* \*(?:\s|$)@) { | ||
958 | $in_comment = 1; | ||
959 | } | ||
960 | |||
961 | # Find the last comment edge on _this_ line. | ||
962 | $comment_edge = 0; | ||
963 | while (($rawline =~ m@(/\*|\*/)@g)) { | ||
964 | if ($1 eq '/*') { | ||
965 | $in_comment = 1; | ||
966 | } else { | ||
967 | $in_comment = 0; | ||
968 | } | ||
969 | $comment_edge = 1; | ||
970 | } | ||
971 | |||
972 | # Measure the line length and indent. | 1007 | # Measure the line length and indent. |
973 | ($length, $indent) = line_stats($rawline); | 1008 | ($length, $indent) = line_stats($rawline); |
974 | 1009 | ||
@@ -977,23 +1012,36 @@ sub process { | |||
977 | ($previndent, $stashindent) = ($stashindent, $indent); | 1012 | ($previndent, $stashindent) = ($stashindent, $indent); |
978 | ($prevrawline, $stashrawline) = ($stashrawline, $rawline); | 1013 | ($prevrawline, $stashrawline) = ($stashrawline, $rawline); |
979 | 1014 | ||
980 | #warn "ic<$in_comment> ce<$comment_edge> line<$line>\n"; | 1015 | #warn "line<$line>\n"; |
981 | 1016 | ||
982 | } elsif ($realcnt == 1) { | 1017 | } elsif ($realcnt == 1) { |
983 | $realcnt--; | 1018 | $realcnt--; |
984 | } | 1019 | } |
985 | 1020 | ||
986 | #make up the handle for any error we report on this line | 1021 | #make up the handle for any error we report on this line |
1022 | $prefix = "$filename:$realline: " if ($emacs && $file); | ||
1023 | $prefix = "$filename:$linenr: " if ($emacs && !$file); | ||
1024 | |||
987 | $here = "#$linenr: " if (!$file); | 1025 | $here = "#$linenr: " if (!$file); |
988 | $here = "#$realline: " if ($file); | 1026 | $here = "#$realline: " if ($file); |
1027 | |||
1028 | # extract the filename as it passes | ||
1029 | if ($line=~/^\+\+\+\s+(\S+)/) { | ||
1030 | $realfile = $1; | ||
1031 | $realfile =~ s@^[^/]*/@@; | ||
1032 | |||
1033 | if ($realfile =~ m@include/asm/@) { | ||
1034 | ERROR("do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n"); | ||
1035 | } | ||
1036 | next; | ||
1037 | } | ||
1038 | |||
989 | $here .= "FILE: $realfile:$realline:" if ($realcnt != 0); | 1039 | $here .= "FILE: $realfile:$realline:" if ($realcnt != 0); |
990 | 1040 | ||
991 | my $hereline = "$here\n$rawline\n"; | 1041 | my $hereline = "$here\n$rawline\n"; |
992 | my $herecurr = "$here\n$rawline\n"; | 1042 | my $herecurr = "$here\n$rawline\n"; |
993 | my $hereprev = "$here\n$prevrawline\n$rawline\n"; | 1043 | my $hereprev = "$here\n$prevrawline\n$rawline\n"; |
994 | 1044 | ||
995 | $prefix = "$filename:$realline: " if ($emacs && $file); | ||
996 | $prefix = "$filename:$linenr: " if ($emacs && !$file); | ||
997 | $cnt_lines++ if ($realcnt != 0); | 1045 | $cnt_lines++ if ($realcnt != 0); |
998 | 1046 | ||
999 | #check the patch for a signoff: | 1047 | #check the patch for a signoff: |
@@ -1005,7 +1053,7 @@ sub process { | |||
1005 | $herecurr); | 1053 | $herecurr); |
1006 | } | 1054 | } |
1007 | if ($line =~ /^\s*signed-off-by:\S/i) { | 1055 | if ($line =~ /^\s*signed-off-by:\S/i) { |
1008 | WARN("need space after Signed-off-by:\n" . | 1056 | WARN("space required after Signed-off-by:\n" . |
1009 | $herecurr); | 1057 | $herecurr); |
1010 | } | 1058 | } |
1011 | } | 1059 | } |
@@ -1072,11 +1120,6 @@ sub process { | |||
1072 | WARN("CVS style keyword markers, these will _not_ be updated\n". $herecurr); | 1120 | WARN("CVS style keyword markers, these will _not_ be updated\n". $herecurr); |
1073 | } | 1121 | } |
1074 | 1122 | ||
1075 | # The rest of our checks refer specifically to C style | ||
1076 | # only apply those _outside_ comments. Only skip | ||
1077 | # lines in the middle of comments. | ||
1078 | next if (!$comment_edge && $in_comment); | ||
1079 | |||
1080 | # Check for potential 'bare' types | 1123 | # Check for potential 'bare' types |
1081 | if ($realcnt) { | 1124 | if ($realcnt) { |
1082 | my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); | 1125 | my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); |
@@ -1110,7 +1153,7 @@ sub process { | |||
1110 | my ($name_len) = length($1); | 1153 | my ($name_len) = length($1); |
1111 | 1154 | ||
1112 | my $ctx = $s; | 1155 | my $ctx = $s; |
1113 | substr($ctx, 0, $name_len + 1) = ''; | 1156 | substr($ctx, 0, $name_len + 1, ''); |
1114 | $ctx =~ s/\)[^\)]*$//; | 1157 | $ctx =~ s/\)[^\)]*$//; |
1115 | 1158 | ||
1116 | for my $arg (split(/\s*,\s*/, $ctx)) { | 1159 | for my $arg (split(/\s*,\s*/, $ctx)) { |
@@ -1151,27 +1194,33 @@ sub process { | |||
1151 | 1194 | ||
1152 | # if/while/etc brace do not go on next line, unless defining a do while loop, | 1195 | # if/while/etc brace do not go on next line, unless defining a do while loop, |
1153 | # or if that brace on the next line is for something else | 1196 | # or if that brace on the next line is for something else |
1154 | if ($line =~ /\b(?:(if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.#/) { | 1197 | if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.#/) { |
1198 | my $pre_ctx = "$1$2"; | ||
1199 | |||
1155 | my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); | 1200 | my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); |
1156 | my $ctx_ln = $linenr + $#ctx + 1; | 1201 | my $ctx_ln = $linenr + $#ctx + 1; |
1157 | my $ctx_cnt = $realcnt - $#ctx - 1; | 1202 | my $ctx_cnt = $realcnt - $#ctx - 1; |
1158 | my $ctx = join("\n", @ctx); | 1203 | my $ctx = join("\n", @ctx); |
1159 | 1204 | ||
1205 | ##warn "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n"; | ||
1206 | |||
1160 | # Skip over any removed lines in the context following statement. | 1207 | # Skip over any removed lines in the context following statement. |
1161 | while ($ctx_cnt > 0 && $lines[$ctx_ln - 1] =~ /^-/) { | 1208 | while (defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^-/) { |
1162 | $ctx_ln++; | 1209 | $ctx_ln++; |
1163 | $ctx_cnt--; | ||
1164 | } | 1210 | } |
1165 | ##warn "line<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>"; | 1211 | ##warn "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n"; |
1166 | 1212 | ||
1167 | if ($ctx !~ /{\s*/ && $ctx_cnt > 0 && $lines[$ctx_ln - 1] =~ /^\+\s*{/) { | 1213 | if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) { |
1168 | ERROR("That open brace { should be on the previous line\n" . | 1214 | ERROR("that open brace { should be on the previous line\n" . |
1169 | "$here\n$ctx\n$lines[$ctx_ln - 1]"); | 1215 | "$here\n$ctx\n$lines[$ctx_ln - 1]"); |
1170 | } | 1216 | } |
1171 | if ($level == 0 && $ctx =~ /\)\s*\;\s*$/ && defined $lines[$ctx_ln - 1]) { | 1217 | if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ && |
1218 | $ctx =~ /\)\s*\;\s*$/ && | ||
1219 | defined $lines[$ctx_ln - 1]) | ||
1220 | { | ||
1172 | my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]); | 1221 | my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]); |
1173 | if ($nindent > $indent) { | 1222 | if ($nindent > $indent) { |
1174 | WARN("Trailing semicolon indicates no statements, indent implies otherwise\n" . | 1223 | WARN("trailing semicolon indicates no statements, indent implies otherwise\n" . |
1175 | "$here\n$ctx\n$lines[$ctx_ln - 1]"); | 1224 | "$here\n$ctx\n$lines[$ctx_ln - 1]"); |
1176 | } | 1225 | } |
1177 | } | 1226 | } |
@@ -1200,7 +1249,7 @@ sub process { | |||
1200 | # check for initialisation to aggregates open brace on the next line | 1249 | # check for initialisation to aggregates open brace on the next line |
1201 | if ($prevline =~ /$Declare\s*$Ident\s*=\s*$/ && | 1250 | if ($prevline =~ /$Declare\s*$Ident\s*=\s*$/ && |
1202 | $line =~ /^.\s*{/) { | 1251 | $line =~ /^.\s*{/) { |
1203 | ERROR("That open brace { should be on the previous line\n" . $hereprev); | 1252 | ERROR("that open brace { should be on the previous line\n" . $hereprev); |
1204 | } | 1253 | } |
1205 | 1254 | ||
1206 | # | 1255 | # |
@@ -1325,22 +1374,31 @@ sub process { | |||
1325 | # check for spaces between functions and their parentheses. | 1374 | # check for spaces between functions and their parentheses. |
1326 | while ($line =~ /($Ident)\s+\(/g) { | 1375 | while ($line =~ /($Ident)\s+\(/g) { |
1327 | my $name = $1; | 1376 | my $name = $1; |
1328 | my $ctx = substr($line, 0, $-[1]); | 1377 | my $ctx_before = substr($line, 0, $-[1]); |
1378 | my $ctx = "$ctx_before$name"; | ||
1329 | 1379 | ||
1330 | # Ignore those directives where spaces _are_ permitted. | 1380 | # Ignore those directives where spaces _are_ permitted. |
1331 | if ($name =~ /^(?:if|for|while|switch|return|volatile|__volatile__|__attribute__|format|__extension__|Copyright|case|__asm__)$/) { | 1381 | if ($name =~ /^(?: |
1382 | if|for|while|switch|return|case| | ||
1383 | volatile|__volatile__| | ||
1384 | __attribute__|format|__extension__| | ||
1385 | asm|__asm__)$/x) | ||
1386 | { | ||
1332 | 1387 | ||
1333 | # cpp #define statements have non-optional spaces, ie | 1388 | # cpp #define statements have non-optional spaces, ie |
1334 | # if there is a space between the name and the open | 1389 | # if there is a space between the name and the open |
1335 | # parenthesis it is simply not a parameter group. | 1390 | # parenthesis it is simply not a parameter group. |
1336 | } elsif ($ctx =~ /^.\#\s*define\s*$/) { | 1391 | } elsif ($ctx_before =~ /^.\#\s*define\s*$/) { |
1392 | |||
1393 | # cpp #elif statement condition may start with a ( | ||
1394 | } elsif ($ctx =~ /^.\#\s*elif\s*$/) { | ||
1337 | 1395 | ||
1338 | # If this whole things ends with a type its most | 1396 | # If this whole things ends with a type its most |
1339 | # likely a typedef for a function. | 1397 | # likely a typedef for a function. |
1340 | } elsif ("$ctx$name" =~ /$Type$/) { | 1398 | } elsif ($ctx =~ /$Type$/) { |
1341 | 1399 | ||
1342 | } else { | 1400 | } else { |
1343 | WARN("no space between function name and open parenthesis '('\n" . $herecurr); | 1401 | WARN("space prohibited between function name and open parenthesis '('\n" . $herecurr); |
1344 | } | 1402 | } |
1345 | } | 1403 | } |
1346 | # Check operator spacing. | 1404 | # Check operator spacing. |
@@ -1359,13 +1417,21 @@ sub process { | |||
1359 | for (my $n = 0; $n < $#elements; $n += 2) { | 1417 | for (my $n = 0; $n < $#elements; $n += 2) { |
1360 | $off += length($elements[$n]); | 1418 | $off += length($elements[$n]); |
1361 | 1419 | ||
1420 | # Pick up the preceeding and succeeding characters. | ||
1421 | my $ca = substr($opline, 0, $off); | ||
1422 | my $cc = ''; | ||
1423 | if (length($opline) >= ($off + length($elements[$n + 1]))) { | ||
1424 | $cc = substr($opline, $off + length($elements[$n + 1])); | ||
1425 | } | ||
1426 | my $cb = "$ca$;$cc"; | ||
1427 | |||
1362 | my $a = ''; | 1428 | my $a = ''; |
1363 | $a = 'V' if ($elements[$n] ne ''); | 1429 | $a = 'V' if ($elements[$n] ne ''); |
1364 | $a = 'W' if ($elements[$n] =~ /\s$/); | 1430 | $a = 'W' if ($elements[$n] =~ /\s$/); |
1365 | $a = 'C' if ($elements[$n] =~ /$;$/); | 1431 | $a = 'C' if ($elements[$n] =~ /$;$/); |
1366 | $a = 'B' if ($elements[$n] =~ /(\[|\()$/); | 1432 | $a = 'B' if ($elements[$n] =~ /(\[|\()$/); |
1367 | $a = 'O' if ($elements[$n] eq ''); | 1433 | $a = 'O' if ($elements[$n] eq ''); |
1368 | $a = 'E' if ($elements[$n] eq '' && $n == 0); | 1434 | $a = 'E' if ($ca =~ /^\s*$/); |
1369 | 1435 | ||
1370 | my $op = $elements[$n + 1]; | 1436 | my $op = $elements[$n + 1]; |
1371 | 1437 | ||
@@ -1381,14 +1447,6 @@ sub process { | |||
1381 | $c = 'E'; | 1447 | $c = 'E'; |
1382 | } | 1448 | } |
1383 | 1449 | ||
1384 | # Pick up the preceeding and succeeding characters. | ||
1385 | my $ca = substr($opline, 0, $off); | ||
1386 | my $cc = ''; | ||
1387 | if (length($opline) >= ($off + length($elements[$n + 1]))) { | ||
1388 | $cc = substr($opline, $off + length($elements[$n + 1])); | ||
1389 | } | ||
1390 | my $cb = "$ca$;$cc"; | ||
1391 | |||
1392 | my $ctx = "${a}x${c}"; | 1450 | my $ctx = "${a}x${c}"; |
1393 | 1451 | ||
1394 | my $at = "(ctx:$ctx)"; | 1452 | my $at = "(ctx:$ctx)"; |
@@ -1424,7 +1482,7 @@ sub process { | |||
1424 | } elsif ($op eq ';') { | 1482 | } elsif ($op eq ';') { |
1425 | if ($ctx !~ /.x[WEBC]/ && | 1483 | if ($ctx !~ /.x[WEBC]/ && |
1426 | $cc !~ /^\\/ && $cc !~ /^;/) { | 1484 | $cc !~ /^\\/ && $cc !~ /^;/) { |
1427 | ERROR("need space after that '$op' $at\n" . $hereptr); | 1485 | ERROR("space required after that '$op' $at\n" . $hereptr); |
1428 | } | 1486 | } |
1429 | 1487 | ||
1430 | # // is a comment | 1488 | # // is a comment |
@@ -1433,13 +1491,13 @@ sub process { | |||
1433 | # -> should have no spaces | 1491 | # -> should have no spaces |
1434 | } elsif ($op eq '->') { | 1492 | } elsif ($op eq '->') { |
1435 | if ($ctx =~ /Wx.|.xW/) { | 1493 | if ($ctx =~ /Wx.|.xW/) { |
1436 | ERROR("no spaces around that '$op' $at\n" . $hereptr); | 1494 | ERROR("spaces prohibited around that '$op' $at\n" . $hereptr); |
1437 | } | 1495 | } |
1438 | 1496 | ||
1439 | # , must have a space on the right. | 1497 | # , must have a space on the right. |
1440 | } elsif ($op eq ',') { | 1498 | } elsif ($op eq ',') { |
1441 | if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) { | 1499 | if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) { |
1442 | ERROR("need space after that '$op' $at\n" . $hereptr); | 1500 | ERROR("space required after that '$op' $at\n" . $hereptr); |
1443 | } | 1501 | } |
1444 | 1502 | ||
1445 | # '*' as part of a type definition -- reported already. | 1503 | # '*' as part of a type definition -- reported already. |
@@ -1452,21 +1510,26 @@ sub process { | |||
1452 | } elsif ($op eq '!' || $op eq '~' || | 1510 | } elsif ($op eq '!' || $op eq '~' || |
1453 | ($is_unary && ($op eq '*' || $op eq '-' || $op eq '&'))) { | 1511 | ($is_unary && ($op eq '*' || $op eq '-' || $op eq '&'))) { |
1454 | if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { | 1512 | if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { |
1455 | ERROR("need space before that '$op' $at\n" . $hereptr); | 1513 | ERROR("space required before that '$op' $at\n" . $hereptr); |
1456 | } | 1514 | } |
1457 | if ($ctx =~ /.xW/) { | 1515 | if ($ctx =~ /.xW/) { |
1458 | ERROR("no space after that '$op' $at\n" . $hereptr); | 1516 | ERROR("space prohibited after that '$op' $at\n" . $hereptr); |
1459 | } | 1517 | } |
1460 | 1518 | ||
1461 | # unary ++ and unary -- are allowed no space on one side. | 1519 | # unary ++ and unary -- are allowed no space on one side. |
1462 | } elsif ($op eq '++' or $op eq '--') { | 1520 | } elsif ($op eq '++' or $op eq '--') { |
1463 | if ($ctx !~ /[WOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) { | 1521 | if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) { |
1464 | ERROR("need space one side of that '$op' $at\n" . $hereptr); | 1522 | ERROR("space required one side of that '$op' $at\n" . $hereptr); |
1523 | } | ||
1524 | if ($ctx =~ /Wx[BE]/ || | ||
1525 | ($ctx =~ /Wx./ && $cc =~ /^;/)) { | ||
1526 | ERROR("space prohibited before that '$op' $at\n" . $hereptr); | ||
1465 | } | 1527 | } |
1466 | if ($ctx =~ /WxB/ || ($ctx =~ /Wx./ && $cc =~ /^;/)) { | 1528 | if ($ctx =~ /ExW/) { |
1467 | ERROR("no space before that '$op' $at\n" . $hereptr); | 1529 | ERROR("space prohibited after that '$op' $at\n" . $hereptr); |
1468 | } | 1530 | } |
1469 | 1531 | ||
1532 | |||
1470 | # << and >> may either have or not have spaces both sides | 1533 | # << and >> may either have or not have spaces both sides |
1471 | } elsif ($op eq '<<' or $op eq '>>' or | 1534 | } elsif ($op eq '<<' or $op eq '>>' or |
1472 | $op eq '&' or $op eq '^' or $op eq '|' or | 1535 | $op eq '&' or $op eq '^' or $op eq '|' or |
@@ -1474,7 +1537,7 @@ sub process { | |||
1474 | $op eq '*' or $op eq '/' or | 1537 | $op eq '*' or $op eq '/' or |
1475 | $op eq '%') | 1538 | $op eq '%') |
1476 | { | 1539 | { |
1477 | if ($ctx !~ /VxV|WxW|VxE|WxE|VxO|Cx.|.xC/) { | 1540 | if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) { |
1478 | ERROR("need consistent spacing around '$op' $at\n" . | 1541 | ERROR("need consistent spacing around '$op' $at\n" . |
1479 | $hereptr); | 1542 | $hereptr); |
1480 | } | 1543 | } |
@@ -1484,7 +1547,7 @@ sub process { | |||
1484 | # Ignore email addresses <foo@bar> | 1547 | # Ignore email addresses <foo@bar> |
1485 | if (!($op eq '<' && $cb =~ /$;\S+\@\S+>/) && | 1548 | if (!($op eq '<' && $cb =~ /$;\S+\@\S+>/) && |
1486 | !($op eq '>' && $cb =~ /<\S+\@\S+$;/)) { | 1549 | !($op eq '>' && $cb =~ /<\S+\@\S+$;/)) { |
1487 | ERROR("need spaces around that '$op' $at\n" . $hereptr); | 1550 | ERROR("spaces required around that '$op' $at\n" . $hereptr); |
1488 | } | 1551 | } |
1489 | } | 1552 | } |
1490 | $off += length($elements[$n + 1]); | 1553 | $off += length($elements[$n + 1]); |
@@ -1514,31 +1577,31 @@ sub process { | |||
1514 | #need space before brace following if, while, etc | 1577 | #need space before brace following if, while, etc |
1515 | if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) || | 1578 | if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) || |
1516 | $line =~ /do{/) { | 1579 | $line =~ /do{/) { |
1517 | ERROR("need a space before the open brace '{'\n" . $herecurr); | 1580 | ERROR("space required before the open brace '{'\n" . $herecurr); |
1518 | } | 1581 | } |
1519 | 1582 | ||
1520 | # closing brace should have a space following it when it has anything | 1583 | # closing brace should have a space following it when it has anything |
1521 | # on the line | 1584 | # on the line |
1522 | if ($line =~ /}(?!(?:,|;|\)))\S/) { | 1585 | if ($line =~ /}(?!(?:,|;|\)))\S/) { |
1523 | ERROR("need a space after that close brace '}'\n" . $herecurr); | 1586 | ERROR("space required after that close brace '}'\n" . $herecurr); |
1524 | } | 1587 | } |
1525 | 1588 | ||
1526 | # check spacing on square brackets | 1589 | # check spacing on square brackets |
1527 | if ($line =~ /\[\s/ && $line !~ /\[\s*$/) { | 1590 | if ($line =~ /\[\s/ && $line !~ /\[\s*$/) { |
1528 | ERROR("no space after that open square bracket '['\n" . $herecurr); | 1591 | ERROR("space prohibited after that open square bracket '['\n" . $herecurr); |
1529 | } | 1592 | } |
1530 | if ($line =~ /\s\]/) { | 1593 | if ($line =~ /\s\]/) { |
1531 | ERROR("no space before that close square bracket ']'\n" . $herecurr); | 1594 | ERROR("space prohibited before that close square bracket ']'\n" . $herecurr); |
1532 | } | 1595 | } |
1533 | 1596 | ||
1534 | # check spacing on paretheses | 1597 | # check spacing on paretheses |
1535 | if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ && | 1598 | if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ && |
1536 | $line !~ /for\s*\(\s+;/) { | 1599 | $line !~ /for\s*\(\s+;/) { |
1537 | ERROR("no space after that open parenthesis '('\n" . $herecurr); | 1600 | ERROR("space prohibited after that open parenthesis '('\n" . $herecurr); |
1538 | } | 1601 | } |
1539 | if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ && | 1602 | if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ && |
1540 | $line !~ /for\s*\(.*;\s+\)/) { | 1603 | $line !~ /for\s*\(.*;\s+\)/) { |
1541 | ERROR("no space before that close parenthesis ')'\n" . $herecurr); | 1604 | ERROR("space prohibited before that close parenthesis ')'\n" . $herecurr); |
1542 | } | 1605 | } |
1543 | 1606 | ||
1544 | #goto labels aren't indented, allow a single space however | 1607 | #goto labels aren't indented, allow a single space however |
@@ -1549,7 +1612,7 @@ sub process { | |||
1549 | 1612 | ||
1550 | # Need a space before open parenthesis after if, while etc | 1613 | # Need a space before open parenthesis after if, while etc |
1551 | if ($line=~/\b(if|while|for|switch)\(/) { | 1614 | if ($line=~/\b(if|while|for|switch)\(/) { |
1552 | ERROR("need a space before the open parenthesis '('\n" . $herecurr); | 1615 | ERROR("space required before the open parenthesis '('\n" . $herecurr); |
1553 | } | 1616 | } |
1554 | 1617 | ||
1555 | # Check for illegal assignment in if conditional. | 1618 | # Check for illegal assignment in if conditional. |
@@ -1562,10 +1625,12 @@ sub process { | |||
1562 | 1625 | ||
1563 | # Find out what is on the end of the line after the | 1626 | # Find out what is on the end of the line after the |
1564 | # conditional. | 1627 | # conditional. |
1565 | substr($s, 0, length($c)) = ''; | 1628 | substr($s, 0, length($c), ''); |
1566 | $s =~ s/\n.*//g; | 1629 | $s =~ s/\n.*//g; |
1567 | $s =~ s/$;//g; # Remove any comments | 1630 | $s =~ s/$;//g; # Remove any comments |
1568 | if (length($c) && $s !~ /^\s*({|;|)\s*\\*\s*$/) { | 1631 | if (length($c) && $s !~ /^\s*({|;|)\s*\\*\s*$/ && |
1632 | $c !~ /^.\#\s*if/) | ||
1633 | { | ||
1569 | ERROR("trailing statements should be on next line\n" . $herecurr); | 1634 | ERROR("trailing statements should be on next line\n" . $herecurr); |
1570 | } | 1635 | } |
1571 | } | 1636 | } |
@@ -1607,7 +1672,7 @@ sub process { | |||
1607 | 1672 | ||
1608 | # Find out what is on the end of the line after the | 1673 | # Find out what is on the end of the line after the |
1609 | # conditional. | 1674 | # conditional. |
1610 | substr($s, 0, length($c)) = ''; | 1675 | substr($s, 0, length($c), ''); |
1611 | $s =~ s/\n.*//g; | 1676 | $s =~ s/\n.*//g; |
1612 | 1677 | ||
1613 | if ($s =~ /^\s*;/) { | 1678 | if ($s =~ /^\s*;/) { |
@@ -1631,7 +1696,7 @@ sub process { | |||
1631 | if ($tree && $rawline =~ m{^.\#\s*include\s*\<asm\/(.*)\.h\>}) { | 1696 | if ($tree && $rawline =~ m{^.\#\s*include\s*\<asm\/(.*)\.h\>}) { |
1632 | my $checkfile = "$root/include/linux/$1.h"; | 1697 | my $checkfile = "$root/include/linux/$1.h"; |
1633 | if (-f $checkfile && $1 ne 'irq.h') { | 1698 | if (-f $checkfile && $1 ne 'irq.h') { |
1634 | CHK("Use #include <linux/$1.h> instead of <asm/$1.h>\n" . | 1699 | WARN("Use #include <linux/$1.h> instead of <asm/$1.h>\n" . |
1635 | $herecurr); | 1700 | $herecurr); |
1636 | } | 1701 | } |
1637 | } | 1702 | } |
@@ -1692,15 +1757,24 @@ sub process { | |||
1692 | if ($#chunks > 0 && $level == 0) { | 1757 | if ($#chunks > 0 && $level == 0) { |
1693 | my $allowed = 0; | 1758 | my $allowed = 0; |
1694 | my $seen = 0; | 1759 | my $seen = 0; |
1695 | my $herectx = $here . "\n";; | 1760 | my $herectx = $here . "\n"; |
1696 | my $ln = $linenr - 1; | 1761 | my $ln = $linenr - 1; |
1697 | for my $chunk (@chunks) { | 1762 | for my $chunk (@chunks) { |
1698 | my ($cond, $block) = @{$chunk}; | 1763 | my ($cond, $block) = @{$chunk}; |
1699 | 1764 | ||
1700 | $herectx .= "$rawlines[$ln]\n[...]\n"; | 1765 | # If the condition carries leading newlines, then count those as offsets. |
1766 | my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s); | ||
1767 | my $offset = statement_rawlines($whitespace) - 1; | ||
1768 | |||
1769 | #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n"; | ||
1770 | |||
1771 | # We have looked at and allowed this specific line. | ||
1772 | $suppress_ifbraces{$ln + $offset} = 1; | ||
1773 | |||
1774 | $herectx .= "$rawlines[$ln + $offset]\n[...]\n"; | ||
1701 | $ln += statement_rawlines($block) - 1; | 1775 | $ln += statement_rawlines($block) - 1; |
1702 | 1776 | ||
1703 | substr($block, 0, length($cond)) = ''; | 1777 | substr($block, 0, length($cond), ''); |
1704 | 1778 | ||
1705 | $seen++ if ($block =~ /^\s*{/); | 1779 | $seen++ if ($block =~ /^\s*{/); |
1706 | 1780 | ||
@@ -1721,16 +1795,10 @@ sub process { | |||
1721 | if ($seen && !$allowed) { | 1795 | if ($seen && !$allowed) { |
1722 | WARN("braces {} are not necessary for any arm of this statement\n" . $herectx); | 1796 | WARN("braces {} are not necessary for any arm of this statement\n" . $herectx); |
1723 | } | 1797 | } |
1724 | # Either way we have looked over this whole | ||
1725 | # statement and said what needs to be said. | ||
1726 | $suppress_ifbraces = $endln; | ||
1727 | } | 1798 | } |
1728 | } | 1799 | } |
1729 | if ($linenr > $suppress_ifbraces && | 1800 | if (!defined $suppress_ifbraces{$linenr - 1} && |
1730 | $line =~ /\b(if|while|for|else)\b/) { | 1801 | $line =~ /\b(if|while|for|else)\b/) { |
1731 | my ($level, $endln, @chunks) = | ||
1732 | ctx_statement_full($linenr, $realcnt, $-[0]); | ||
1733 | |||
1734 | my $allowed = 0; | 1802 | my $allowed = 0; |
1735 | 1803 | ||
1736 | # Check the pre-context. | 1804 | # Check the pre-context. |
@@ -1738,10 +1806,15 @@ sub process { | |||
1738 | #print "APW: ALLOWED: pre<$1>\n"; | 1806 | #print "APW: ALLOWED: pre<$1>\n"; |
1739 | $allowed = 1; | 1807 | $allowed = 1; |
1740 | } | 1808 | } |
1809 | |||
1810 | my ($level, $endln, @chunks) = | ||
1811 | ctx_statement_full($linenr, $realcnt, $-[0]); | ||
1812 | |||
1741 | # Check the condition. | 1813 | # Check the condition. |
1742 | my ($cond, $block) = @{$chunks[0]}; | 1814 | my ($cond, $block) = @{$chunks[0]}; |
1815 | #print "CHECKING<$linenr> cond<$cond> block<$block>\n"; | ||
1743 | if (defined $cond) { | 1816 | if (defined $cond) { |
1744 | substr($block, 0, length($cond)) = ''; | 1817 | substr($block, 0, length($cond), ''); |
1745 | } | 1818 | } |
1746 | if (statement_lines($cond) > 1) { | 1819 | if (statement_lines($cond) > 1) { |
1747 | #print "APW: ALLOWED: cond<$cond>\n"; | 1820 | #print "APW: ALLOWED: cond<$cond>\n"; |
@@ -1759,7 +1832,7 @@ sub process { | |||
1759 | if (defined $chunks[1]) { | 1832 | if (defined $chunks[1]) { |
1760 | my ($cond, $block) = @{$chunks[1]}; | 1833 | my ($cond, $block) = @{$chunks[1]}; |
1761 | if (defined $cond) { | 1834 | if (defined $cond) { |
1762 | substr($block, 0, length($cond)) = ''; | 1835 | substr($block, 0, length($cond), ''); |
1763 | } | 1836 | } |
1764 | if ($block =~ /^\s*\{/) { | 1837 | if ($block =~ /^\s*\{/) { |
1765 | #print "APW: ALLOWED: chunk-1 block<$block>\n"; | 1838 | #print "APW: ALLOWED: chunk-1 block<$block>\n"; |
@@ -1882,6 +1955,28 @@ sub process { | |||
1882 | if ($line =~ /__FUNCTION__/) { | 1955 | if ($line =~ /__FUNCTION__/) { |
1883 | WARN("__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr); | 1956 | WARN("__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr); |
1884 | } | 1957 | } |
1958 | |||
1959 | # check for semaphores used as mutexes | ||
1960 | if ($line =~ /\b(DECLARE_MUTEX|init_MUTEX)\s*\(/) { | ||
1961 | WARN("mutexes are preferred for single holder semaphores\n" . $herecurr); | ||
1962 | } | ||
1963 | # check for semaphores used as mutexes | ||
1964 | if ($line =~ /\binit_MUTEX_LOCKED\s*\(/) { | ||
1965 | WARN("consider using a completion\n" . $herecurr); | ||
1966 | } | ||
1967 | # recommend strict_strto* over simple_strto* | ||
1968 | if ($line =~ /\bsimple_(strto.*?)\s*\(/) { | ||
1969 | WARN("consider using strict_$1 in preference to simple_$1\n" . $herecurr); | ||
1970 | } | ||
1971 | |||
1972 | # use of NR_CPUS is usually wrong | ||
1973 | # ignore definitions of NR_CPUS and usage to define arrays as likely right | ||
1974 | if ($line =~ /\bNR_CPUS\b/ && | ||
1975 | $line !~ /^.#\s*define\s+NR_CPUS\s+/ && | ||
1976 | $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/) | ||
1977 | { | ||
1978 | WARN("usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr); | ||
1979 | } | ||
1885 | } | 1980 | } |
1886 | 1981 | ||
1887 | # If we have no input at all, then there is nothing to report on | 1982 | # If we have no input at all, then there is nothing to report on |