aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/checkpatch.pl463
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;
9my $P = $0; 9my $P = $0;
10$P =~ s@.*/@@g; 10$P =~ s@.*/@@g;
11 11
12my $V = '0.15'; 12my $V = '0.16';
13 13
14use Getopt::Long qw(:config no_auto_abbrev); 14use Getopt::Long qw(:config no_auto_abbrev);
15 15
@@ -18,6 +18,7 @@ my $tree = 1;
18my $chk_signoff = 1; 18my $chk_signoff = 1;
19my $chk_patch = 1; 19my $chk_patch = 1;
20my $tst_type = 0; 20my $tst_type = 0;
21my $tst_only;
21my $emacs = 0; 22my $emacs = 0;
22my $terse = 0; 23my $terse = 0;
23my $file = 0; 24my $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
49my $exit = 0; 51my $exit = 0;
@@ -263,17 +265,7 @@ sub expand_tabs {
263 return $res; 265 return $res;
264} 266}
265sub copy_spacing { 267sub 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
285my $sanitise_quote = '';
286
287sub sanitise_line_reset {
288 my ($in_comment) = @_;
289
290 if ($in_comment) {
291 $sanitise_quote = '*/';
292 } else {
293 $sanitise_quote = '';
294 }
295}
293sub sanitise_line { 296sub 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 {
804my $prefix = ''; 827my $prefix = '';
805 828
806sub report { 829sub 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}
813sub report_dump { 841sub report_dump {
814 our @report; 842 our @report;
815} 843}
816sub ERROR { 844sub 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}
821sub WARN { 850sub 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}
826sub CHK { 856sub 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