aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/checkpatch.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/checkpatch.pl')
-rwxr-xr-xscripts/checkpatch.pl329
1 files changed, 245 insertions, 84 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index e216d49624b7..914e45a63731 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -8,7 +8,7 @@ use strict;
8 8
9my $P = $0; 9my $P = $0;
10 10
11my $V = '0.01'; 11my $V = '0.03';
12 12
13use Getopt::Long qw(:config no_auto_abbrev); 13use Getopt::Long qw(:config no_auto_abbrev);
14 14
@@ -38,7 +38,8 @@ if ($tree && !top_of_kernel_tree()) {
38 exit(2); 38 exit(2);
39} 39}
40 40
41my @deprecated = (); 41my @dep_includes = ();
42my @dep_functions = ();
42my $removal = 'Documentation/feature-removal-schedule.txt'; 43my $removal = 'Documentation/feature-removal-schedule.txt';
43if ($tree && -f $removal) { 44if ($tree && -f $removal) {
44 open(REMOVE, "<$removal") || die "$P: $removal: open failed - $!\n"; 45 open(REMOVE, "<$removal") || die "$P: $removal: open failed - $!\n";
@@ -46,9 +47,14 @@ if ($tree && -f $removal) {
46 if (/^Files:\s+(.*\S)/) { 47 if (/^Files:\s+(.*\S)/) {
47 for my $file (split(/[, ]+/, $1)) { 48 for my $file (split(/[, ]+/, $1)) {
48 if ($file =~ m@include/(.*)@) { 49 if ($file =~ m@include/(.*)@) {
49 push(@deprecated, $1); 50 push(@dep_includes, $1);
50 } 51 }
51 } 52 }
53
54 } elsif (/^Funcs:\s+(.*\S)/) {
55 for my $func (split(/[, ]+/, $1)) {
56 push(@dep_functions, $func);
57 }
52 } 58 }
53 } 59 }
54} 60}
@@ -99,6 +105,97 @@ sub expand_tabs {
99 return $res; 105 return $res;
100} 106}
101 107
108sub line_stats {
109 my ($line) = @_;
110
111 # Drop the diff line leader and expand tabs
112 $line =~ s/^.//;
113 $line = expand_tabs($line);
114
115 # Pick the indent from the front of the line.
116 my ($white) = ($line =~ /^(\s*)/);
117
118 return (length($line), length($white));
119}
120
121sub ctx_block_get {
122 my ($linenr, $remain, $outer) = @_;
123 my $line;
124 my $start = $linenr - 1;
125 my $end = $linenr - 1 + $remain;
126 my $blk = '';
127 my @o;
128 my @c;
129 my @res = ();
130
131 for ($line = $start; $line < $end; $line++) {
132 $blk .= $lines[$line];
133
134 @o = ($blk =~ /\{/g);
135 @c = ($blk =~ /\}/g);
136
137 if (!$outer || (scalar(@o) - scalar(@c)) == 1) {
138 push(@res, $lines[$line]);
139 }
140
141 last if (scalar(@o) == scalar(@c));
142 }
143
144 return @res;
145}
146sub ctx_block_outer {
147 my ($linenr, $remain) = @_;
148
149 return ctx_block_get($linenr, $remain, 1);
150}
151sub ctx_block {
152 my ($linenr, $remain) = @_;
153
154 return ctx_block_get($linenr, $remain, 0);
155}
156
157sub ctx_locate_comment {
158 my ($first_line, $end_line) = @_;
159
160 # Catch a comment on the end of the line itself.
161 my ($current_comment) = ($lines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*$@);
162 return $current_comment if (defined $current_comment);
163
164 # Look through the context and try and figure out if there is a
165 # comment.
166 my $in_comment = 0;
167 $current_comment = '';
168 for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
169 my $line = $lines[$linenr - 1];
170 ##warn " $line\n";
171 if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
172 $in_comment = 1;
173 }
174 if ($line =~ m@/\*@) {
175 $in_comment = 1;
176 }
177 if (!$in_comment && $current_comment ne '') {
178 $current_comment = '';
179 }
180 $current_comment .= $line . "\n" if ($in_comment);
181 if ($line =~ m@\*/@) {
182 $in_comment = 0;
183 }
184 }
185
186 chomp($current_comment);
187 return($current_comment);
188}
189sub ctx_has_comment {
190 my ($first_line, $end_line) = @_;
191 my $cmt = ctx_locate_comment($first_line, $end_line);
192
193 ##print "LINE: $lines[$end_line - 1 ]\n";
194 ##print "CMMT: $cmt\n";
195
196 return ($cmt ne '');
197}
198
102sub cat_vet { 199sub cat_vet {
103 my ($vet) = @_; 200 my ($vet) = @_;
104 201
@@ -108,6 +205,10 @@ sub cat_vet {
108 return $vet; 205 return $vet;
109} 206}
110 207
208sub has_non_quoted {
209 return ($_[0] =~ m{$_[1]} and $_[0] !~ m{\".*$_[1].*\"});
210}
211
111sub process { 212sub process {
112 my $filename = shift; 213 my $filename = shift;
113 my @lines = @_; 214 my @lines = @_;
@@ -116,7 +217,7 @@ sub process {
116 my $prevline=""; 217 my $prevline="";
117 my $stashline=""; 218 my $stashline="";
118 219
119 my $lineforcounting=''; 220 my $length;
120 my $indent; 221 my $indent;
121 my $previndent=0; 222 my $previndent=0;
122 my $stashindent=0; 223 my $stashindent=0;
@@ -145,7 +246,7 @@ sub process {
145#extract the line range in the file after the patch is applied 246#extract the line range in the file after the patch is applied
146 if ($line=~/^\@\@ -\d+,\d+ \+(\d+)(,(\d+))? \@\@/) { 247 if ($line=~/^\@\@ -\d+,\d+ \+(\d+)(,(\d+))? \@\@/) {
147 $is_patch = 1; 248 $is_patch = 1;
148 $first_line = 1; 249 $first_line = $linenr + 1;
149 $in_comment = 0; 250 $in_comment = 0;
150 $realline=$1-1; 251 $realline=$1-1;
151 if (defined $2) { 252 if (defined $2) {
@@ -156,8 +257,10 @@ sub process {
156 next; 257 next;
157 } 258 }
158 259
159#track the line number as we move through the hunk 260# track the line number as we move through the hunk, note that
160 if ($line=~/^[ \+]/) { 261# new versions of GNU diff omit the leading space on completely
262# blank context lines so we need to count that too.
263 if ($line =~ /^( |\+|$)/) {
161 $realline++; 264 $realline++;
162 $realcnt-- if ($realcnt != 0); 265 $realcnt-- if ($realcnt != 0);
163 266
@@ -168,7 +271,7 @@ sub process {
168 # Guestimate if this is a continuing comment. If this 271 # Guestimate if this is a continuing comment. If this
169 # is the start of a diff block and this line starts 272 # is the start of a diff block and this line starts
170 # ' *' then it is very likely a comment. 273 # ' *' then it is very likely a comment.
171 if ($first_line and $line =~ m@^.\s*\*@) { 274 if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
172 $in_comment = 1; 275 $in_comment = 1;
173 } 276 }
174 if ($line =~ m@/\*@) { 277 if ($line =~ m@/\*@) {
@@ -178,17 +281,12 @@ sub process {
178 $in_comment = 0; 281 $in_comment = 0;
179 } 282 }
180 283
181 $lineforcounting = $line; 284 # Measure the line length and indent.
182 $lineforcounting =~ s/^\+//; 285 ($length, $indent) = line_stats($line);
183 $lineforcounting = expand_tabs($lineforcounting);
184
185 my ($white) = ($lineforcounting =~ /^(\s*)/);
186 $indent = length($white);
187 286
188 # Track the previous line. 287 # Track the previous line.
189 ($prevline, $stashline) = ($stashline, $line); 288 ($prevline, $stashline) = ($stashline, $line);
190 ($previndent, $stashindent) = ($stashindent, $indent); 289 ($previndent, $stashindent) = ($stashindent, $indent);
191 $first_line = 0;
192 } 290 }
193 291
194#make up the handle for any error we report on this line 292#make up the handle for any error we report on this line
@@ -203,6 +301,8 @@ sub process {
203 $signoff++; 301 $signoff++;
204 302
205 } elsif ($line =~ /^\s*signed-off-by:/i) { 303 } elsif ($line =~ /^\s*signed-off-by:/i) {
304 # This is a signoff, if ugly, so do not double report.
305 $signoff++;
206 if (!($line =~ /^\s*Signed-off-by:/)) { 306 if (!($line =~ /^\s*Signed-off-by:/)) {
207 print "use Signed-off-by:\n"; 307 print "use Signed-off-by:\n";
208 print "$herecurr"; 308 print "$herecurr";
@@ -229,7 +329,7 @@ sub process {
229 $clean = 0; 329 $clean = 0;
230 } 330 }
231#80 column limit 331#80 column limit
232 if (!($prevline=~/\/\*\*/) && length($lineforcounting) > 80) { 332 if (!($prevline=~/\/\*\*/) && $length > 80) {
233 print "line over 80 characters\n"; 333 print "line over 80 characters\n";
234 print "$herecurr"; 334 print "$herecurr";
235 $clean = 0; 335 $clean = 0;
@@ -254,7 +354,7 @@ sub process {
254 next if ($in_comment); 354 next if ($in_comment);
255 355
256# no C99 // comments 356# no C99 // comments
257 if ($line =~ m@//@ and !($line =~ m@\".*//.*\"@)) { 357 if (has_non_quoted($line, '//')) {
258 print "do not use C99 // comments\n"; 358 print "do not use C99 // comments\n";
259 print "$herecurr"; 359 print "$herecurr";
260 $clean = 0; 360 $clean = 0;
@@ -320,44 +420,44 @@ sub process {
320 print "$herecurr"; 420 print "$herecurr";
321 $clean = 0; 421 $clean = 0;
322 } 422 }
423 # Note we expand the line with the leading + as the real
424 # line will be displayed with the leading + and the tabs
425 # will therefore also expand that way.
323 my $opline = $line; 426 my $opline = $line;
427 $opline = expand_tabs($opline);
324 $opline =~ s/^.//; 428 $opline =~ s/^.//;
325 if (!($line=~/\#\s*include/)) { 429 if (!($line=~/\#\s*include/)) {
326 # Check operator spacing. 430 # Check operator spacing.
327 my @elements = split(/(<<=|>>=|<=|>=|==|!=|\+=|-=|\*=|\/=|%=|\^=|\|=|&=|->|<<|>>|<|>|=|!|~|&&|\|\||,|\^|\+\+|--|;|&|\||\+|-|\*|\/\/|\/)/, $opline); 431 my @elements = split(/(<<=|>>=|<=|>=|==|!=|\+=|-=|\*=|\/=|%=|\^=|\|=|&=|->|<<|>>|<|>|=|!|~|&&|\|\||,|\^|\+\+|--|;|&|\||\+|-|\*|\/\/|\/)/, $opline);
432 my $off = 1;
328 for (my $n = 0; $n < $#elements; $n += 2) { 433 for (my $n = 0; $n < $#elements; $n += 2) {
329 # $wN says we have white-space before or after 434 $off += length($elements[$n]);
330 # $sN says we have a separator before or after 435
331 # $oN says we have another operator before or after 436 my $a = '';
332 my $w1 = $elements[$n] =~ /\s$/; 437 $a = 'V' if ($elements[$n] ne '');
333 my $s1 = $elements[$n] =~ /(\[|\(|\s)$/; 438 $a = 'W' if ($elements[$n] =~ /\s$/);
334 my $o1 = $elements[$n] eq ''; 439 $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
440 $a = 'O' if ($elements[$n] eq '');
441 $a = 'E' if ($elements[$n] eq '' && $n == 0);
442
335 my $op = $elements[$n + 1]; 443 my $op = $elements[$n + 1];
336 my $w2 = 1; 444
337 my $s2 = 1; 445 my $c = '';
338 my $o2 = 0;
339 # If we have something after the operator handle it.
340 if (defined $elements[$n + 2]) { 446 if (defined $elements[$n + 2]) {
341 $w2 = $elements[$n + 2] =~ /^\s/; 447 $c = 'V' if ($elements[$n + 2] ne '');
342 $s2 = $elements[$n + 2] =~ /^(\s|\)|\]|;)/; 448 $c = 'W' if ($elements[$n + 2] =~ /^\s/);
343 $o2 = $elements[$n + 2] eq ''; 449 $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
450 $c = 'O' if ($elements[$n + 2] eq '');
451 } else {
452 $c = 'E';
344 } 453 }
345 454
346 # Generate the context. 455 my $ctx = "${a}x${c}";
347 my $at = "here: "; 456
348 for (my $m = $n; $m >= 0; $m--) { 457 my $at = "(ctx:$ctx)";
349 if ($elements[$m] ne '') { 458
350 $at .= $elements[$m]; 459 my $ptr = (" " x $off) . "^";
351 last; 460 my $hereptr = "$here\n$line\n$ptr\n\n";
352 }
353 }
354 $at .= $op;
355 for (my $m = $n + 2; defined $elements[$m]; $m++) {
356 if ($elements[$m] ne '') {
357 $at .= $elements[$m];
358 last;
359 }
360 }
361 461
362 ##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>\n"; 462 ##print "<$s1:$op:$s2> <$elements[$n]:$elements[$n + 1]:$elements[$n + 2]>\n";
363 # Skip things apparently in quotes. 463 # Skip things apparently in quotes.
@@ -368,38 +468,38 @@ sub process {
368 468
369 # -> should have no spaces 469 # -> should have no spaces
370 } elsif ($op eq '->') { 470 } elsif ($op eq '->') {
371 if ($s1 or $s2) { 471 if ($ctx =~ /Wx.|.xW/) {
372 print "no spaces around that '$op' $at\n"; 472 print "no spaces around that '$op' $at\n";
373 print "$herecurr"; 473 print "$hereptr";
374 $clean = 0; 474 $clean = 0;
375 } 475 }
376 476
377 # , must have a space on the right. 477 # , must have a space on the right.
378 } elsif ($op eq ',') { 478 } elsif ($op eq ',') {
379 if (!$s2) { 479 if ($ctx !~ /.xW|.xE/) {
380 print "need space after that '$op' $at\n"; 480 print "need space after that '$op' $at\n";
381 print "$herecurr"; 481 print "$hereptr";
382 $clean = 0; 482 $clean = 0;
383 } 483 }
384 484
385 # unary ! and unary ~ are allowed no space on the right 485 # unary ! and unary ~ are allowed no space on the right
386 } elsif ($op eq '!' or $op eq '~') { 486 } elsif ($op eq '!' or $op eq '~') {
387 if (!$s1 && !$o1) { 487 if ($ctx !~ /[WOEB]x./) {
388 print "need space before that '$op' $at\n"; 488 print "need space before that '$op' $at\n";
389 print "$herecurr"; 489 print "$hereptr";
390 $clean = 0; 490 $clean = 0;
391 } 491 }
392 if ($s2) { 492 if ($ctx =~ /.xW/) {
393 print "no space after that '$op' $at\n"; 493 print "no space after that '$op' $at\n";
394 print "$herecurr"; 494 print "$hereptr";
395 $clean = 0; 495 $clean = 0;
396 } 496 }
397 497
398 # unary ++ and unary -- are allowed no space on one side. 498 # unary ++ and unary -- are allowed no space on one side.
399 } elsif ($op eq '++' or $op eq '--') { 499 } elsif ($op eq '++' or $op eq '--') {
400 if (($s1 && $s2) || ((!$s1 && !$o1) && (!$s2 && !$o2))) { 500 if ($ctx !~ /[WOB]x[^W]|[^W]x[WOB]/) {
401 print "need space one side of that '$op' $at\n"; 501 print "need space one side of that '$op' $at\n";
402 print "$herecurr"; 502 print "$hereptr";
403 $clean = 0; 503 $clean = 0;
404 } 504 }
405 505
@@ -420,10 +520,17 @@ sub process {
420 # (foo *) 520 # (foo *)
421 # (foo **) 521 # (foo **)
422 # 522 #
423 } elsif ($op eq '&' or $op eq '-' or $op eq '*') { 523 } elsif ($op eq '&' or $op eq '-') {
424 if ($w2 and !$w1) { 524 if ($ctx !~ /VxV|[EWB]x[WE]|[EWB]x[VO]/) {
525 print "need space before that '$op' $at\n";
526 print "$hereptr";
527 $clean = 0;
528 }
529
530 } elsif ($op eq '*') {
531 if ($ctx !~ /VxV|[EWB]x[WE]|[EWB]x[VO]|[EWO]x[OBV]/) {
425 print "need space before that '$op' $at\n"; 532 print "need space before that '$op' $at\n";
426 print "$herecurr"; 533 print "$hereptr";
427 $clean = 0; 534 $clean = 0;
428 } 535 }
429 536
@@ -431,18 +538,19 @@ sub process {
431 } elsif ($op eq '<<' or $op eq '>>' or $op eq '+' or $op eq '/' or 538 } elsif ($op eq '<<' or $op eq '>>' or $op eq '+' or $op eq '/' or
432 $op eq '^' or $op eq '|') 539 $op eq '^' or $op eq '|')
433 { 540 {
434 if ($s1 != $s2) { 541 if ($ctx !~ /VxV|WxW|VxE|WxE/) {
435 print "need consistent spacing around '$op' $at\n"; 542 print "need consistent spacing around '$op' $at\n";
436 print "$herecurr"; 543 print "$hereptr";
437 $clean = 0; 544 $clean = 0;
438 } 545 }
439 546
440 # All the others need spaces both sides. 547 # All the others need spaces both sides.
441 } elsif (!$s1 or !$s2) { 548 } elsif ($ctx !~ /[EW]x[WE]/) {
442 print "need spaces around that '$op' $at\n"; 549 print "need spaces around that '$op' $at\n";
443 print "$herecurr"; 550 print "$hereptr";
444 $clean = 0; 551 $clean = 0;
445 } 552 }
553 $off += length($elements[$n + 1]);
446 } 554 }
447 } 555 }
448 556
@@ -454,7 +562,7 @@ sub process {
454 } 562 }
455 563
456#goto labels aren't indented, allow a single space however 564#goto labels aren't indented, allow a single space however
457 if ($line=~/^.\s+[A-Za-z\d_]+:/ and 565 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
458 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) { 566 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
459 print "labels should not be indented\n"; 567 print "labels should not be indented\n";
460 print "$herecurr"; 568 print "$herecurr";
@@ -462,15 +570,15 @@ sub process {
462 } 570 }
463 571
464# Need a space before open parenthesis after if, while etc 572# Need a space before open parenthesis after if, while etc
465 if ($line=~/(if|while|for|switch)\(/) { 573 if ($line=~/\b(if|while|for|switch)\(/) {
466 print "need a space before the open parenthesis\n"; 574 print "need a space before the open parenthesis\n";
467 print "$herecurr"; 575 print "$herecurr";
468 $clean = 0; 576 $clean = 0;
469 } 577 }
470 578
471# Check for illegal assignment in if conditional. 579# Check for illegal assignment in if conditional.
472 if ($line=~/(if|while)\s*\(.*[^<>!=]=[^=].*\)/) { 580 if ($line=~/\b(if|while)\s*\(.*[^<>!=]=[^=].*\)/) {
473 print "do not use assignment in if condition\n"; 581 print "do not use assignment in condition\n";
474 print "$herecurr"; 582 print "$herecurr";
475 $clean = 0; 583 $clean = 0;
476 } 584 }
@@ -484,15 +592,28 @@ sub process {
484 $clean = 0; 592 $clean = 0;
485 } 593 }
486 594
487 # Check for switch () {<nl>case, these must be at the 595 # Check for switch () and associated case and default
488 # same indent. We will only catch the first one, as our 596 # statements should be at the same indent.
489 # context is very small but people tend to be consistent 597 if ($line=~/\bswitch\s*\(.*\)/) {
490 # so we will catch them out more often than not. 598 my $err = '';
491 if ($prevline=~/\s*switch\s*\(.*\)/ and $line=~/\s*case\s+/ 599 my $sep = '';
492 and $previndent != $indent) { 600 my @ctx = ctx_block_outer($linenr, $realcnt);
493 print "switch and case should be at the same indent\n"; 601 shift(@ctx);
494 print "$hereprev"; 602 for my $ctx (@ctx) {
495 $clean = 0; 603 my ($clen, $cindent) = line_stats($ctx);
604 if ($ctx =~ /\s*(case\s+|default:)/ &&
605 $indent != $cindent) {
606 $err .= "$sep$ctx\n";
607 $sep = '';
608 } else {
609 $sep = "[...]\n";
610 }
611 }
612 if ($err ne '') {
613 print "switch and case should be at the same indent\n";
614 print "$here\n$line\n$err\n";
615 $clean = 0;
616 }
496 } 617 }
497 618
498#studly caps, commented out until figure out how to distinguish between use of existing and adding new 619#studly caps, commented out until figure out how to distinguish between use of existing and adding new
@@ -520,7 +641,7 @@ sub process {
520 } 641 }
521 642
522#if/while/etc brace do not go on next line, unless #defining a do while loop, or if that brace on the next line is for something else 643#if/while/etc brace do not go on next line, unless #defining a do while loop, or if that brace on the next line is for something else
523 if ($prevline=~/(if|while|for|switch)\s*\(/) { 644 if ($prevline=~/\b(if|while|for|switch)\s*\(/) {
524 my @opened = $prevline=~/\(/g; 645 my @opened = $prevline=~/\(/g;
525 my @closed = $prevline=~/\)/g; 646 my @closed = $prevline=~/\)/g;
526 my $nr_line = $linenr; 647 my $nr_line = $linenr;
@@ -529,7 +650,7 @@ sub process {
529 my $extra_lines = 0; 650 my $extra_lines = 0;
530 my $display_segment = $prevline; 651 my $display_segment = $prevline;
531 652
532 while ($remaining > 0 && scalar @opened > scalar @closed) { 653 while ($remaining > 1 && scalar @opened > scalar @closed) {
533 $prevline .= $next_line; 654 $prevline .= $next_line;
534 $display_segment .= "\n" . $next_line; 655 $display_segment .= "\n" . $next_line;
535 $next_line = $lines[$nr_line]; 656 $next_line = $lines[$nr_line];
@@ -540,10 +661,10 @@ sub process {
540 @closed = $prevline=~/\)/g; 661 @closed = $prevline=~/\)/g;
541 } 662 }
542 663
543 if (($prevline=~/(if|while|for|switch)\s*\(.*\)\s*$/) and ($next_line=~/{/) and 664 if (($prevline=~/\b(if|while|for|switch)\s*\(.*\)\s*$/) and ($next_line=~/{/) and
544 !($next_line=~/(if|while|for)/) and !($next_line=~/\#define.*do.*while/)) { 665 !($next_line=~/\b(if|while|for)/) and !($next_line=~/\#define.*do.*while/)) {
545 print "That { should be on the previous line\n"; 666 print "That { should be on the previous line\n";
546 print "$display_segment\n$next_line\n\n"; 667 print "$here\n$display_segment\n$next_line\n\n";
547 $clean = 0; 668 $clean = 0;
548 } 669 }
549 } 670 }
@@ -558,7 +679,7 @@ sub process {
558 } 679 }
559 680
560# don't include deprecated include files 681# don't include deprecated include files
561 for my $inc (@deprecated) { 682 for my $inc (@dep_includes) {
562 if ($line =~ m@\#\s*include\s*\<$inc>@) { 683 if ($line =~ m@\#\s*include\s*\<$inc>@) {
563 print "Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n"; 684 print "Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n";
564 print "$herecurr"; 685 print "$herecurr";
@@ -566,9 +687,49 @@ sub process {
566 } 687 }
567 } 688 }
568 689
569# don't use kernel_thread() 690# don't use deprecated functions
570 if ($line =~ /\bkernel_thread\b/) { 691 for my $func (@dep_functions) {
571 print "Don't use kernel_thread(), use kthread(): see Documentation/feature-removal-schedule.txt\n"; 692 if (has_non_quoted($line, '\b' . $func . '\b')) {
693 print "Don't use $func(): see Documentation/feature-removal-schedule.txt\n";
694 print "$herecurr";
695 $clean = 0;
696 }
697 }
698
699# no volatiles please
700 if (has_non_quoted($line, '\bvolatile\b')) {
701 print "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n";
702 print "$herecurr";
703 $clean = 0;
704 }
705
706# warn about #ifdefs in C files
707 if ($line =~ /^.#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
708 print "#ifdef in C files should be avoided\n";
709 print "$herecurr";
710 $clean = 0;
711 }
712
713# check for spinlock_t definitions without a comment.
714 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/) {
715 my $which = $1;
716 if (!ctx_has_comment($first_line, $linenr)) {
717 print "$1 definition without comment\n";
718 print "$herecurr";
719 $clean = 0;
720 }
721 }
722# check for memory barriers without a comment.
723 if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
724 if (!ctx_has_comment($first_line, $linenr)) {
725 print "memory barrier without comment\n";
726 print "$herecurr";
727 $clean = 0;
728 }
729 }
730# check of hardware specific defines
731 if ($line =~ m@^.#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@) {
732 print "architecture specific defines should be avoided\n";
572 print "$herecurr"; 733 print "$herecurr";
573 $clean = 0; 734 $clean = 0;
574 } 735 }