Loading...
1#!/usr/bin/perl -w
2# (c) 2001, Dave Jones. (the file handling bit)
3# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
4# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
5# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
6# Licensed under the terms of the GNU GPL License version 2
7
8use strict;
9
10my $P = $0;
11$P =~ s@.*/@@g;
12
13my $V = '0.32';
14
15use Getopt::Long qw(:config no_auto_abbrev);
16
17my $quiet = 0;
18my $tree = 1;
19my $chk_signoff = 1;
20my $chk_patch = 1;
21my $tst_only;
22my $emacs = 0;
23my $terse = 0;
24my $file = 0;
25my $check = 0;
26my $summary = 1;
27my $mailback = 0;
28my $summary_file = 0;
29my $show_types = 0;
30my $root;
31my %debug;
32my %ignore_type = ();
33my @ignore = ();
34my $help = 0;
35my $configuration_file = ".checkpatch.conf";
36
37sub help {
38 my ($exitcode) = @_;
39
40 print << "EOM";
41Usage: $P [OPTION]... [FILE]...
42Version: $V
43
44Options:
45 -q, --quiet quiet
46 --no-tree run without a kernel tree
47 --no-signoff do not check for 'Signed-off-by' line
48 --patch treat FILE as patchfile (default)
49 --emacs emacs compile window format
50 --terse one line per report
51 -f, --file treat FILE as regular source file
52 --subjective, --strict enable more subjective tests
53 --ignore TYPE(,TYPE2...) ignore various comma separated message types
54 --show-types show the message "types" in the output
55 --root=PATH PATH to the kernel tree root
56 --no-summary suppress the per-file summary
57 --mailback only produce a report in case of warnings/errors
58 --summary-file include the filename in summary
59 --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of
60 'values', 'possible', 'type', and 'attr' (default
61 is all off)
62 --test-only=WORD report only warnings/errors containing WORD
63 literally
64 -h, --help, --version display this help and exit
65
66When FILE is - read standard input.
67EOM
68
69 exit($exitcode);
70}
71
72my $conf = which_conf($configuration_file);
73if (-f $conf) {
74 my @conf_args;
75 open(my $conffile, '<', "$conf")
76 or warn "$P: Can't find a readable $configuration_file file $!\n";
77
78 while (<$conffile>) {
79 my $line = $_;
80
81 $line =~ s/\s*\n?$//g;
82 $line =~ s/^\s*//g;
83 $line =~ s/\s+/ /g;
84
85 next if ($line =~ m/^\s*#/);
86 next if ($line =~ m/^\s*$/);
87
88 my @words = split(" ", $line);
89 foreach my $word (@words) {
90 last if ($word =~ m/^#/);
91 push (@conf_args, $word);
92 }
93 }
94 close($conffile);
95 unshift(@ARGV, @conf_args) if @conf_args;
96}
97
98GetOptions(
99 'q|quiet+' => \$quiet,
100 'tree!' => \$tree,
101 'signoff!' => \$chk_signoff,
102 'patch!' => \$chk_patch,
103 'emacs!' => \$emacs,
104 'terse!' => \$terse,
105 'f|file!' => \$file,
106 'subjective!' => \$check,
107 'strict!' => \$check,
108 'ignore=s' => \@ignore,
109 'show-types!' => \$show_types,
110 'root=s' => \$root,
111 'summary!' => \$summary,
112 'mailback!' => \$mailback,
113 'summary-file!' => \$summary_file,
114
115 'debug=s' => \%debug,
116 'test-only=s' => \$tst_only,
117 'h|help' => \$help,
118 'version' => \$help
119) or help(1);
120
121help(0) if ($help);
122
123my $exit = 0;
124
125if ($#ARGV < 0) {
126 print "$P: no input files\n";
127 exit(1);
128}
129
130@ignore = split(/,/, join(',',@ignore));
131foreach my $word (@ignore) {
132 $word =~ s/\s*\n?$//g;
133 $word =~ s/^\s*//g;
134 $word =~ s/\s+/ /g;
135 $word =~ tr/[a-z]/[A-Z]/;
136
137 next if ($word =~ m/^\s*#/);
138 next if ($word =~ m/^\s*$/);
139
140 $ignore_type{$word}++;
141}
142
143my $dbg_values = 0;
144my $dbg_possible = 0;
145my $dbg_type = 0;
146my $dbg_attr = 0;
147for my $key (keys %debug) {
148 ## no critic
149 eval "\${dbg_$key} = '$debug{$key}';";
150 die "$@" if ($@);
151}
152
153my $rpt_cleaners = 0;
154
155if ($terse) {
156 $emacs = 1;
157 $quiet++;
158}
159
160if ($tree) {
161 if (defined $root) {
162 if (!top_of_kernel_tree($root)) {
163 die "$P: $root: --root does not point at a valid tree\n";
164 }
165 } else {
166 if (top_of_kernel_tree('.')) {
167 $root = '.';
168 } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
169 top_of_kernel_tree($1)) {
170 $root = $1;
171 }
172 }
173
174 if (!defined $root) {
175 print "Must be run from the top-level dir. of a kernel tree\n";
176 exit(2);
177 }
178}
179
180my $emitted_corrupt = 0;
181
182our $Ident = qr{
183 [A-Za-z_][A-Za-z\d_]*
184 (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
185 }x;
186our $Storage = qr{extern|static|asmlinkage};
187our $Sparse = qr{
188 __user|
189 __kernel|
190 __force|
191 __iomem|
192 __must_check|
193 __init_refok|
194 __kprobes|
195 __ref|
196 __rcu
197 }x;
198
199# Notes to $Attribute:
200# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
201our $Attribute = qr{
202 const|
203 __percpu|
204 __nocast|
205 __safe|
206 __bitwise__|
207 __packed__|
208 __packed2__|
209 __naked|
210 __maybe_unused|
211 __always_unused|
212 __noreturn|
213 __used|
214 __cold|
215 __noclone|
216 __deprecated|
217 __read_mostly|
218 __kprobes|
219 __(?:mem|cpu|dev|)(?:initdata|initconst|init\b)|
220 ____cacheline_aligned|
221 ____cacheline_aligned_in_smp|
222 ____cacheline_internodealigned_in_smp|
223 __weak
224 }x;
225our $Modifier;
226our $Inline = qr{inline|__always_inline|noinline};
227our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
228our $Lval = qr{$Ident(?:$Member)*};
229
230our $Constant = qr{(?:[0-9]+|0x[0-9a-fA-F]+)[UL]*};
231our $Assignment = qr{(?:\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=)};
232our $Compare = qr{<=|>=|==|!=|<|>};
233our $Operators = qr{
234 <=|>=|==|!=|
235 =>|->|<<|>>|<|>|!|~|
236 &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%
237 }x;
238
239our $NonptrType;
240our $Type;
241our $Declare;
242
243our $UTF8 = qr {
244 [\x09\x0A\x0D\x20-\x7E] # ASCII
245 | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
246 | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
247 | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
248 | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
249 | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
250 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
251 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
252}x;
253
254our $typeTypedefs = qr{(?x:
255 (?:__)?(?:u|s|be|le)(?:8|16|32|64)|
256 atomic_t
257)};
258
259our $logFunctions = qr{(?x:
260 printk(?:_ratelimited|_once|)|
261 [a-z0-9]+_(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
262 WARN(?:_RATELIMIT|_ONCE|)|
263 panic|
264 MODULE_[A-Z_]+
265)};
266
267our $signature_tags = qr{(?xi:
268 Signed-off-by:|
269 Acked-by:|
270 Tested-by:|
271 Reviewed-by:|
272 Reported-by:|
273 To:|
274 Cc:
275)};
276
277our @typeList = (
278 qr{void},
279 qr{(?:unsigned\s+)?char},
280 qr{(?:unsigned\s+)?short},
281 qr{(?:unsigned\s+)?int},
282 qr{(?:unsigned\s+)?long},
283 qr{(?:unsigned\s+)?long\s+int},
284 qr{(?:unsigned\s+)?long\s+long},
285 qr{(?:unsigned\s+)?long\s+long\s+int},
286 qr{unsigned},
287 qr{float},
288 qr{double},
289 qr{bool},
290 qr{struct\s+$Ident},
291 qr{union\s+$Ident},
292 qr{enum\s+$Ident},
293 qr{${Ident}_t},
294 qr{${Ident}_handler},
295 qr{${Ident}_handler_fn},
296);
297our @modifierList = (
298 qr{fastcall},
299);
300
301our $allowed_asm_includes = qr{(?x:
302 irq|
303 memory
304)};
305# memory.h: ARM has a custom one
306
307sub build_types {
308 my $mods = "(?x: \n" . join("|\n ", @modifierList) . "\n)";
309 my $all = "(?x: \n" . join("|\n ", @typeList) . "\n)";
310 $Modifier = qr{(?:$Attribute|$Sparse|$mods)};
311 $NonptrType = qr{
312 (?:$Modifier\s+|const\s+)*
313 (?:
314 (?:typeof|__typeof__)\s*\(\s*\**\s*$Ident\s*\)|
315 (?:$typeTypedefs\b)|
316 (?:${all}\b)
317 )
318 (?:\s+$Modifier|\s+const)*
319 }x;
320 $Type = qr{
321 $NonptrType
322 (?:[\s\*]+\s*const|[\s\*]+|(?:\s*\[\s*\])+)?
323 (?:\s+$Inline|\s+$Modifier)*
324 }x;
325 $Declare = qr{(?:$Storage\s+)?$Type};
326}
327build_types();
328
329our $match_balanced_parentheses = qr/(\((?:[^\(\)]+|(-1))*\))/;
330
331our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
332our $LvalOrFunc = qr{($Lval)\s*($match_balanced_parentheses{0,1})\s*};
333
334sub deparenthesize {
335 my ($string) = @_;
336 return "" if (!defined($string));
337 $string =~ s@^\s*\(\s*@@g;
338 $string =~ s@\s*\)\s*$@@g;
339 $string =~ s@\s+@ @g;
340 return $string;
341}
342
343$chk_signoff = 0 if ($file);
344
345my @dep_includes = ();
346my @dep_functions = ();
347my $removal = "Documentation/feature-removal-schedule.txt";
348if ($tree && -f "$root/$removal") {
349 open(my $REMOVE, '<', "$root/$removal") ||
350 die "$P: $removal: open failed - $!\n";
351 while (<$REMOVE>) {
352 if (/^Check:\s+(.*\S)/) {
353 for my $entry (split(/[, ]+/, $1)) {
354 if ($entry =~ m@include/(.*)@) {
355 push(@dep_includes, $1);
356
357 } elsif ($entry !~ m@/@) {
358 push(@dep_functions, $entry);
359 }
360 }
361 }
362 }
363 close($REMOVE);
364}
365
366my @rawlines = ();
367my @lines = ();
368my $vname;
369for my $filename (@ARGV) {
370 my $FILE;
371 if ($file) {
372 open($FILE, '-|', "diff -u /dev/null $filename") ||
373 die "$P: $filename: diff failed - $!\n";
374 } elsif ($filename eq '-') {
375 open($FILE, '<&STDIN');
376 } else {
377 open($FILE, '<', "$filename") ||
378 die "$P: $filename: open failed - $!\n";
379 }
380 if ($filename eq '-') {
381 $vname = 'Your patch';
382 } else {
383 $vname = $filename;
384 }
385 while (<$FILE>) {
386 chomp;
387 push(@rawlines, $_);
388 }
389 close($FILE);
390 if (!process($filename)) {
391 $exit = 1;
392 }
393 @rawlines = ();
394 @lines = ();
395}
396
397exit($exit);
398
399sub top_of_kernel_tree {
400 my ($root) = @_;
401
402 my @tree_check = (
403 "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
404 "README", "Documentation", "arch", "include", "drivers",
405 "fs", "init", "ipc", "kernel", "lib", "scripts",
406 );
407
408 foreach my $check (@tree_check) {
409 if (! -e $root . '/' . $check) {
410 return 0;
411 }
412 }
413 return 1;
414 }
415
416sub parse_email {
417 my ($formatted_email) = @_;
418
419 my $name = "";
420 my $address = "";
421 my $comment = "";
422
423 if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
424 $name = $1;
425 $address = $2;
426 $comment = $3 if defined $3;
427 } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
428 $address = $1;
429 $comment = $2 if defined $2;
430 } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
431 $address = $1;
432 $comment = $2 if defined $2;
433 $formatted_email =~ s/$address.*$//;
434 $name = $formatted_email;
435 $name =~ s/^\s+|\s+$//g;
436 $name =~ s/^\"|\"$//g;
437 # If there's a name left after stripping spaces and
438 # leading quotes, and the address doesn't have both
439 # leading and trailing angle brackets, the address
440 # is invalid. ie:
441 # "joe smith joe@smith.com" bad
442 # "joe smith <joe@smith.com" bad
443 if ($name ne "" && $address !~ /^<[^>]+>$/) {
444 $name = "";
445 $address = "";
446 $comment = "";
447 }
448 }
449
450 $name =~ s/^\s+|\s+$//g;
451 $name =~ s/^\"|\"$//g;
452 $address =~ s/^\s+|\s+$//g;
453 $address =~ s/^\<|\>$//g;
454
455 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
456 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
457 $name = "\"$name\"";
458 }
459
460 return ($name, $address, $comment);
461}
462
463sub format_email {
464 my ($name, $address) = @_;
465
466 my $formatted_email;
467
468 $name =~ s/^\s+|\s+$//g;
469 $name =~ s/^\"|\"$//g;
470 $address =~ s/^\s+|\s+$//g;
471
472 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
473 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
474 $name = "\"$name\"";
475 }
476
477 if ("$name" eq "") {
478 $formatted_email = "$address";
479 } else {
480 $formatted_email = "$name <$address>";
481 }
482
483 return $formatted_email;
484}
485
486sub which_conf {
487 my ($conf) = @_;
488
489 foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
490 if (-e "$path/$conf") {
491 return "$path/$conf";
492 }
493 }
494
495 return "";
496}
497
498sub expand_tabs {
499 my ($str) = @_;
500
501 my $res = '';
502 my $n = 0;
503 for my $c (split(//, $str)) {
504 if ($c eq "\t") {
505 $res .= ' ';
506 $n++;
507 for (; ($n % 8) != 0; $n++) {
508 $res .= ' ';
509 }
510 next;
511 }
512 $res .= $c;
513 $n++;
514 }
515
516 return $res;
517}
518sub copy_spacing {
519 (my $res = shift) =~ tr/\t/ /c;
520 return $res;
521}
522
523sub line_stats {
524 my ($line) = @_;
525
526 # Drop the diff line leader and expand tabs
527 $line =~ s/^.//;
528 $line = expand_tabs($line);
529
530 # Pick the indent from the front of the line.
531 my ($white) = ($line =~ /^(\s*)/);
532
533 return (length($line), length($white));
534}
535
536my $sanitise_quote = '';
537
538sub sanitise_line_reset {
539 my ($in_comment) = @_;
540
541 if ($in_comment) {
542 $sanitise_quote = '*/';
543 } else {
544 $sanitise_quote = '';
545 }
546}
547sub sanitise_line {
548 my ($line) = @_;
549
550 my $res = '';
551 my $l = '';
552
553 my $qlen = 0;
554 my $off = 0;
555 my $c;
556
557 # Always copy over the diff marker.
558 $res = substr($line, 0, 1);
559
560 for ($off = 1; $off < length($line); $off++) {
561 $c = substr($line, $off, 1);
562
563 # Comments we are wacking completly including the begin
564 # and end, all to $;.
565 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
566 $sanitise_quote = '*/';
567
568 substr($res, $off, 2, "$;$;");
569 $off++;
570 next;
571 }
572 if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
573 $sanitise_quote = '';
574 substr($res, $off, 2, "$;$;");
575 $off++;
576 next;
577 }
578 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
579 $sanitise_quote = '//';
580
581 substr($res, $off, 2, $sanitise_quote);
582 $off++;
583 next;
584 }
585
586 # A \ in a string means ignore the next character.
587 if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
588 $c eq "\\") {
589 substr($res, $off, 2, 'XX');
590 $off++;
591 next;
592 }
593 # Regular quotes.
594 if ($c eq "'" || $c eq '"') {
595 if ($sanitise_quote eq '') {
596 $sanitise_quote = $c;
597
598 substr($res, $off, 1, $c);
599 next;
600 } elsif ($sanitise_quote eq $c) {
601 $sanitise_quote = '';
602 }
603 }
604
605 #print "c<$c> SQ<$sanitise_quote>\n";
606 if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
607 substr($res, $off, 1, $;);
608 } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
609 substr($res, $off, 1, $;);
610 } elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
611 substr($res, $off, 1, 'X');
612 } else {
613 substr($res, $off, 1, $c);
614 }
615 }
616
617 if ($sanitise_quote eq '//') {
618 $sanitise_quote = '';
619 }
620
621 # The pathname on a #include may be surrounded by '<' and '>'.
622 if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
623 my $clean = 'X' x length($1);
624 $res =~ s@\<.*\>@<$clean>@;
625
626 # The whole of a #error is a string.
627 } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
628 my $clean = 'X' x length($1);
629 $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
630 }
631
632 return $res;
633}
634
635sub ctx_statement_block {
636 my ($linenr, $remain, $off) = @_;
637 my $line = $linenr - 1;
638 my $blk = '';
639 my $soff = $off;
640 my $coff = $off - 1;
641 my $coff_set = 0;
642
643 my $loff = 0;
644
645 my $type = '';
646 my $level = 0;
647 my @stack = ();
648 my $p;
649 my $c;
650 my $len = 0;
651
652 my $remainder;
653 while (1) {
654 @stack = (['', 0]) if ($#stack == -1);
655
656 #warn "CSB: blk<$blk> remain<$remain>\n";
657 # If we are about to drop off the end, pull in more
658 # context.
659 if ($off >= $len) {
660 for (; $remain > 0; $line++) {
661 last if (!defined $lines[$line]);
662 next if ($lines[$line] =~ /^-/);
663 $remain--;
664 $loff = $len;
665 $blk .= $lines[$line] . "\n";
666 $len = length($blk);
667 $line++;
668 last;
669 }
670 # Bail if there is no further context.
671 #warn "CSB: blk<$blk> off<$off> len<$len>\n";
672 if ($off >= $len) {
673 last;
674 }
675 }
676 $p = $c;
677 $c = substr($blk, $off, 1);
678 $remainder = substr($blk, $off);
679
680 #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
681
682 # Handle nested #if/#else.
683 if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
684 push(@stack, [ $type, $level ]);
685 } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
686 ($type, $level) = @{$stack[$#stack - 1]};
687 } elsif ($remainder =~ /^#\s*endif\b/) {
688 ($type, $level) = @{pop(@stack)};
689 }
690
691 # Statement ends at the ';' or a close '}' at the
692 # outermost level.
693 if ($level == 0 && $c eq ';') {
694 last;
695 }
696
697 # An else is really a conditional as long as its not else if
698 if ($level == 0 && $coff_set == 0 &&
699 (!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
700 $remainder =~ /^(else)(?:\s|{)/ &&
701 $remainder !~ /^else\s+if\b/) {
702 $coff = $off + length($1) - 1;
703 $coff_set = 1;
704 #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
705 #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
706 }
707
708 if (($type eq '' || $type eq '(') && $c eq '(') {
709 $level++;
710 $type = '(';
711 }
712 if ($type eq '(' && $c eq ')') {
713 $level--;
714 $type = ($level != 0)? '(' : '';
715
716 if ($level == 0 && $coff < $soff) {
717 $coff = $off;
718 $coff_set = 1;
719 #warn "CSB: mark coff<$coff>\n";
720 }
721 }
722 if (($type eq '' || $type eq '{') && $c eq '{') {
723 $level++;
724 $type = '{';
725 }
726 if ($type eq '{' && $c eq '}') {
727 $level--;
728 $type = ($level != 0)? '{' : '';
729
730 if ($level == 0) {
731 if (substr($blk, $off + 1, 1) eq ';') {
732 $off++;
733 }
734 last;
735 }
736 }
737 $off++;
738 }
739 # We are truly at the end, so shuffle to the next line.
740 if ($off == $len) {
741 $loff = $len + 1;
742 $line++;
743 $remain--;
744 }
745
746 my $statement = substr($blk, $soff, $off - $soff + 1);
747 my $condition = substr($blk, $soff, $coff - $soff + 1);
748
749 #warn "STATEMENT<$statement>\n";
750 #warn "CONDITION<$condition>\n";
751
752 #print "coff<$coff> soff<$off> loff<$loff>\n";
753
754 return ($statement, $condition,
755 $line, $remain + 1, $off - $loff + 1, $level);
756}
757
758sub statement_lines {
759 my ($stmt) = @_;
760
761 # Strip the diff line prefixes and rip blank lines at start and end.
762 $stmt =~ s/(^|\n)./$1/g;
763 $stmt =~ s/^\s*//;
764 $stmt =~ s/\s*$//;
765
766 my @stmt_lines = ($stmt =~ /\n/g);
767
768 return $#stmt_lines + 2;
769}
770
771sub statement_rawlines {
772 my ($stmt) = @_;
773
774 my @stmt_lines = ($stmt =~ /\n/g);
775
776 return $#stmt_lines + 2;
777}
778
779sub statement_block_size {
780 my ($stmt) = @_;
781
782 $stmt =~ s/(^|\n)./$1/g;
783 $stmt =~ s/^\s*{//;
784 $stmt =~ s/}\s*$//;
785 $stmt =~ s/^\s*//;
786 $stmt =~ s/\s*$//;
787
788 my @stmt_lines = ($stmt =~ /\n/g);
789 my @stmt_statements = ($stmt =~ /;/g);
790
791 my $stmt_lines = $#stmt_lines + 2;
792 my $stmt_statements = $#stmt_statements + 1;
793
794 if ($stmt_lines > $stmt_statements) {
795 return $stmt_lines;
796 } else {
797 return $stmt_statements;
798 }
799}
800
801sub ctx_statement_full {
802 my ($linenr, $remain, $off) = @_;
803 my ($statement, $condition, $level);
804
805 my (@chunks);
806
807 # Grab the first conditional/block pair.
808 ($statement, $condition, $linenr, $remain, $off, $level) =
809 ctx_statement_block($linenr, $remain, $off);
810 #print "F: c<$condition> s<$statement> remain<$remain>\n";
811 push(@chunks, [ $condition, $statement ]);
812 if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
813 return ($level, $linenr, @chunks);
814 }
815
816 # Pull in the following conditional/block pairs and see if they
817 # could continue the statement.
818 for (;;) {
819 ($statement, $condition, $linenr, $remain, $off, $level) =
820 ctx_statement_block($linenr, $remain, $off);
821 #print "C: c<$condition> s<$statement> remain<$remain>\n";
822 last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
823 #print "C: push\n";
824 push(@chunks, [ $condition, $statement ]);
825 }
826
827 return ($level, $linenr, @chunks);
828}
829
830sub ctx_block_get {
831 my ($linenr, $remain, $outer, $open, $close, $off) = @_;
832 my $line;
833 my $start = $linenr - 1;
834 my $blk = '';
835 my @o;
836 my @c;
837 my @res = ();
838
839 my $level = 0;
840 my @stack = ($level);
841 for ($line = $start; $remain > 0; $line++) {
842 next if ($rawlines[$line] =~ /^-/);
843 $remain--;
844
845 $blk .= $rawlines[$line];
846
847 # Handle nested #if/#else.
848 if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
849 push(@stack, $level);
850 } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
851 $level = $stack[$#stack - 1];
852 } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
853 $level = pop(@stack);
854 }
855
856 foreach my $c (split(//, $lines[$line])) {
857 ##print "C<$c>L<$level><$open$close>O<$off>\n";
858 if ($off > 0) {
859 $off--;
860 next;
861 }
862
863 if ($c eq $close && $level > 0) {
864 $level--;
865 last if ($level == 0);
866 } elsif ($c eq $open) {
867 $level++;
868 }
869 }
870
871 if (!$outer || $level <= 1) {
872 push(@res, $rawlines[$line]);
873 }
874
875 last if ($level == 0);
876 }
877
878 return ($level, @res);
879}
880sub ctx_block_outer {
881 my ($linenr, $remain) = @_;
882
883 my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
884 return @r;
885}
886sub ctx_block {
887 my ($linenr, $remain) = @_;
888
889 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
890 return @r;
891}
892sub ctx_statement {
893 my ($linenr, $remain, $off) = @_;
894
895 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
896 return @r;
897}
898sub ctx_block_level {
899 my ($linenr, $remain) = @_;
900
901 return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
902}
903sub ctx_statement_level {
904 my ($linenr, $remain, $off) = @_;
905
906 return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
907}
908
909sub ctx_locate_comment {
910 my ($first_line, $end_line) = @_;
911
912 # Catch a comment on the end of the line itself.
913 my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
914 return $current_comment if (defined $current_comment);
915
916 # Look through the context and try and figure out if there is a
917 # comment.
918 my $in_comment = 0;
919 $current_comment = '';
920 for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
921 my $line = $rawlines[$linenr - 1];
922 #warn " $line\n";
923 if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
924 $in_comment = 1;
925 }
926 if ($line =~ m@/\*@) {
927 $in_comment = 1;
928 }
929 if (!$in_comment && $current_comment ne '') {
930 $current_comment = '';
931 }
932 $current_comment .= $line . "\n" if ($in_comment);
933 if ($line =~ m@\*/@) {
934 $in_comment = 0;
935 }
936 }
937
938 chomp($current_comment);
939 return($current_comment);
940}
941sub ctx_has_comment {
942 my ($first_line, $end_line) = @_;
943 my $cmt = ctx_locate_comment($first_line, $end_line);
944
945 ##print "LINE: $rawlines[$end_line - 1 ]\n";
946 ##print "CMMT: $cmt\n";
947
948 return ($cmt ne '');
949}
950
951sub raw_line {
952 my ($linenr, $cnt) = @_;
953
954 my $offset = $linenr - 1;
955 $cnt++;
956
957 my $line;
958 while ($cnt) {
959 $line = $rawlines[$offset++];
960 next if (defined($line) && $line =~ /^-/);
961 $cnt--;
962 }
963
964 return $line;
965}
966
967sub cat_vet {
968 my ($vet) = @_;
969 my ($res, $coded);
970
971 $res = '';
972 while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
973 $res .= $1;
974 if ($2 ne '') {
975 $coded = sprintf("^%c", unpack('C', $2) + 64);
976 $res .= $coded;
977 }
978 }
979 $res =~ s/$/\$/;
980
981 return $res;
982}
983
984my $av_preprocessor = 0;
985my $av_pending;
986my @av_paren_type;
987my $av_pend_colon;
988
989sub annotate_reset {
990 $av_preprocessor = 0;
991 $av_pending = '_';
992 @av_paren_type = ('E');
993 $av_pend_colon = 'O';
994}
995
996sub annotate_values {
997 my ($stream, $type) = @_;
998
999 my $res;
1000 my $var = '_' x length($stream);
1001 my $cur = $stream;
1002
1003 print "$stream\n" if ($dbg_values > 1);
1004
1005 while (length($cur)) {
1006 @av_paren_type = ('E') if ($#av_paren_type < 0);
1007 print " <" . join('', @av_paren_type) .
1008 "> <$type> <$av_pending>" if ($dbg_values > 1);
1009 if ($cur =~ /^(\s+)/o) {
1010 print "WS($1)\n" if ($dbg_values > 1);
1011 if ($1 =~ /\n/ && $av_preprocessor) {
1012 $type = pop(@av_paren_type);
1013 $av_preprocessor = 0;
1014 }
1015
1016 } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
1017 print "CAST($1)\n" if ($dbg_values > 1);
1018 push(@av_paren_type, $type);
1019 $type = 'C';
1020
1021 } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
1022 print "DECLARE($1)\n" if ($dbg_values > 1);
1023 $type = 'T';
1024
1025 } elsif ($cur =~ /^($Modifier)\s*/) {
1026 print "MODIFIER($1)\n" if ($dbg_values > 1);
1027 $type = 'T';
1028
1029 } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
1030 print "DEFINE($1,$2)\n" if ($dbg_values > 1);
1031 $av_preprocessor = 1;
1032 push(@av_paren_type, $type);
1033 if ($2 ne '') {
1034 $av_pending = 'N';
1035 }
1036 $type = 'E';
1037
1038 } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
1039 print "UNDEF($1)\n" if ($dbg_values > 1);
1040 $av_preprocessor = 1;
1041 push(@av_paren_type, $type);
1042
1043 } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
1044 print "PRE_START($1)\n" if ($dbg_values > 1);
1045 $av_preprocessor = 1;
1046
1047 push(@av_paren_type, $type);
1048 push(@av_paren_type, $type);
1049 $type = 'E';
1050
1051 } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
1052 print "PRE_RESTART($1)\n" if ($dbg_values > 1);
1053 $av_preprocessor = 1;
1054
1055 push(@av_paren_type, $av_paren_type[$#av_paren_type]);
1056
1057 $type = 'E';
1058
1059 } elsif ($cur =~ /^(\#\s*(?:endif))/o) {
1060 print "PRE_END($1)\n" if ($dbg_values > 1);
1061
1062 $av_preprocessor = 1;
1063
1064 # Assume all arms of the conditional end as this
1065 # one does, and continue as if the #endif was not here.
1066 pop(@av_paren_type);
1067 push(@av_paren_type, $type);
1068 $type = 'E';
1069
1070 } elsif ($cur =~ /^(\\\n)/o) {
1071 print "PRECONT($1)\n" if ($dbg_values > 1);
1072
1073 } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
1074 print "ATTR($1)\n" if ($dbg_values > 1);
1075 $av_pending = $type;
1076 $type = 'N';
1077
1078 } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
1079 print "SIZEOF($1)\n" if ($dbg_values > 1);
1080 if (defined $2) {
1081 $av_pending = 'V';
1082 }
1083 $type = 'N';
1084
1085 } elsif ($cur =~ /^(if|while|for)\b/o) {
1086 print "COND($1)\n" if ($dbg_values > 1);
1087 $av_pending = 'E';
1088 $type = 'N';
1089
1090 } elsif ($cur =~/^(case)/o) {
1091 print "CASE($1)\n" if ($dbg_values > 1);
1092 $av_pend_colon = 'C';
1093 $type = 'N';
1094
1095 } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
1096 print "KEYWORD($1)\n" if ($dbg_values > 1);
1097 $type = 'N';
1098
1099 } elsif ($cur =~ /^(\()/o) {
1100 print "PAREN('$1')\n" if ($dbg_values > 1);
1101 push(@av_paren_type, $av_pending);
1102 $av_pending = '_';
1103 $type = 'N';
1104
1105 } elsif ($cur =~ /^(\))/o) {
1106 my $new_type = pop(@av_paren_type);
1107 if ($new_type ne '_') {
1108 $type = $new_type;
1109 print "PAREN('$1') -> $type\n"
1110 if ($dbg_values > 1);
1111 } else {
1112 print "PAREN('$1')\n" if ($dbg_values > 1);
1113 }
1114
1115 } elsif ($cur =~ /^($Ident)\s*\(/o) {
1116 print "FUNC($1)\n" if ($dbg_values > 1);
1117 $type = 'V';
1118 $av_pending = 'V';
1119
1120 } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
1121 if (defined $2 && $type eq 'C' || $type eq 'T') {
1122 $av_pend_colon = 'B';
1123 } elsif ($type eq 'E') {
1124 $av_pend_colon = 'L';
1125 }
1126 print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
1127 $type = 'V';
1128
1129 } elsif ($cur =~ /^($Ident|$Constant)/o) {
1130 print "IDENT($1)\n" if ($dbg_values > 1);
1131 $type = 'V';
1132
1133 } elsif ($cur =~ /^($Assignment)/o) {
1134 print "ASSIGN($1)\n" if ($dbg_values > 1);
1135 $type = 'N';
1136
1137 } elsif ($cur =~/^(;|{|})/) {
1138 print "END($1)\n" if ($dbg_values > 1);
1139 $type = 'E';
1140 $av_pend_colon = 'O';
1141
1142 } elsif ($cur =~/^(,)/) {
1143 print "COMMA($1)\n" if ($dbg_values > 1);
1144 $type = 'C';
1145
1146 } elsif ($cur =~ /^(\?)/o) {
1147 print "QUESTION($1)\n" if ($dbg_values > 1);
1148 $type = 'N';
1149
1150 } elsif ($cur =~ /^(:)/o) {
1151 print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
1152
1153 substr($var, length($res), 1, $av_pend_colon);
1154 if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
1155 $type = 'E';
1156 } else {
1157 $type = 'N';
1158 }
1159 $av_pend_colon = 'O';
1160
1161 } elsif ($cur =~ /^(\[)/o) {
1162 print "CLOSE($1)\n" if ($dbg_values > 1);
1163 $type = 'N';
1164
1165 } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
1166 my $variant;
1167
1168 print "OPV($1)\n" if ($dbg_values > 1);
1169 if ($type eq 'V') {
1170 $variant = 'B';
1171 } else {
1172 $variant = 'U';
1173 }
1174
1175 substr($var, length($res), 1, $variant);
1176 $type = 'N';
1177
1178 } elsif ($cur =~ /^($Operators)/o) {
1179 print "OP($1)\n" if ($dbg_values > 1);
1180 if ($1 ne '++' && $1 ne '--') {
1181 $type = 'N';
1182 }
1183
1184 } elsif ($cur =~ /(^.)/o) {
1185 print "C($1)\n" if ($dbg_values > 1);
1186 }
1187 if (defined $1) {
1188 $cur = substr($cur, length($1));
1189 $res .= $type x length($1);
1190 }
1191 }
1192
1193 return ($res, $var);
1194}
1195
1196sub possible {
1197 my ($possible, $line) = @_;
1198 my $notPermitted = qr{(?:
1199 ^(?:
1200 $Modifier|
1201 $Storage|
1202 $Type|
1203 DEFINE_\S+
1204 )$|
1205 ^(?:
1206 goto|
1207 return|
1208 case|
1209 else|
1210 asm|__asm__|
1211 do
1212 )(?:\s|$)|
1213 ^(?:typedef|struct|enum)\b
1214 )}x;
1215 warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1216 if ($possible !~ $notPermitted) {
1217 # Check for modifiers.
1218 $possible =~ s/\s*$Storage\s*//g;
1219 $possible =~ s/\s*$Sparse\s*//g;
1220 if ($possible =~ /^\s*$/) {
1221
1222 } elsif ($possible =~ /\s/) {
1223 $possible =~ s/\s*$Type\s*//g;
1224 for my $modifier (split(' ', $possible)) {
1225 if ($modifier !~ $notPermitted) {
1226 warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
1227 push(@modifierList, $modifier);
1228 }
1229 }
1230
1231 } else {
1232 warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
1233 push(@typeList, $possible);
1234 }
1235 build_types();
1236 } else {
1237 warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
1238 }
1239}
1240
1241my $prefix = '';
1242
1243sub show_type {
1244 return !defined $ignore_type{$_[0]};
1245}
1246
1247sub report {
1248 if (!show_type($_[1]) ||
1249 (defined $tst_only && $_[2] !~ /\Q$tst_only\E/)) {
1250 return 0;
1251 }
1252 my $line;
1253 if ($show_types) {
1254 $line = "$prefix$_[0]:$_[1]: $_[2]\n";
1255 } else {
1256 $line = "$prefix$_[0]: $_[2]\n";
1257 }
1258 $line = (split('\n', $line))[0] . "\n" if ($terse);
1259
1260 push(our @report, $line);
1261
1262 return 1;
1263}
1264sub report_dump {
1265 our @report;
1266}
1267
1268sub ERROR {
1269 if (report("ERROR", $_[0], $_[1])) {
1270 our $clean = 0;
1271 our $cnt_error++;
1272 }
1273}
1274sub WARN {
1275 if (report("WARNING", $_[0], $_[1])) {
1276 our $clean = 0;
1277 our $cnt_warn++;
1278 }
1279}
1280sub CHK {
1281 if ($check && report("CHECK", $_[0], $_[1])) {
1282 our $clean = 0;
1283 our $cnt_chk++;
1284 }
1285}
1286
1287sub check_absolute_file {
1288 my ($absolute, $herecurr) = @_;
1289 my $file = $absolute;
1290
1291 ##print "absolute<$absolute>\n";
1292
1293 # See if any suffix of this path is a path within the tree.
1294 while ($file =~ s@^[^/]*/@@) {
1295 if (-f "$root/$file") {
1296 ##print "file<$file>\n";
1297 last;
1298 }
1299 }
1300 if (! -f _) {
1301 return 0;
1302 }
1303
1304 # It is, so see if the prefix is acceptable.
1305 my $prefix = $absolute;
1306 substr($prefix, -length($file)) = '';
1307
1308 ##print "prefix<$prefix>\n";
1309 if ($prefix ne ".../") {
1310 WARN("USE_RELATIVE_PATH",
1311 "use relative pathname instead of absolute in changelog text\n" . $herecurr);
1312 }
1313}
1314
1315sub process {
1316 my $filename = shift;
1317
1318 my $linenr=0;
1319 my $prevline="";
1320 my $prevrawline="";
1321 my $stashline="";
1322 my $stashrawline="";
1323
1324 my $length;
1325 my $indent;
1326 my $previndent=0;
1327 my $stashindent=0;
1328
1329 our $clean = 1;
1330 my $signoff = 0;
1331 my $is_patch = 0;
1332
1333 our @report = ();
1334 our $cnt_lines = 0;
1335 our $cnt_error = 0;
1336 our $cnt_warn = 0;
1337 our $cnt_chk = 0;
1338
1339 # Trace the real file/line as we go.
1340 my $realfile = '';
1341 my $realline = 0;
1342 my $realcnt = 0;
1343 my $here = '';
1344 my $in_comment = 0;
1345 my $comment_edge = 0;
1346 my $first_line = 0;
1347 my $p1_prefix = '';
1348
1349 my $prev_values = 'E';
1350
1351 # suppression flags
1352 my %suppress_ifbraces;
1353 my %suppress_whiletrailers;
1354 my %suppress_export;
1355
1356 # Pre-scan the patch sanitizing the lines.
1357 # Pre-scan the patch looking for any __setup documentation.
1358 #
1359 my @setup_docs = ();
1360 my $setup_docs = 0;
1361
1362 sanitise_line_reset();
1363 my $line;
1364 foreach my $rawline (@rawlines) {
1365 $linenr++;
1366 $line = $rawline;
1367
1368 if ($rawline=~/^\+\+\+\s+(\S+)/) {
1369 $setup_docs = 0;
1370 if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
1371 $setup_docs = 1;
1372 }
1373 #next;
1374 }
1375 if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1376 $realline=$1-1;
1377 if (defined $2) {
1378 $realcnt=$3+1;
1379 } else {
1380 $realcnt=1+1;
1381 }
1382 $in_comment = 0;
1383
1384 # Guestimate if this is a continuing comment. Run
1385 # the context looking for a comment "edge". If this
1386 # edge is a close comment then we must be in a comment
1387 # at context start.
1388 my $edge;
1389 my $cnt = $realcnt;
1390 for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
1391 next if (defined $rawlines[$ln - 1] &&
1392 $rawlines[$ln - 1] =~ /^-/);
1393 $cnt--;
1394 #print "RAW<$rawlines[$ln - 1]>\n";
1395 last if (!defined $rawlines[$ln - 1]);
1396 if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
1397 $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
1398 ($edge) = $1;
1399 last;
1400 }
1401 }
1402 if (defined $edge && $edge eq '*/') {
1403 $in_comment = 1;
1404 }
1405
1406 # Guestimate if this is a continuing comment. If this
1407 # is the start of a diff block and this line starts
1408 # ' *' then it is very likely a comment.
1409 if (!defined $edge &&
1410 $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
1411 {
1412 $in_comment = 1;
1413 }
1414
1415 ##print "COMMENT:$in_comment edge<$edge> $rawline\n";
1416 sanitise_line_reset($in_comment);
1417
1418 } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
1419 # Standardise the strings and chars within the input to
1420 # simplify matching -- only bother with positive lines.
1421 $line = sanitise_line($rawline);
1422 }
1423 push(@lines, $line);
1424
1425 if ($realcnt > 1) {
1426 $realcnt-- if ($line =~ /^(?:\+| |$)/);
1427 } else {
1428 $realcnt = 0;
1429 }
1430
1431 #print "==>$rawline\n";
1432 #print "-->$line\n";
1433
1434 if ($setup_docs && $line =~ /^\+/) {
1435 push(@setup_docs, $line);
1436 }
1437 }
1438
1439 $prefix = '';
1440
1441 $realcnt = 0;
1442 $linenr = 0;
1443 foreach my $line (@lines) {
1444 $linenr++;
1445
1446 my $rawline = $rawlines[$linenr - 1];
1447
1448#extract the line range in the file after the patch is applied
1449 if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1450 $is_patch = 1;
1451 $first_line = $linenr + 1;
1452 $realline=$1-1;
1453 if (defined $2) {
1454 $realcnt=$3+1;
1455 } else {
1456 $realcnt=1+1;
1457 }
1458 annotate_reset();
1459 $prev_values = 'E';
1460
1461 %suppress_ifbraces = ();
1462 %suppress_whiletrailers = ();
1463 %suppress_export = ();
1464 next;
1465
1466# track the line number as we move through the hunk, note that
1467# new versions of GNU diff omit the leading space on completely
1468# blank context lines so we need to count that too.
1469 } elsif ($line =~ /^( |\+|$)/) {
1470 $realline++;
1471 $realcnt-- if ($realcnt != 0);
1472
1473 # Measure the line length and indent.
1474 ($length, $indent) = line_stats($rawline);
1475
1476 # Track the previous line.
1477 ($prevline, $stashline) = ($stashline, $line);
1478 ($previndent, $stashindent) = ($stashindent, $indent);
1479 ($prevrawline, $stashrawline) = ($stashrawline, $rawline);
1480
1481 #warn "line<$line>\n";
1482
1483 } elsif ($realcnt == 1) {
1484 $realcnt--;
1485 }
1486
1487 my $hunk_line = ($realcnt != 0);
1488
1489#make up the handle for any error we report on this line
1490 $prefix = "$filename:$realline: " if ($emacs && $file);
1491 $prefix = "$filename:$linenr: " if ($emacs && !$file);
1492
1493 $here = "#$linenr: " if (!$file);
1494 $here = "#$realline: " if ($file);
1495
1496 # extract the filename as it passes
1497 if ($line =~ /^diff --git.*?(\S+)$/) {
1498 $realfile = $1;
1499 $realfile =~ s@^([^/]*)/@@;
1500
1501 } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
1502 $realfile = $1;
1503 $realfile =~ s@^([^/]*)/@@;
1504
1505 $p1_prefix = $1;
1506 if (!$file && $tree && $p1_prefix ne '' &&
1507 -e "$root/$p1_prefix") {
1508 WARN("PATCH_PREFIX",
1509 "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
1510 }
1511
1512 if ($realfile =~ m@^include/asm/@) {
1513 ERROR("MODIFIED_INCLUDE_ASM",
1514 "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
1515 }
1516 next;
1517 }
1518
1519 $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
1520
1521 my $hereline = "$here\n$rawline\n";
1522 my $herecurr = "$here\n$rawline\n";
1523 my $hereprev = "$here\n$prevrawline\n$rawline\n";
1524
1525 $cnt_lines++ if ($realcnt != 0);
1526
1527# Check for incorrect file permissions
1528 if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
1529 my $permhere = $here . "FILE: $realfile\n";
1530 if ($realfile =~ /(Makefile|Kconfig|\.c|\.h|\.S|\.tmpl)$/) {
1531 ERROR("EXECUTE_PERMISSIONS",
1532 "do not set execute permissions for source files\n" . $permhere);
1533 }
1534 }
1535
1536# Check the patch for a signoff:
1537 if ($line =~ /^\s*signed-off-by:/i) {
1538 $signoff++;
1539 }
1540
1541# Check signature styles
1542 if ($line =~ /^(\s*)($signature_tags)(\s*)(.*)/) {
1543 my $space_before = $1;
1544 my $sign_off = $2;
1545 my $space_after = $3;
1546 my $email = $4;
1547 my $ucfirst_sign_off = ucfirst(lc($sign_off));
1548
1549 if (defined $space_before && $space_before ne "") {
1550 WARN("BAD_SIGN_OFF",
1551 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr);
1552 }
1553 if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
1554 WARN("BAD_SIGN_OFF",
1555 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr);
1556 }
1557 if (!defined $space_after || $space_after ne " ") {
1558 WARN("BAD_SIGN_OFF",
1559 "Use a single space after $ucfirst_sign_off\n" . $herecurr);
1560 }
1561
1562 my ($email_name, $email_address, $comment) = parse_email($email);
1563 my $suggested_email = format_email(($email_name, $email_address));
1564 if ($suggested_email eq "") {
1565 ERROR("BAD_SIGN_OFF",
1566 "Unrecognized email address: '$email'\n" . $herecurr);
1567 } else {
1568 my $dequoted = $suggested_email;
1569 $dequoted =~ s/^"//;
1570 $dequoted =~ s/" </ </;
1571 # Don't force email to have quotes
1572 # Allow just an angle bracketed address
1573 if ("$dequoted$comment" ne $email &&
1574 "<$email_address>$comment" ne $email &&
1575 "$suggested_email$comment" ne $email) {
1576 WARN("BAD_SIGN_OFF",
1577 "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
1578 }
1579 }
1580 }
1581
1582# Check for wrappage within a valid hunk of the file
1583 if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
1584 ERROR("CORRUPTED_PATCH",
1585 "patch seems to be corrupt (line wrapped?)\n" .
1586 $herecurr) if (!$emitted_corrupt++);
1587 }
1588
1589# Check for absolute kernel paths.
1590 if ($tree) {
1591 while ($line =~ m{(?:^|\s)(/\S*)}g) {
1592 my $file = $1;
1593
1594 if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
1595 check_absolute_file($1, $herecurr)) {
1596 #
1597 } else {
1598 check_absolute_file($file, $herecurr);
1599 }
1600 }
1601 }
1602
1603# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
1604 if (($realfile =~ /^$/ || $line =~ /^\+/) &&
1605 $rawline !~ m/^$UTF8*$/) {
1606 my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
1607
1608 my $blank = copy_spacing($rawline);
1609 my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
1610 my $hereptr = "$hereline$ptr\n";
1611
1612 CHK("INVALID_UTF8",
1613 "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
1614 }
1615
1616# ignore non-hunk lines and lines being removed
1617 next if (!$hunk_line || $line =~ /^-/);
1618
1619#trailing whitespace
1620 if ($line =~ /^\+.*\015/) {
1621 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
1622 ERROR("DOS_LINE_ENDINGS",
1623 "DOS line endings\n" . $herevet);
1624
1625 } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
1626 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
1627 ERROR("TRAILING_WHITESPACE",
1628 "trailing whitespace\n" . $herevet);
1629 $rpt_cleaners = 1;
1630 }
1631
1632# check for Kconfig help text having a real description
1633# Only applies when adding the entry originally, after that we do not have
1634# sufficient context to determine whether it is indeed long enough.
1635 if ($realfile =~ /Kconfig/ &&
1636 $line =~ /\+\s*(?:---)?help(?:---)?$/) {
1637 my $length = 0;
1638 my $cnt = $realcnt;
1639 my $ln = $linenr + 1;
1640 my $f;
1641 my $is_end = 0;
1642 while ($cnt > 0 && defined $lines[$ln - 1]) {
1643 $f = $lines[$ln - 1];
1644 $cnt-- if ($lines[$ln - 1] !~ /^-/);
1645 $is_end = $lines[$ln - 1] =~ /^\+/;
1646 $ln++;
1647
1648 next if ($f =~ /^-/);
1649 $f =~ s/^.//;
1650 $f =~ s/#.*//;
1651 $f =~ s/^\s+//;
1652 next if ($f =~ /^$/);
1653 if ($f =~ /^\s*config\s/) {
1654 $is_end = 1;
1655 last;
1656 }
1657 $length++;
1658 }
1659 WARN("CONFIG_DESCRIPTION",
1660 "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_end && $length < 4);
1661 #print "is_end<$is_end> length<$length>\n";
1662 }
1663
1664# check we are in a valid source file if not then ignore this hunk
1665 next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
1666
1667#80 column limit
1668 if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
1669 $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
1670 !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
1671 $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
1672 $length > 80)
1673 {
1674 WARN("LONG_LINE",
1675 "line over 80 characters\n" . $herecurr);
1676 }
1677
1678# check for spaces before a quoted newline
1679 if ($rawline =~ /^.*\".*\s\\n/) {
1680 WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
1681 "unnecessary whitespace before a quoted newline\n" . $herecurr);
1682 }
1683
1684# check for adding lines without a newline.
1685 if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
1686 WARN("MISSING_EOF_NEWLINE",
1687 "adding a line without newline at end of file\n" . $herecurr);
1688 }
1689
1690# Blackfin: use hi/lo macros
1691 if ($realfile =~ m@arch/blackfin/.*\.S$@) {
1692 if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
1693 my $herevet = "$here\n" . cat_vet($line) . "\n";
1694 ERROR("LO_MACRO",
1695 "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
1696 }
1697 if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
1698 my $herevet = "$here\n" . cat_vet($line) . "\n";
1699 ERROR("HI_MACRO",
1700 "use the HI() macro, not (... >> 16)\n" . $herevet);
1701 }
1702 }
1703
1704# check we are in a valid source file C or perl if not then ignore this hunk
1705 next if ($realfile !~ /\.(h|c|pl)$/);
1706
1707# at the beginning of a line any tabs must come first and anything
1708# more than 8 must use tabs.
1709 if ($rawline =~ /^\+\s* \t\s*\S/ ||
1710 $rawline =~ /^\+\s* \s*/) {
1711 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
1712 ERROR("CODE_INDENT",
1713 "code indent should use tabs where possible\n" . $herevet);
1714 $rpt_cleaners = 1;
1715 }
1716
1717# check for space before tabs.
1718 if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
1719 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
1720 WARN("SPACE_BEFORE_TAB",
1721 "please, no space before tabs\n" . $herevet);
1722 }
1723
1724# check for spaces at the beginning of a line.
1725# Exceptions:
1726# 1) within comments
1727# 2) indented preprocessor commands
1728# 3) hanging labels
1729 if ($rawline =~ /^\+ / && $line !~ /\+ *(?:$;|#|$Ident:)/) {
1730 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
1731 WARN("LEADING_SPACE",
1732 "please, no spaces at the start of a line\n" . $herevet);
1733 }
1734
1735# check we are in a valid C source file if not then ignore this hunk
1736 next if ($realfile !~ /\.(h|c)$/);
1737
1738# check for RCS/CVS revision markers
1739 if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
1740 WARN("CVS_KEYWORD",
1741 "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
1742 }
1743
1744# Blackfin: don't use __builtin_bfin_[cs]sync
1745 if ($line =~ /__builtin_bfin_csync/) {
1746 my $herevet = "$here\n" . cat_vet($line) . "\n";
1747 ERROR("CSYNC",
1748 "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
1749 }
1750 if ($line =~ /__builtin_bfin_ssync/) {
1751 my $herevet = "$here\n" . cat_vet($line) . "\n";
1752 ERROR("SSYNC",
1753 "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
1754 }
1755
1756# Check for potential 'bare' types
1757 my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
1758 $realline_next);
1759 if ($realcnt && $line =~ /.\s*\S/) {
1760 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
1761 ctx_statement_block($linenr, $realcnt, 0);
1762 $stat =~ s/\n./\n /g;
1763 $cond =~ s/\n./\n /g;
1764
1765 # Find the real next line.
1766 $realline_next = $line_nr_next;
1767 if (defined $realline_next &&
1768 (!defined $lines[$realline_next - 1] ||
1769 substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
1770 $realline_next++;
1771 }
1772
1773 my $s = $stat;
1774 $s =~ s/{.*$//s;
1775
1776 # Ignore goto labels.
1777 if ($s =~ /$Ident:\*$/s) {
1778
1779 # Ignore functions being called
1780 } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
1781
1782 } elsif ($s =~ /^.\s*else\b/s) {
1783
1784 # declarations always start with types
1785 } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) {
1786 my $type = $1;
1787 $type =~ s/\s+/ /g;
1788 possible($type, "A:" . $s);
1789
1790 # definitions in global scope can only start with types
1791 } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
1792 possible($1, "B:" . $s);
1793 }
1794
1795 # any (foo ... *) is a pointer cast, and foo is a type
1796 while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
1797 possible($1, "C:" . $s);
1798 }
1799
1800 # Check for any sort of function declaration.
1801 # int foo(something bar, other baz);
1802 # void (*store_gdt)(x86_descr_ptr *);
1803 if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
1804 my ($name_len) = length($1);
1805
1806 my $ctx = $s;
1807 substr($ctx, 0, $name_len + 1, '');
1808 $ctx =~ s/\)[^\)]*$//;
1809
1810 for my $arg (split(/\s*,\s*/, $ctx)) {
1811 if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
1812
1813 possible($1, "D:" . $s);
1814 }
1815 }
1816 }
1817
1818 }
1819
1820#
1821# Checks which may be anchored in the context.
1822#
1823
1824# Check for switch () and associated case and default
1825# statements should be at the same indent.
1826 if ($line=~/\bswitch\s*\(.*\)/) {
1827 my $err = '';
1828 my $sep = '';
1829 my @ctx = ctx_block_outer($linenr, $realcnt);
1830 shift(@ctx);
1831 for my $ctx (@ctx) {
1832 my ($clen, $cindent) = line_stats($ctx);
1833 if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
1834 $indent != $cindent) {
1835 $err .= "$sep$ctx\n";
1836 $sep = '';
1837 } else {
1838 $sep = "[...]\n";
1839 }
1840 }
1841 if ($err ne '') {
1842 ERROR("SWITCH_CASE_INDENT_LEVEL",
1843 "switch and case should be at the same indent\n$hereline$err");
1844 }
1845 }
1846
1847# if/while/etc brace do not go on next line, unless defining a do while loop,
1848# or if that brace on the next line is for something else
1849 if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
1850 my $pre_ctx = "$1$2";
1851
1852 my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
1853 my $ctx_cnt = $realcnt - $#ctx - 1;
1854 my $ctx = join("\n", @ctx);
1855
1856 my $ctx_ln = $linenr;
1857 my $ctx_skip = $realcnt;
1858
1859 while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
1860 defined $lines[$ctx_ln - 1] &&
1861 $lines[$ctx_ln - 1] =~ /^-/)) {
1862 ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
1863 $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
1864 $ctx_ln++;
1865 }
1866
1867 #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
1868 #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
1869
1870 if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
1871 ERROR("OPEN_BRACE",
1872 "that open brace { should be on the previous line\n" .
1873 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
1874 }
1875 if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
1876 $ctx =~ /\)\s*\;\s*$/ &&
1877 defined $lines[$ctx_ln - 1])
1878 {
1879 my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
1880 if ($nindent > $indent) {
1881 WARN("TRAILING_SEMICOLON",
1882 "trailing semicolon indicates no statements, indent implies otherwise\n" .
1883 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
1884 }
1885 }
1886 }
1887
1888# Check relative indent for conditionals and blocks.
1889 if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
1890 my ($s, $c) = ($stat, $cond);
1891
1892 substr($s, 0, length($c), '');
1893
1894 # Make sure we remove the line prefixes as we have
1895 # none on the first line, and are going to readd them
1896 # where necessary.
1897 $s =~ s/\n./\n/gs;
1898
1899 # Find out how long the conditional actually is.
1900 my @newlines = ($c =~ /\n/gs);
1901 my $cond_lines = 1 + $#newlines;
1902
1903 # We want to check the first line inside the block
1904 # starting at the end of the conditional, so remove:
1905 # 1) any blank line termination
1906 # 2) any opening brace { on end of the line
1907 # 3) any do (...) {
1908 my $continuation = 0;
1909 my $check = 0;
1910 $s =~ s/^.*\bdo\b//;
1911 $s =~ s/^\s*{//;
1912 if ($s =~ s/^\s*\\//) {
1913 $continuation = 1;
1914 }
1915 if ($s =~ s/^\s*?\n//) {
1916 $check = 1;
1917 $cond_lines++;
1918 }
1919
1920 # Also ignore a loop construct at the end of a
1921 # preprocessor statement.
1922 if (($prevline =~ /^.\s*#\s*define\s/ ||
1923 $prevline =~ /\\\s*$/) && $continuation == 0) {
1924 $check = 0;
1925 }
1926
1927 my $cond_ptr = -1;
1928 $continuation = 0;
1929 while ($cond_ptr != $cond_lines) {
1930 $cond_ptr = $cond_lines;
1931
1932 # If we see an #else/#elif then the code
1933 # is not linear.
1934 if ($s =~ /^\s*\#\s*(?:else|elif)/) {
1935 $check = 0;
1936 }
1937
1938 # Ignore:
1939 # 1) blank lines, they should be at 0,
1940 # 2) preprocessor lines, and
1941 # 3) labels.
1942 if ($continuation ||
1943 $s =~ /^\s*?\n/ ||
1944 $s =~ /^\s*#\s*?/ ||
1945 $s =~ /^\s*$Ident\s*:/) {
1946 $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
1947 if ($s =~ s/^.*?\n//) {
1948 $cond_lines++;
1949 }
1950 }
1951 }
1952
1953 my (undef, $sindent) = line_stats("+" . $s);
1954 my $stat_real = raw_line($linenr, $cond_lines);
1955
1956 # Check if either of these lines are modified, else
1957 # this is not this patch's fault.
1958 if (!defined($stat_real) ||
1959 $stat !~ /^\+/ && $stat_real !~ /^\+/) {
1960 $check = 0;
1961 }
1962 if (defined($stat_real) && $cond_lines > 1) {
1963 $stat_real = "[...]\n$stat_real";
1964 }
1965
1966 #print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n";
1967
1968 if ($check && (($sindent % 8) != 0 ||
1969 ($sindent <= $indent && $s ne ''))) {
1970 WARN("SUSPECT_CODE_INDENT",
1971 "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
1972 }
1973 }
1974
1975 # Track the 'values' across context and added lines.
1976 my $opline = $line; $opline =~ s/^./ /;
1977 my ($curr_values, $curr_vars) =
1978 annotate_values($opline . "\n", $prev_values);
1979 $curr_values = $prev_values . $curr_values;
1980 if ($dbg_values) {
1981 my $outline = $opline; $outline =~ s/\t/ /g;
1982 print "$linenr > .$outline\n";
1983 print "$linenr > $curr_values\n";
1984 print "$linenr > $curr_vars\n";
1985 }
1986 $prev_values = substr($curr_values, -1);
1987
1988#ignore lines not being added
1989 if ($line=~/^[^\+]/) {next;}
1990
1991# TEST: allow direct testing of the type matcher.
1992 if ($dbg_type) {
1993 if ($line =~ /^.\s*$Declare\s*$/) {
1994 ERROR("TEST_TYPE",
1995 "TEST: is type\n" . $herecurr);
1996 } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
1997 ERROR("TEST_NOT_TYPE",
1998 "TEST: is not type ($1 is)\n". $herecurr);
1999 }
2000 next;
2001 }
2002# TEST: allow direct testing of the attribute matcher.
2003 if ($dbg_attr) {
2004 if ($line =~ /^.\s*$Modifier\s*$/) {
2005 ERROR("TEST_ATTR",
2006 "TEST: is attr\n" . $herecurr);
2007 } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
2008 ERROR("TEST_NOT_ATTR",
2009 "TEST: is not attr ($1 is)\n". $herecurr);
2010 }
2011 next;
2012 }
2013
2014# check for initialisation to aggregates open brace on the next line
2015 if ($line =~ /^.\s*{/ &&
2016 $prevline =~ /(?:^|[^=])=\s*$/) {
2017 ERROR("OPEN_BRACE",
2018 "that open brace { should be on the previous line\n" . $hereprev);
2019 }
2020
2021#
2022# Checks which are anchored on the added line.
2023#
2024
2025# check for malformed paths in #include statements (uses RAW line)
2026 if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
2027 my $path = $1;
2028 if ($path =~ m{//}) {
2029 ERROR("MALFORMED_INCLUDE",
2030 "malformed #include filename\n" .
2031 $herecurr);
2032 }
2033 }
2034
2035# no C99 // comments
2036 if ($line =~ m{//}) {
2037 ERROR("C99_COMMENTS",
2038 "do not use C99 // comments\n" . $herecurr);
2039 }
2040 # Remove C99 comments.
2041 $line =~ s@//.*@@;
2042 $opline =~ s@//.*@@;
2043
2044# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
2045# the whole statement.
2046#print "APW <$lines[$realline_next - 1]>\n";
2047 if (defined $realline_next &&
2048 exists $lines[$realline_next - 1] &&
2049 !defined $suppress_export{$realline_next} &&
2050 ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2051 $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2052 # Handle definitions which produce identifiers with
2053 # a prefix:
2054 # XXX(foo);
2055 # EXPORT_SYMBOL(something_foo);
2056 my $name = $1;
2057 if ($stat =~ /^.([A-Z_]+)\s*\(\s*($Ident)/ &&
2058 $name =~ /^${Ident}_$2/) {
2059#print "FOO C name<$name>\n";
2060 $suppress_export{$realline_next} = 1;
2061
2062 } elsif ($stat !~ /(?:
2063 \n.}\s*$|
2064 ^.DEFINE_$Ident\(\Q$name\E\)|
2065 ^.DECLARE_$Ident\(\Q$name\E\)|
2066 ^.LIST_HEAD\(\Q$name\E\)|
2067 ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
2068 \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
2069 )/x) {
2070#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
2071 $suppress_export{$realline_next} = 2;
2072 } else {
2073 $suppress_export{$realline_next} = 1;
2074 }
2075 }
2076 if (!defined $suppress_export{$linenr} &&
2077 $prevline =~ /^.\s*$/ &&
2078 ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2079 $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2080#print "FOO B <$lines[$linenr - 1]>\n";
2081 $suppress_export{$linenr} = 2;
2082 }
2083 if (defined $suppress_export{$linenr} &&
2084 $suppress_export{$linenr} == 2) {
2085 WARN("EXPORT_SYMBOL",
2086 "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
2087 }
2088
2089# check for global initialisers.
2090 if ($line =~ /^.$Type\s*$Ident\s*(?:\s+$Modifier)*\s*=\s*(0|NULL|false)\s*;/) {
2091 ERROR("GLOBAL_INITIALISERS",
2092 "do not initialise globals to 0 or NULL\n" .
2093 $herecurr);
2094 }
2095# check for static initialisers.
2096 if ($line =~ /\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
2097 ERROR("INITIALISED_STATIC",
2098 "do not initialise statics to 0 or NULL\n" .
2099 $herecurr);
2100 }
2101
2102# check for static const char * arrays.
2103 if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
2104 WARN("STATIC_CONST_CHAR_ARRAY",
2105 "static const char * array should probably be static const char * const\n" .
2106 $herecurr);
2107 }
2108
2109# check for static char foo[] = "bar" declarations.
2110 if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
2111 WARN("STATIC_CONST_CHAR_ARRAY",
2112 "static char array declaration should probably be static const char\n" .
2113 $herecurr);
2114 }
2115
2116# check for declarations of struct pci_device_id
2117 if ($line =~ /\bstruct\s+pci_device_id\s+\w+\s*\[\s*\]\s*\=\s*\{/) {
2118 WARN("DEFINE_PCI_DEVICE_TABLE",
2119 "Use DEFINE_PCI_DEVICE_TABLE for struct pci_device_id\n" . $herecurr);
2120 }
2121
2122# check for new typedefs, only function parameters and sparse annotations
2123# make sense.
2124 if ($line =~ /\btypedef\s/ &&
2125 $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
2126 $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
2127 $line !~ /\b$typeTypedefs\b/ &&
2128 $line !~ /\b__bitwise(?:__|)\b/) {
2129 WARN("NEW_TYPEDEFS",
2130 "do not add new typedefs\n" . $herecurr);
2131 }
2132
2133# * goes on variable not on type
2134 # (char*[ const])
2135 if ($line =~ m{\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\)}) {
2136 my ($from, $to) = ($1, $1);
2137
2138 # Should start with a space.
2139 $to =~ s/^(\S)/ $1/;
2140 # Should not end with a space.
2141 $to =~ s/\s+$//;
2142 # '*'s should not have spaces between.
2143 while ($to =~ s/\*\s+\*/\*\*/) {
2144 }
2145
2146 #print "from<$from> to<$to>\n";
2147 if ($from ne $to) {
2148 ERROR("POINTER_LOCATION",
2149 "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr);
2150 }
2151 } elsif ($line =~ m{\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident)}) {
2152 my ($from, $to, $ident) = ($1, $1, $2);
2153
2154 # Should start with a space.
2155 $to =~ s/^(\S)/ $1/;
2156 # Should not end with a space.
2157 $to =~ s/\s+$//;
2158 # '*'s should not have spaces between.
2159 while ($to =~ s/\*\s+\*/\*\*/) {
2160 }
2161 # Modifiers should have spaces.
2162 $to =~ s/(\b$Modifier$)/$1 /;
2163
2164 #print "from<$from> to<$to> ident<$ident>\n";
2165 if ($from ne $to && $ident !~ /^$Modifier$/) {
2166 ERROR("POINTER_LOCATION",
2167 "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr);
2168 }
2169 }
2170
2171# # no BUG() or BUG_ON()
2172# if ($line =~ /\b(BUG|BUG_ON)\b/) {
2173# print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n";
2174# print "$herecurr";
2175# $clean = 0;
2176# }
2177
2178 if ($line =~ /\bLINUX_VERSION_CODE\b/) {
2179 WARN("LINUX_VERSION_CODE",
2180 "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
2181 }
2182
2183# check for uses of printk_ratelimit
2184 if ($line =~ /\bprintk_ratelimit\s*\(/) {
2185 WARN("PRINTK_RATELIMITED",
2186"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
2187 }
2188
2189# printk should use KERN_* levels. Note that follow on printk's on the
2190# same line do not need a level, so we use the current block context
2191# to try and find and validate the current printk. In summary the current
2192# printk includes all preceding printk's which have no newline on the end.
2193# we assume the first bad printk is the one to report.
2194 if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
2195 my $ok = 0;
2196 for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
2197 #print "CHECK<$lines[$ln - 1]\n";
2198 # we have a preceding printk if it ends
2199 # with "\n" ignore it, else it is to blame
2200 if ($lines[$ln - 1] =~ m{\bprintk\(}) {
2201 if ($rawlines[$ln - 1] !~ m{\\n"}) {
2202 $ok = 1;
2203 }
2204 last;
2205 }
2206 }
2207 if ($ok == 0) {
2208 WARN("PRINTK_WITHOUT_KERN_LEVEL",
2209 "printk() should include KERN_ facility level\n" . $herecurr);
2210 }
2211 }
2212
2213# function brace can't be on same line, except for #defines of do while,
2214# or if closed on same line
2215 if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
2216 !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
2217 ERROR("OPEN_BRACE",
2218 "open brace '{' following function declarations go on the next line\n" . $herecurr);
2219 }
2220
2221# open braces for enum, union and struct go on the same line.
2222 if ($line =~ /^.\s*{/ &&
2223 $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
2224 ERROR("OPEN_BRACE",
2225 "open brace '{' following $1 go on the same line\n" . $hereprev);
2226 }
2227
2228# missing space after union, struct or enum definition
2229 if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?(?:\s+$Ident)?[=\{]/) {
2230 WARN("SPACING",
2231 "missing space after $1 definition\n" . $herecurr);
2232 }
2233
2234# check for spacing round square brackets; allowed:
2235# 1. with a type on the left -- int [] a;
2236# 2. at the beginning of a line for slice initialisers -- [0...10] = 5,
2237# 3. inside a curly brace -- = { [0...10] = 5 }
2238 while ($line =~ /(.*?\s)\[/g) {
2239 my ($where, $prefix) = ($-[1], $1);
2240 if ($prefix !~ /$Type\s+$/ &&
2241 ($where != 0 || $prefix !~ /^.\s+$/) &&
2242 $prefix !~ /{\s+$/) {
2243 ERROR("BRACKET_SPACE",
2244 "space prohibited before open square bracket '['\n" . $herecurr);
2245 }
2246 }
2247
2248# check for spaces between functions and their parentheses.
2249 while ($line =~ /($Ident)\s+\(/g) {
2250 my $name = $1;
2251 my $ctx_before = substr($line, 0, $-[1]);
2252 my $ctx = "$ctx_before$name";
2253
2254 # Ignore those directives where spaces _are_ permitted.
2255 if ($name =~ /^(?:
2256 if|for|while|switch|return|case|
2257 volatile|__volatile__|
2258 __attribute__|format|__extension__|
2259 asm|__asm__)$/x)
2260 {
2261
2262 # cpp #define statements have non-optional spaces, ie
2263 # if there is a space between the name and the open
2264 # parenthesis it is simply not a parameter group.
2265 } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
2266
2267 # cpp #elif statement condition may start with a (
2268 } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
2269
2270 # If this whole things ends with a type its most
2271 # likely a typedef for a function.
2272 } elsif ($ctx =~ /$Type$/) {
2273
2274 } else {
2275 WARN("SPACING",
2276 "space prohibited between function name and open parenthesis '('\n" . $herecurr);
2277 }
2278 }
2279# Check operator spacing.
2280 if (!($line=~/\#\s*include/)) {
2281 my $ops = qr{
2282 <<=|>>=|<=|>=|==|!=|
2283 \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
2284 =>|->|<<|>>|<|>|=|!|~|
2285 &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
2286 \?|:
2287 }x;
2288 my @elements = split(/($ops|;)/, $opline);
2289 my $off = 0;
2290
2291 my $blank = copy_spacing($opline);
2292
2293 for (my $n = 0; $n < $#elements; $n += 2) {
2294 $off += length($elements[$n]);
2295
2296 # Pick up the preceding and succeeding characters.
2297 my $ca = substr($opline, 0, $off);
2298 my $cc = '';
2299 if (length($opline) >= ($off + length($elements[$n + 1]))) {
2300 $cc = substr($opline, $off + length($elements[$n + 1]));
2301 }
2302 my $cb = "$ca$;$cc";
2303
2304 my $a = '';
2305 $a = 'V' if ($elements[$n] ne '');
2306 $a = 'W' if ($elements[$n] =~ /\s$/);
2307 $a = 'C' if ($elements[$n] =~ /$;$/);
2308 $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
2309 $a = 'O' if ($elements[$n] eq '');
2310 $a = 'E' if ($ca =~ /^\s*$/);
2311
2312 my $op = $elements[$n + 1];
2313
2314 my $c = '';
2315 if (defined $elements[$n + 2]) {
2316 $c = 'V' if ($elements[$n + 2] ne '');
2317 $c = 'W' if ($elements[$n + 2] =~ /^\s/);
2318 $c = 'C' if ($elements[$n + 2] =~ /^$;/);
2319 $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
2320 $c = 'O' if ($elements[$n + 2] eq '');
2321 $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
2322 } else {
2323 $c = 'E';
2324 }
2325
2326 my $ctx = "${a}x${c}";
2327
2328 my $at = "(ctx:$ctx)";
2329
2330 my $ptr = substr($blank, 0, $off) . "^";
2331 my $hereptr = "$hereline$ptr\n";
2332
2333 # Pull out the value of this operator.
2334 my $op_type = substr($curr_values, $off + 1, 1);
2335
2336 # Get the full operator variant.
2337 my $opv = $op . substr($curr_vars, $off, 1);
2338
2339 # Ignore operators passed as parameters.
2340 if ($op_type ne 'V' &&
2341 $ca =~ /\s$/ && $cc =~ /^\s*,/) {
2342
2343# # Ignore comments
2344# } elsif ($op =~ /^$;+$/) {
2345
2346 # ; should have either the end of line or a space or \ after it
2347 } elsif ($op eq ';') {
2348 if ($ctx !~ /.x[WEBC]/ &&
2349 $cc !~ /^\\/ && $cc !~ /^;/) {
2350 ERROR("SPACING",
2351 "space required after that '$op' $at\n" . $hereptr);
2352 }
2353
2354 # // is a comment
2355 } elsif ($op eq '//') {
2356
2357 # No spaces for:
2358 # ->
2359 # : when part of a bitfield
2360 } elsif ($op eq '->' || $opv eq ':B') {
2361 if ($ctx =~ /Wx.|.xW/) {
2362 ERROR("SPACING",
2363 "spaces prohibited around that '$op' $at\n" . $hereptr);
2364 }
2365
2366 # , must have a space on the right.
2367 } elsif ($op eq ',') {
2368 if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
2369 ERROR("SPACING",
2370 "space required after that '$op' $at\n" . $hereptr);
2371 }
2372
2373 # '*' as part of a type definition -- reported already.
2374 } elsif ($opv eq '*_') {
2375 #warn "'*' is part of type\n";
2376
2377 # unary operators should have a space before and
2378 # none after. May be left adjacent to another
2379 # unary operator, or a cast
2380 } elsif ($op eq '!' || $op eq '~' ||
2381 $opv eq '*U' || $opv eq '-U' ||
2382 $opv eq '&U' || $opv eq '&&U') {
2383 if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
2384 ERROR("SPACING",
2385 "space required before that '$op' $at\n" . $hereptr);
2386 }
2387 if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
2388 # A unary '*' may be const
2389
2390 } elsif ($ctx =~ /.xW/) {
2391 ERROR("SPACING",
2392 "space prohibited after that '$op' $at\n" . $hereptr);
2393 }
2394
2395 # unary ++ and unary -- are allowed no space on one side.
2396 } elsif ($op eq '++' or $op eq '--') {
2397 if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
2398 ERROR("SPACING",
2399 "space required one side of that '$op' $at\n" . $hereptr);
2400 }
2401 if ($ctx =~ /Wx[BE]/ ||
2402 ($ctx =~ /Wx./ && $cc =~ /^;/)) {
2403 ERROR("SPACING",
2404 "space prohibited before that '$op' $at\n" . $hereptr);
2405 }
2406 if ($ctx =~ /ExW/) {
2407 ERROR("SPACING",
2408 "space prohibited after that '$op' $at\n" . $hereptr);
2409 }
2410
2411
2412 # << and >> may either have or not have spaces both sides
2413 } elsif ($op eq '<<' or $op eq '>>' or
2414 $op eq '&' or $op eq '^' or $op eq '|' or
2415 $op eq '+' or $op eq '-' or
2416 $op eq '*' or $op eq '/' or
2417 $op eq '%')
2418 {
2419 if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
2420 ERROR("SPACING",
2421 "need consistent spacing around '$op' $at\n" .
2422 $hereptr);
2423 }
2424
2425 # A colon needs no spaces before when it is
2426 # terminating a case value or a label.
2427 } elsif ($opv eq ':C' || $opv eq ':L') {
2428 if ($ctx =~ /Wx./) {
2429 ERROR("SPACING",
2430 "space prohibited before that '$op' $at\n" . $hereptr);
2431 }
2432
2433 # All the others need spaces both sides.
2434 } elsif ($ctx !~ /[EWC]x[CWE]/) {
2435 my $ok = 0;
2436
2437 # Ignore email addresses <foo@bar>
2438 if (($op eq '<' &&
2439 $cc =~ /^\S+\@\S+>/) ||
2440 ($op eq '>' &&
2441 $ca =~ /<\S+\@\S+$/))
2442 {
2443 $ok = 1;
2444 }
2445
2446 # Ignore ?:
2447 if (($opv eq ':O' && $ca =~ /\?$/) ||
2448 ($op eq '?' && $cc =~ /^:/)) {
2449 $ok = 1;
2450 }
2451
2452 if ($ok == 0) {
2453 ERROR("SPACING",
2454 "spaces required around that '$op' $at\n" . $hereptr);
2455 }
2456 }
2457 $off += length($elements[$n + 1]);
2458 }
2459 }
2460
2461# check for multiple assignments
2462 if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
2463 CHK("MULTIPLE_ASSIGNMENTS",
2464 "multiple assignments should be avoided\n" . $herecurr);
2465 }
2466
2467## # check for multiple declarations, allowing for a function declaration
2468## # continuation.
2469## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
2470## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
2471##
2472## # Remove any bracketed sections to ensure we do not
2473## # falsly report the parameters of functions.
2474## my $ln = $line;
2475## while ($ln =~ s/\([^\(\)]*\)//g) {
2476## }
2477## if ($ln =~ /,/) {
2478## WARN("MULTIPLE_DECLARATION",
2479## "declaring multiple variables together should be avoided\n" . $herecurr);
2480## }
2481## }
2482
2483#need space before brace following if, while, etc
2484 if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
2485 $line =~ /do{/) {
2486 ERROR("SPACING",
2487 "space required before the open brace '{'\n" . $herecurr);
2488 }
2489
2490# closing brace should have a space following it when it has anything
2491# on the line
2492 if ($line =~ /}(?!(?:,|;|\)))\S/) {
2493 ERROR("SPACING",
2494 "space required after that close brace '}'\n" . $herecurr);
2495 }
2496
2497# check spacing on square brackets
2498 if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
2499 ERROR("SPACING",
2500 "space prohibited after that open square bracket '['\n" . $herecurr);
2501 }
2502 if ($line =~ /\s\]/) {
2503 ERROR("SPACING",
2504 "space prohibited before that close square bracket ']'\n" . $herecurr);
2505 }
2506
2507# check spacing on parentheses
2508 if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
2509 $line !~ /for\s*\(\s+;/) {
2510 ERROR("SPACING",
2511 "space prohibited after that open parenthesis '('\n" . $herecurr);
2512 }
2513 if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
2514 $line !~ /for\s*\(.*;\s+\)/ &&
2515 $line !~ /:\s+\)/) {
2516 ERROR("SPACING",
2517 "space prohibited before that close parenthesis ')'\n" . $herecurr);
2518 }
2519
2520#goto labels aren't indented, allow a single space however
2521 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
2522 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
2523 WARN("INDENTED_LABEL",
2524 "labels should not be indented\n" . $herecurr);
2525 }
2526
2527# Return is not a function.
2528 if (defined($stat) && $stat =~ /^.\s*return(\s*)(\(.*);/s) {
2529 my $spacing = $1;
2530 my $value = $2;
2531
2532 # Flatten any parentheses
2533 $value =~ s/\(/ \(/g;
2534 $value =~ s/\)/\) /g;
2535 while ($value =~ s/\[[^\{\}]*\]/1/ ||
2536 $value !~ /(?:$Ident|-?$Constant)\s*
2537 $Compare\s*
2538 (?:$Ident|-?$Constant)/x &&
2539 $value =~ s/\([^\(\)]*\)/1/) {
2540 }
2541#print "value<$value>\n";
2542 if ($value =~ /^\s*(?:$Ident|-?$Constant)\s*$/) {
2543 ERROR("RETURN_PARENTHESES",
2544 "return is not a function, parentheses are not required\n" . $herecurr);
2545
2546 } elsif ($spacing !~ /\s+/) {
2547 ERROR("SPACING",
2548 "space required before the open parenthesis '('\n" . $herecurr);
2549 }
2550 }
2551# Return of what appears to be an errno should normally be -'ve
2552 if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
2553 my $name = $1;
2554 if ($name ne 'EOF' && $name ne 'ERROR') {
2555 WARN("USE_NEGATIVE_ERRNO",
2556 "return of an errno should typically be -ve (return -$1)\n" . $herecurr);
2557 }
2558 }
2559
2560# typecasts on min/max could be min_t/max_t
2561 if ($line =~ /^\+(?:.*?)\b(min|max)\s*\($Typecast{0,1}($LvalOrFunc)\s*,\s*$Typecast{0,1}($LvalOrFunc)\s*\)/) {
2562 if (defined $2 || defined $8) {
2563 my $call = $1;
2564 my $cast1 = deparenthesize($2);
2565 my $arg1 = $3;
2566 my $cast2 = deparenthesize($8);
2567 my $arg2 = $9;
2568 my $cast;
2569
2570 if ($cast1 ne "" && $cast2 ne "") {
2571 $cast = "$cast1 or $cast2";
2572 } elsif ($cast1 ne "") {
2573 $cast = $cast1;
2574 } else {
2575 $cast = $cast2;
2576 }
2577 WARN("MINMAX",
2578 "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . $herecurr);
2579 }
2580 }
2581
2582# Need a space before open parenthesis after if, while etc
2583 if ($line=~/\b(if|while|for|switch)\(/) {
2584 ERROR("SPACING", "space required before the open parenthesis '('\n" . $herecurr);
2585 }
2586
2587# Check for illegal assignment in if conditional -- and check for trailing
2588# statements after the conditional.
2589 if ($line =~ /do\s*(?!{)/) {
2590 my ($stat_next) = ctx_statement_block($line_nr_next,
2591 $remain_next, $off_next);
2592 $stat_next =~ s/\n./\n /g;
2593 ##print "stat<$stat> stat_next<$stat_next>\n";
2594
2595 if ($stat_next =~ /^\s*while\b/) {
2596 # If the statement carries leading newlines,
2597 # then count those as offsets.
2598 my ($whitespace) =
2599 ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
2600 my $offset =
2601 statement_rawlines($whitespace) - 1;
2602
2603 $suppress_whiletrailers{$line_nr_next +
2604 $offset} = 1;
2605 }
2606 }
2607 if (!defined $suppress_whiletrailers{$linenr} &&
2608 $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
2609 my ($s, $c) = ($stat, $cond);
2610
2611 if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
2612 ERROR("ASSIGN_IN_IF",
2613 "do not use assignment in if condition\n" . $herecurr);
2614 }
2615
2616 # Find out what is on the end of the line after the
2617 # conditional.
2618 substr($s, 0, length($c), '');
2619 $s =~ s/\n.*//g;
2620 $s =~ s/$;//g; # Remove any comments
2621 if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
2622 $c !~ /}\s*while\s*/)
2623 {
2624 # Find out how long the conditional actually is.
2625 my @newlines = ($c =~ /\n/gs);
2626 my $cond_lines = 1 + $#newlines;
2627 my $stat_real = '';
2628
2629 $stat_real = raw_line($linenr, $cond_lines)
2630 . "\n" if ($cond_lines);
2631 if (defined($stat_real) && $cond_lines > 1) {
2632 $stat_real = "[...]\n$stat_real";
2633 }
2634
2635 ERROR("TRAILING_STATEMENTS",
2636 "trailing statements should be on next line\n" . $herecurr . $stat_real);
2637 }
2638 }
2639
2640# Check for bitwise tests written as boolean
2641 if ($line =~ /
2642 (?:
2643 (?:\[|\(|\&\&|\|\|)
2644 \s*0[xX][0-9]+\s*
2645 (?:\&\&|\|\|)
2646 |
2647 (?:\&\&|\|\|)
2648 \s*0[xX][0-9]+\s*
2649 (?:\&\&|\|\||\)|\])
2650 )/x)
2651 {
2652 WARN("HEXADECIMAL_BOOLEAN_TEST",
2653 "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
2654 }
2655
2656# if and else should not have general statements after it
2657 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
2658 my $s = $1;
2659 $s =~ s/$;//g; # Remove any comments
2660 if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
2661 ERROR("TRAILING_STATEMENTS",
2662 "trailing statements should be on next line\n" . $herecurr);
2663 }
2664 }
2665# if should not continue a brace
2666 if ($line =~ /}\s*if\b/) {
2667 ERROR("TRAILING_STATEMENTS",
2668 "trailing statements should be on next line\n" .
2669 $herecurr);
2670 }
2671# case and default should not have general statements after them
2672 if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
2673 $line !~ /\G(?:
2674 (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
2675 \s*return\s+
2676 )/xg)
2677 {
2678 ERROR("TRAILING_STATEMENTS",
2679 "trailing statements should be on next line\n" . $herecurr);
2680 }
2681
2682 # Check for }<nl>else {, these must be at the same
2683 # indent level to be relevant to each other.
2684 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
2685 $previndent == $indent) {
2686 ERROR("ELSE_AFTER_BRACE",
2687 "else should follow close brace '}'\n" . $hereprev);
2688 }
2689
2690 if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
2691 $previndent == $indent) {
2692 my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
2693
2694 # Find out what is on the end of the line after the
2695 # conditional.
2696 substr($s, 0, length($c), '');
2697 $s =~ s/\n.*//g;
2698
2699 if ($s =~ /^\s*;/) {
2700 ERROR("WHILE_AFTER_BRACE",
2701 "while should follow close brace '}'\n" . $hereprev);
2702 }
2703 }
2704
2705#studly caps, commented out until figure out how to distinguish between use of existing and adding new
2706# if (($line=~/[\w_][a-z\d]+[A-Z]/) and !($line=~/print/)) {
2707# print "No studly caps, use _\n";
2708# print "$herecurr";
2709# $clean = 0;
2710# }
2711
2712#no spaces allowed after \ in define
2713 if ($line=~/\#\s*define.*\\\s$/) {
2714 WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
2715 "Whitepspace after \\ makes next lines useless\n" . $herecurr);
2716 }
2717
2718#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
2719 if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
2720 my $file = "$1.h";
2721 my $checkfile = "include/linux/$file";
2722 if (-f "$root/$checkfile" &&
2723 $realfile ne $checkfile &&
2724 $1 !~ /$allowed_asm_includes/)
2725 {
2726 if ($realfile =~ m{^arch/}) {
2727 CHK("ARCH_INCLUDE_LINUX",
2728 "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
2729 } else {
2730 WARN("INCLUDE_LINUX",
2731 "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
2732 }
2733 }
2734 }
2735
2736# multi-statement macros should be enclosed in a do while loop, grab the
2737# first statement and ensure its the whole macro if its not enclosed
2738# in a known good container
2739 if ($realfile !~ m@/vmlinux.lds.h$@ &&
2740 $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
2741 my $ln = $linenr;
2742 my $cnt = $realcnt;
2743 my ($off, $dstat, $dcond, $rest);
2744 my $ctx = '';
2745
2746 my $args = defined($1);
2747
2748 # Find the end of the macro and limit our statement
2749 # search to that.
2750 while ($cnt > 0 && defined $lines[$ln - 1] &&
2751 $lines[$ln - 1] =~ /^(?:-|..*\\$)/)
2752 {
2753 $ctx .= $rawlines[$ln - 1] . "\n";
2754 $cnt-- if ($lines[$ln - 1] !~ /^-/);
2755 $ln++;
2756 }
2757 $ctx .= $rawlines[$ln - 1];
2758
2759 ($dstat, $dcond, $ln, $cnt, $off) =
2760 ctx_statement_block($linenr, $ln - $linenr + 1, 0);
2761 #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
2762 #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
2763
2764 # Extract the remainder of the define (if any) and
2765 # rip off surrounding spaces, and trailing \'s.
2766 $rest = '';
2767 while ($off != 0 || ($cnt > 0 && $rest =~ /\\\s*$/)) {
2768 #print "ADDING cnt<$cnt> $off <" . substr($lines[$ln - 1], $off) . "> rest<$rest>\n";
2769 if ($off != 0 || $lines[$ln - 1] !~ /^-/) {
2770 $rest .= substr($lines[$ln - 1], $off) . "\n";
2771 $cnt--;
2772 }
2773 $ln++;
2774 $off = 0;
2775 }
2776 $rest =~ s/\\\n.//g;
2777 $rest =~ s/^\s*//s;
2778 $rest =~ s/\s*$//s;
2779
2780 # Clean up the original statement.
2781 if ($args) {
2782 substr($dstat, 0, length($dcond), '');
2783 } else {
2784 $dstat =~ s/^.\s*\#\s*define\s+$Ident\s*//;
2785 }
2786 $dstat =~ s/$;//g;
2787 $dstat =~ s/\\\n.//g;
2788 $dstat =~ s/^\s*//s;
2789 $dstat =~ s/\s*$//s;
2790
2791 # Flatten any parentheses and braces
2792 while ($dstat =~ s/\([^\(\)]*\)/1/ ||
2793 $dstat =~ s/\{[^\{\}]*\}/1/ ||
2794 $dstat =~ s/\[[^\{\}]*\]/1/)
2795 {
2796 }
2797
2798 my $exceptions = qr{
2799 $Declare|
2800 module_param_named|
2801 MODULE_PARAM_DESC|
2802 DECLARE_PER_CPU|
2803 DEFINE_PER_CPU|
2804 __typeof__\(|
2805 union|
2806 struct|
2807 \.$Ident\s*=\s*|
2808 ^\"|\"$
2809 }x;
2810 #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
2811 if ($rest ne '' && $rest ne ',') {
2812 if ($rest !~ /while\s*\(/ &&
2813 $dstat !~ /$exceptions/)
2814 {
2815 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
2816 "Macros with multiple statements should be enclosed in a do - while loop\n" . "$here\n$ctx\n");
2817 }
2818
2819 } elsif ($ctx !~ /;/) {
2820 if ($dstat ne '' &&
2821 $dstat !~ /^(?:$Ident|-?$Constant)$/ &&
2822 $dstat !~ /$exceptions/ &&
2823 $dstat !~ /^\.$Ident\s*=/ &&
2824 $dstat =~ /$Operators/)
2825 {
2826 ERROR("COMPLEX_MACRO",
2827 "Macros with complex values should be enclosed in parenthesis\n" . "$here\n$ctx\n");
2828 }
2829 }
2830 }
2831
2832# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
2833# all assignments may have only one of the following with an assignment:
2834# .
2835# ALIGN(...)
2836# VMLINUX_SYMBOL(...)
2837 if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
2838 WARN("MISSING_VMLINUX_SYMBOL",
2839 "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
2840 }
2841
2842# check for redundant bracing round if etc
2843 if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
2844 my ($level, $endln, @chunks) =
2845 ctx_statement_full($linenr, $realcnt, 1);
2846 #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
2847 #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
2848 if ($#chunks > 0 && $level == 0) {
2849 my $allowed = 0;
2850 my $seen = 0;
2851 my $herectx = $here . "\n";
2852 my $ln = $linenr - 1;
2853 for my $chunk (@chunks) {
2854 my ($cond, $block) = @{$chunk};
2855
2856 # If the condition carries leading newlines, then count those as offsets.
2857 my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
2858 my $offset = statement_rawlines($whitespace) - 1;
2859
2860 #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
2861
2862 # We have looked at and allowed this specific line.
2863 $suppress_ifbraces{$ln + $offset} = 1;
2864
2865 $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
2866 $ln += statement_rawlines($block) - 1;
2867
2868 substr($block, 0, length($cond), '');
2869
2870 $seen++ if ($block =~ /^\s*{/);
2871
2872 #print "cond<$cond> block<$block> allowed<$allowed>\n";
2873 if (statement_lines($cond) > 1) {
2874 #print "APW: ALLOWED: cond<$cond>\n";
2875 $allowed = 1;
2876 }
2877 if ($block =~/\b(?:if|for|while)\b/) {
2878 #print "APW: ALLOWED: block<$block>\n";
2879 $allowed = 1;
2880 }
2881 if (statement_block_size($block) > 1) {
2882 #print "APW: ALLOWED: lines block<$block>\n";
2883 $allowed = 1;
2884 }
2885 }
2886 if ($seen && !$allowed) {
2887 WARN("BRACES",
2888 "braces {} are not necessary for any arm of this statement\n" . $herectx);
2889 }
2890 }
2891 }
2892 if (!defined $suppress_ifbraces{$linenr - 1} &&
2893 $line =~ /\b(if|while|for|else)\b/) {
2894 my $allowed = 0;
2895
2896 # Check the pre-context.
2897 if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
2898 #print "APW: ALLOWED: pre<$1>\n";
2899 $allowed = 1;
2900 }
2901
2902 my ($level, $endln, @chunks) =
2903 ctx_statement_full($linenr, $realcnt, $-[0]);
2904
2905 # Check the condition.
2906 my ($cond, $block) = @{$chunks[0]};
2907 #print "CHECKING<$linenr> cond<$cond> block<$block>\n";
2908 if (defined $cond) {
2909 substr($block, 0, length($cond), '');
2910 }
2911 if (statement_lines($cond) > 1) {
2912 #print "APW: ALLOWED: cond<$cond>\n";
2913 $allowed = 1;
2914 }
2915 if ($block =~/\b(?:if|for|while)\b/) {
2916 #print "APW: ALLOWED: block<$block>\n";
2917 $allowed = 1;
2918 }
2919 if (statement_block_size($block) > 1) {
2920 #print "APW: ALLOWED: lines block<$block>\n";
2921 $allowed = 1;
2922 }
2923 # Check the post-context.
2924 if (defined $chunks[1]) {
2925 my ($cond, $block) = @{$chunks[1]};
2926 if (defined $cond) {
2927 substr($block, 0, length($cond), '');
2928 }
2929 if ($block =~ /^\s*\{/) {
2930 #print "APW: ALLOWED: chunk-1 block<$block>\n";
2931 $allowed = 1;
2932 }
2933 }
2934 if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
2935 my $herectx = $here . "\n";;
2936 my $cnt = statement_rawlines($block);
2937
2938 for (my $n = 0; $n < $cnt; $n++) {
2939 $herectx .= raw_line($linenr, $n) . "\n";;
2940 }
2941
2942 WARN("BRACES",
2943 "braces {} are not necessary for single statement blocks\n" . $herectx);
2944 }
2945 }
2946
2947# don't include deprecated include files (uses RAW line)
2948 for my $inc (@dep_includes) {
2949 if ($rawline =~ m@^.\s*\#\s*include\s*\<$inc>@) {
2950 ERROR("DEPRECATED_INCLUDE",
2951 "Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n" . $herecurr);
2952 }
2953 }
2954
2955# don't use deprecated functions
2956 for my $func (@dep_functions) {
2957 if ($line =~ /\b$func\b/) {
2958 ERROR("DEPRECATED_FUNCTION",
2959 "Don't use $func(): see Documentation/feature-removal-schedule.txt\n" . $herecurr);
2960 }
2961 }
2962
2963# no volatiles please
2964 my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
2965 if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
2966 WARN("VOLATILE",
2967 "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
2968 }
2969
2970# warn about #if 0
2971 if ($line =~ /^.\s*\#\s*if\s+0\b/) {
2972 CHK("REDUNDANT_CODE",
2973 "if this code is redundant consider removing it\n" .
2974 $herecurr);
2975 }
2976
2977# check for needless kfree() checks
2978 if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
2979 my $expr = $1;
2980 if ($line =~ /\bkfree\(\Q$expr\E\);/) {
2981 WARN("NEEDLESS_KFREE",
2982 "kfree(NULL) is safe this check is probably not required\n" . $hereprev);
2983 }
2984 }
2985# check for needless usb_free_urb() checks
2986 if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
2987 my $expr = $1;
2988 if ($line =~ /\busb_free_urb\(\Q$expr\E\);/) {
2989 WARN("NEEDLESS_USB_FREE_URB",
2990 "usb_free_urb(NULL) is safe this check is probably not required\n" . $hereprev);
2991 }
2992 }
2993
2994# prefer usleep_range over udelay
2995 if ($line =~ /\budelay\s*\(\s*(\w+)\s*\)/) {
2996 # ignore udelay's < 10, however
2997 if (! (($1 =~ /(\d+)/) && ($1 < 10)) ) {
2998 CHK("USLEEP_RANGE",
2999 "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $line);
3000 }
3001 }
3002
3003# warn about unexpectedly long msleep's
3004 if ($line =~ /\bmsleep\s*\((\d+)\);/) {
3005 if ($1 < 20) {
3006 WARN("MSLEEP",
3007 "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $line);
3008 }
3009 }
3010
3011# warn about #ifdefs in C files
3012# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
3013# print "#ifdef in C files should be avoided\n";
3014# print "$herecurr";
3015# $clean = 0;
3016# }
3017
3018# warn about spacing in #ifdefs
3019 if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
3020 ERROR("SPACING",
3021 "exactly one space required after that #$1\n" . $herecurr);
3022 }
3023
3024# check for spinlock_t definitions without a comment.
3025 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
3026 $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
3027 my $which = $1;
3028 if (!ctx_has_comment($first_line, $linenr)) {
3029 CHK("UNCOMMENTED_DEFINITION",
3030 "$1 definition without comment\n" . $herecurr);
3031 }
3032 }
3033# check for memory barriers without a comment.
3034 if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
3035 if (!ctx_has_comment($first_line, $linenr)) {
3036 CHK("MEMORY_BARRIER",
3037 "memory barrier without comment\n" . $herecurr);
3038 }
3039 }
3040# check of hardware specific defines
3041 if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
3042 CHK("ARCH_DEFINES",
3043 "architecture specific defines should be avoided\n" . $herecurr);
3044 }
3045
3046# Check that the storage class is at the beginning of a declaration
3047 if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
3048 WARN("STORAGE_CLASS",
3049 "storage class should be at the beginning of the declaration\n" . $herecurr)
3050 }
3051
3052# check the location of the inline attribute, that it is between
3053# storage class and type.
3054 if ($line =~ /\b$Type\s+$Inline\b/ ||
3055 $line =~ /\b$Inline\s+$Storage\b/) {
3056 ERROR("INLINE_LOCATION",
3057 "inline keyword should sit between storage class and type\n" . $herecurr);
3058 }
3059
3060# Check for __inline__ and __inline, prefer inline
3061 if ($line =~ /\b(__inline__|__inline)\b/) {
3062 WARN("INLINE",
3063 "plain inline is preferred over $1\n" . $herecurr);
3064 }
3065
3066# Check for __attribute__ packed, prefer __packed
3067 if ($line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
3068 WARN("PREFER_PACKED",
3069 "__packed is preferred over __attribute__((packed))\n" . $herecurr);
3070 }
3071
3072# Check for __attribute__ aligned, prefer __aligned
3073 if ($line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
3074 WARN("PREFER_ALIGNED",
3075 "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
3076 }
3077
3078# check for sizeof(&)
3079 if ($line =~ /\bsizeof\s*\(\s*\&/) {
3080 WARN("SIZEOF_ADDRESS",
3081 "sizeof(& should be avoided\n" . $herecurr);
3082 }
3083
3084# check for line continuations in quoted strings with odd counts of "
3085 if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
3086 WARN("LINE_CONTINUATIONS",
3087 "Avoid line continuations in quoted strings\n" . $herecurr);
3088 }
3089
3090# check for new externs in .c files.
3091 if ($realfile =~ /\.c$/ && defined $stat &&
3092 $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
3093 {
3094 my $function_name = $1;
3095 my $paren_space = $2;
3096
3097 my $s = $stat;
3098 if (defined $cond) {
3099 substr($s, 0, length($cond), '');
3100 }
3101 if ($s =~ /^\s*;/ &&
3102 $function_name ne 'uninitialized_var')
3103 {
3104 WARN("AVOID_EXTERNS",
3105 "externs should be avoided in .c files\n" . $herecurr);
3106 }
3107
3108 if ($paren_space =~ /\n/) {
3109 WARN("FUNCTION_ARGUMENTS",
3110 "arguments for function declarations should follow identifier\n" . $herecurr);
3111 }
3112
3113 } elsif ($realfile =~ /\.c$/ && defined $stat &&
3114 $stat =~ /^.\s*extern\s+/)
3115 {
3116 WARN("AVOID_EXTERNS",
3117 "externs should be avoided in .c files\n" . $herecurr);
3118 }
3119
3120# checks for new __setup's
3121 if ($rawline =~ /\b__setup\("([^"]*)"/) {
3122 my $name = $1;
3123
3124 if (!grep(/$name/, @setup_docs)) {
3125 CHK("UNDOCUMENTED_SETUP",
3126 "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
3127 }
3128 }
3129
3130# check for pointless casting of kmalloc return
3131 if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
3132 WARN("UNNECESSARY_CASTS",
3133 "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
3134 }
3135
3136# check for multiple semicolons
3137 if ($line =~ /;\s*;\s*$/) {
3138 WARN("ONE_SEMICOLON",
3139 "Statements terminations use 1 semicolon\n" . $herecurr);
3140 }
3141
3142# check for gcc specific __FUNCTION__
3143 if ($line =~ /__FUNCTION__/) {
3144 WARN("USE_FUNC",
3145 "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr);
3146 }
3147
3148# check for semaphores initialized locked
3149 if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
3150 WARN("CONSIDER_COMPLETION",
3151 "consider using a completion\n" . $herecurr);
3152
3153 }
3154# recommend kstrto* over simple_strto*
3155 if ($line =~ /\bsimple_(strto.*?)\s*\(/) {
3156 WARN("CONSIDER_KSTRTO",
3157 "consider using kstrto* in preference to simple_$1\n" . $herecurr);
3158 }
3159# check for __initcall(), use device_initcall() explicitly please
3160 if ($line =~ /^.\s*__initcall\s*\(/) {
3161 WARN("USE_DEVICE_INITCALL",
3162 "please use device_initcall() instead of __initcall()\n" . $herecurr);
3163 }
3164# check for various ops structs, ensure they are const.
3165 my $struct_ops = qr{acpi_dock_ops|
3166 address_space_operations|
3167 backlight_ops|
3168 block_device_operations|
3169 dentry_operations|
3170 dev_pm_ops|
3171 dma_map_ops|
3172 extent_io_ops|
3173 file_lock_operations|
3174 file_operations|
3175 hv_ops|
3176 ide_dma_ops|
3177 intel_dvo_dev_ops|
3178 item_operations|
3179 iwl_ops|
3180 kgdb_arch|
3181 kgdb_io|
3182 kset_uevent_ops|
3183 lock_manager_operations|
3184 microcode_ops|
3185 mtrr_ops|
3186 neigh_ops|
3187 nlmsvc_binding|
3188 pci_raw_ops|
3189 pipe_buf_operations|
3190 platform_hibernation_ops|
3191 platform_suspend_ops|
3192 proto_ops|
3193 rpc_pipe_ops|
3194 seq_operations|
3195 snd_ac97_build_ops|
3196 soc_pcmcia_socket_ops|
3197 stacktrace_ops|
3198 sysfs_ops|
3199 tty_operations|
3200 usb_mon_operations|
3201 wd_ops}x;
3202 if ($line !~ /\bconst\b/ &&
3203 $line =~ /\bstruct\s+($struct_ops)\b/) {
3204 WARN("CONST_STRUCT",
3205 "struct $1 should normally be const\n" .
3206 $herecurr);
3207 }
3208
3209# use of NR_CPUS is usually wrong
3210# ignore definitions of NR_CPUS and usage to define arrays as likely right
3211 if ($line =~ /\bNR_CPUS\b/ &&
3212 $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
3213 $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
3214 $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
3215 $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
3216 $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
3217 {
3218 WARN("NR_CPUS",
3219 "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
3220 }
3221
3222# check for %L{u,d,i} in strings
3223 my $string;
3224 while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
3225 $string = substr($rawline, $-[1], $+[1] - $-[1]);
3226 $string =~ s/%%/__/g;
3227 if ($string =~ /(?<!%)%L[udi]/) {
3228 WARN("PRINTF_L",
3229 "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
3230 last;
3231 }
3232 }
3233
3234# whine mightly about in_atomic
3235 if ($line =~ /\bin_atomic\s*\(/) {
3236 if ($realfile =~ m@^drivers/@) {
3237 ERROR("IN_ATOMIC",
3238 "do not use in_atomic in drivers\n" . $herecurr);
3239 } elsif ($realfile !~ m@^kernel/@) {
3240 WARN("IN_ATOMIC",
3241 "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
3242 }
3243 }
3244
3245# check for lockdep_set_novalidate_class
3246 if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
3247 $line =~ /__lockdep_no_validate__\s*\)/ ) {
3248 if ($realfile !~ m@^kernel/lockdep@ &&
3249 $realfile !~ m@^include/linux/lockdep@ &&
3250 $realfile !~ m@^drivers/base/core@) {
3251 ERROR("LOCKDEP",
3252 "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
3253 }
3254 }
3255
3256 if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
3257 $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
3258 WARN("EXPORTED_WORLD_WRITABLE",
3259 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
3260 }
3261
3262 # Check for memset with swapped arguments
3263 if ($line =~ /memset.*\,(\ |)(0x|)0(\ |0|)\);/) {
3264 ERROR("MEMSET",
3265 "memset size is 3rd argument, not the second.\n" . $herecurr);
3266 }
3267 }
3268
3269 # If we have no input at all, then there is nothing to report on
3270 # so just keep quiet.
3271 if ($#rawlines == -1) {
3272 exit(0);
3273 }
3274
3275 # In mailback mode only produce a report in the negative, for
3276 # things that appear to be patches.
3277 if ($mailback && ($clean == 1 || !$is_patch)) {
3278 exit(0);
3279 }
3280
3281 # This is not a patch, and we are are in 'no-patch' mode so
3282 # just keep quiet.
3283 if (!$chk_patch && !$is_patch) {
3284 exit(0);
3285 }
3286
3287 if (!$is_patch) {
3288 ERROR("NOT_UNIFIED_DIFF",
3289 "Does not appear to be a unified-diff format patch\n");
3290 }
3291 if ($is_patch && $chk_signoff && $signoff == 0) {
3292 ERROR("MISSING_SIGN_OFF",
3293 "Missing Signed-off-by: line(s)\n");
3294 }
3295
3296 print report_dump();
3297 if ($summary && !($clean == 1 && $quiet == 1)) {
3298 print "$filename " if ($summary_file);
3299 print "total: $cnt_error errors, $cnt_warn warnings, " .
3300 (($check)? "$cnt_chk checks, " : "") .
3301 "$cnt_lines lines checked\n";
3302 print "\n" if ($quiet == 0);
3303 }
3304
3305 if ($quiet == 0) {
3306 # If there were whitespace errors which cleanpatch can fix
3307 # then suggest that.
3308 if ($rpt_cleaners) {
3309 print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";
3310 print " scripts/cleanfile\n\n";
3311 $rpt_cleaners = 0;
3312 }
3313 }
3314
3315 if (keys %ignore_type) {
3316 print "NOTE: Ignored message types:";
3317 foreach my $ignore (sort keys %ignore_type) {
3318 print " $ignore";
3319 }
3320 print "\n";
3321 print "\n" if ($quiet == 0);
3322 }
3323
3324 if ($clean == 1 && $quiet == 0) {
3325 print "$vname has no obvious style problems and is ready for submission.\n"
3326 }
3327 if ($clean == 0 && $quiet == 0) {
3328 print << "EOM";
3329$vname has style problems, please review.
3330
3331If any of these errors are false positives, please report
3332them to the maintainer, see CHECKPATCH in MAINTAINERS.
3333EOM
3334 }
3335
3336 return $clean;
3337}
1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0
3#
4# (c) 2001, Dave Jones. (the file handling bit)
5# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
6# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
7# (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
8# (c) 2010-2018 Joe Perches <joe@perches.com>
9
10use strict;
11use warnings;
12use POSIX;
13use File::Basename;
14use Cwd 'abs_path';
15use Term::ANSIColor qw(:constants);
16use Encode qw(decode encode);
17
18my $P = $0;
19my $D = dirname(abs_path($P));
20
21my $V = '0.32';
22
23use Getopt::Long qw(:config no_auto_abbrev);
24
25my $quiet = 0;
26my $verbose = 0;
27my %verbose_messages = ();
28my %verbose_emitted = ();
29my $tree = 1;
30my $chk_signoff = 1;
31my $chk_fixes_tag = 1;
32my $chk_patch = 1;
33my $tst_only;
34my $emacs = 0;
35my $terse = 0;
36my $showfile = 0;
37my $file = 0;
38my $git = 0;
39my %git_commits = ();
40my $check = 0;
41my $check_orig = 0;
42my $summary = 1;
43my $mailback = 0;
44my $summary_file = 0;
45my $show_types = 0;
46my $list_types = 0;
47my $fix = 0;
48my $fix_inplace = 0;
49my $root;
50my $gitroot = $ENV{'GIT_DIR'};
51$gitroot = ".git" if !defined($gitroot);
52my %debug;
53my %camelcase = ();
54my %use_type = ();
55my @use = ();
56my %ignore_type = ();
57my @ignore = ();
58my $help = 0;
59my $configuration_file = ".checkpatch.conf";
60my $max_line_length = 100;
61my $ignore_perl_version = 0;
62my $minimum_perl_version = 5.10.0;
63my $min_conf_desc_length = 4;
64my $spelling_file = "$D/spelling.txt";
65my $codespell = 0;
66my $codespellfile = "/usr/share/codespell/dictionary.txt";
67my $user_codespellfile = "";
68my $conststructsfile = "$D/const_structs.checkpatch";
69my $docsfile = "$D/../Documentation/dev-tools/checkpatch.rst";
70my $typedefsfile;
71my $color = "auto";
72my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE
73# git output parsing needs US English output, so first set backtick child process LANGUAGE
74my $git_command ='export LANGUAGE=en_US.UTF-8; git';
75my $tabsize = 8;
76my ${CONFIG_} = "CONFIG_";
77
78my %maybe_linker_symbol; # for externs in c exceptions, when seen in *vmlinux.lds.h
79
80sub help {
81 my ($exitcode) = @_;
82
83 print << "EOM";
84Usage: $P [OPTION]... [FILE]...
85Version: $V
86
87Options:
88 -q, --quiet quiet
89 -v, --verbose verbose mode
90 --no-tree run without a kernel tree
91 --no-signoff do not check for 'Signed-off-by' line
92 --no-fixes-tag do not check for 'Fixes:' tag
93 --patch treat FILE as patchfile (default)
94 --emacs emacs compile window format
95 --terse one line per report
96 --showfile emit diffed file position, not input file position
97 -g, --git treat FILE as a single commit or git revision range
98 single git commit with:
99 <rev>
100 <rev>^
101 <rev>~n
102 multiple git commits with:
103 <rev1>..<rev2>
104 <rev1>...<rev2>
105 <rev>-<count>
106 git merges are ignored
107 -f, --file treat FILE as regular source file
108 --subjective, --strict enable more subjective tests
109 --list-types list the possible message types
110 --types TYPE(,TYPE2...) show only these comma separated message types
111 --ignore TYPE(,TYPE2...) ignore various comma separated message types
112 --show-types show the specific message type in the output
113 --max-line-length=n set the maximum line length, (default $max_line_length)
114 if exceeded, warn on patches
115 requires --strict for use with --file
116 --min-conf-desc-length=n set the min description length, if shorter, warn
117 --tab-size=n set the number of spaces for tab (default $tabsize)
118 --root=PATH PATH to the kernel tree root
119 --no-summary suppress the per-file summary
120 --mailback only produce a report in case of warnings/errors
121 --summary-file include the filename in summary
122 --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of
123 'values', 'possible', 'type', and 'attr' (default
124 is all off)
125 --test-only=WORD report only warnings/errors containing WORD
126 literally
127 --fix EXPERIMENTAL - may create horrible results
128 If correctable single-line errors exist, create
129 "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
130 with potential errors corrected to the preferred
131 checkpatch style
132 --fix-inplace EXPERIMENTAL - may create horrible results
133 Is the same as --fix, but overwrites the input
134 file. It's your fault if there's no backup or git
135 --ignore-perl-version override checking of perl version. expect
136 runtime errors.
137 --codespell Use the codespell dictionary for spelling/typos
138 (default:$codespellfile)
139 --codespellfile Use this codespell dictionary
140 --typedefsfile Read additional types from this file
141 --color[=WHEN] Use colors 'always', 'never', or only when output
142 is a terminal ('auto'). Default is 'auto'.
143 --kconfig-prefix=WORD use WORD as a prefix for Kconfig symbols (default
144 ${CONFIG_})
145 -h, --help, --version display this help and exit
146
147When FILE is - read standard input.
148EOM
149
150 exit($exitcode);
151}
152
153sub uniq {
154 my %seen;
155 return grep { !$seen{$_}++ } @_;
156}
157
158sub list_types {
159 my ($exitcode) = @_;
160
161 my $count = 0;
162
163 local $/ = undef;
164
165 open(my $script, '<', abs_path($P)) or
166 die "$P: Can't read '$P' $!\n";
167
168 my $text = <$script>;
169 close($script);
170
171 my %types = ();
172 # Also catch when type or level is passed through a variable
173 while ($text =~ /(?:(\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) {
174 if (defined($1)) {
175 if (exists($types{$2})) {
176 $types{$2} .= ",$1" if ($types{$2} ne $1);
177 } else {
178 $types{$2} = $1;
179 }
180 } else {
181 $types{$2} = "UNDETERMINED";
182 }
183 }
184
185 print("#\tMessage type\n\n");
186 if ($color) {
187 print(" ( Color coding: ");
188 print(RED . "ERROR" . RESET);
189 print(" | ");
190 print(YELLOW . "WARNING" . RESET);
191 print(" | ");
192 print(GREEN . "CHECK" . RESET);
193 print(" | ");
194 print("Multiple levels / Undetermined");
195 print(" )\n\n");
196 }
197
198 foreach my $type (sort keys %types) {
199 my $orig_type = $type;
200 if ($color) {
201 my $level = $types{$type};
202 if ($level eq "ERROR") {
203 $type = RED . $type . RESET;
204 } elsif ($level eq "WARN") {
205 $type = YELLOW . $type . RESET;
206 } elsif ($level eq "CHK") {
207 $type = GREEN . $type . RESET;
208 }
209 }
210 print(++$count . "\t" . $type . "\n");
211 if ($verbose && exists($verbose_messages{$orig_type})) {
212 my $message = $verbose_messages{$orig_type};
213 $message =~ s/\n/\n\t/g;
214 print("\t" . $message . "\n\n");
215 }
216 }
217
218 exit($exitcode);
219}
220
221my $conf = which_conf($configuration_file);
222if (-f $conf) {
223 my @conf_args;
224 open(my $conffile, '<', "$conf")
225 or warn "$P: Can't find a readable $configuration_file file $!\n";
226
227 while (<$conffile>) {
228 my $line = $_;
229
230 $line =~ s/\s*\n?$//g;
231 $line =~ s/^\s*//g;
232 $line =~ s/\s+/ /g;
233
234 next if ($line =~ m/^\s*#/);
235 next if ($line =~ m/^\s*$/);
236
237 my @words = split(" ", $line);
238 foreach my $word (@words) {
239 last if ($word =~ m/^#/);
240 push (@conf_args, $word);
241 }
242 }
243 close($conffile);
244 unshift(@ARGV, @conf_args) if @conf_args;
245}
246
247sub load_docs {
248 open(my $docs, '<', "$docsfile")
249 or warn "$P: Can't read the documentation file $docsfile $!\n";
250
251 my $type = '';
252 my $desc = '';
253 my $in_desc = 0;
254
255 while (<$docs>) {
256 chomp;
257 my $line = $_;
258 $line =~ s/\s+$//;
259
260 if ($line =~ /^\s*\*\*(.+)\*\*$/) {
261 if ($desc ne '') {
262 $verbose_messages{$type} = trim($desc);
263 }
264 $type = $1;
265 $desc = '';
266 $in_desc = 1;
267 } elsif ($in_desc) {
268 if ($line =~ /^(?:\s{4,}|$)/) {
269 $line =~ s/^\s{4}//;
270 $desc .= $line;
271 $desc .= "\n";
272 } else {
273 $verbose_messages{$type} = trim($desc);
274 $type = '';
275 $desc = '';
276 $in_desc = 0;
277 }
278 }
279 }
280
281 if ($desc ne '') {
282 $verbose_messages{$type} = trim($desc);
283 }
284 close($docs);
285}
286
287# Perl's Getopt::Long allows options to take optional arguments after a space.
288# Prevent --color by itself from consuming other arguments
289foreach (@ARGV) {
290 if ($_ eq "--color" || $_ eq "-color") {
291 $_ = "--color=$color";
292 }
293}
294
295GetOptions(
296 'q|quiet+' => \$quiet,
297 'v|verbose!' => \$verbose,
298 'tree!' => \$tree,
299 'signoff!' => \$chk_signoff,
300 'fixes-tag!' => \$chk_fixes_tag,
301 'patch!' => \$chk_patch,
302 'emacs!' => \$emacs,
303 'terse!' => \$terse,
304 'showfile!' => \$showfile,
305 'f|file!' => \$file,
306 'g|git!' => \$git,
307 'subjective!' => \$check,
308 'strict!' => \$check,
309 'ignore=s' => \@ignore,
310 'types=s' => \@use,
311 'show-types!' => \$show_types,
312 'list-types!' => \$list_types,
313 'max-line-length=i' => \$max_line_length,
314 'min-conf-desc-length=i' => \$min_conf_desc_length,
315 'tab-size=i' => \$tabsize,
316 'root=s' => \$root,
317 'summary!' => \$summary,
318 'mailback!' => \$mailback,
319 'summary-file!' => \$summary_file,
320 'fix!' => \$fix,
321 'fix-inplace!' => \$fix_inplace,
322 'ignore-perl-version!' => \$ignore_perl_version,
323 'debug=s' => \%debug,
324 'test-only=s' => \$tst_only,
325 'codespell!' => \$codespell,
326 'codespellfile=s' => \$user_codespellfile,
327 'typedefsfile=s' => \$typedefsfile,
328 'color=s' => \$color,
329 'no-color' => \$color, #keep old behaviors of -nocolor
330 'nocolor' => \$color, #keep old behaviors of -nocolor
331 'kconfig-prefix=s' => \${CONFIG_},
332 'h|help' => \$help,
333 'version' => \$help
334) or $help = 2;
335
336if ($user_codespellfile) {
337 # Use the user provided codespell file unconditionally
338 $codespellfile = $user_codespellfile;
339} elsif (!(-f $codespellfile)) {
340 # If /usr/share/codespell/dictionary.txt is not present, try to find it
341 # under codespell's install directory: <codespell_root>/data/dictionary.txt
342 if (($codespell || $help) && which("python3") ne "") {
343 my $python_codespell_dict = << "EOF";
344
345import os.path as op
346import codespell_lib
347codespell_dir = op.dirname(codespell_lib.__file__)
348codespell_file = op.join(codespell_dir, 'data', 'dictionary.txt')
349print(codespell_file, end='')
350EOF
351
352 my $codespell_dict = `python3 -c "$python_codespell_dict" 2> /dev/null`;
353 $codespellfile = $codespell_dict if (-f $codespell_dict);
354 }
355}
356
357# $help is 1 if either -h, --help or --version is passed as option - exitcode: 0
358# $help is 2 if invalid option is passed - exitcode: 1
359help($help - 1) if ($help);
360
361die "$P: --git cannot be used with --file or --fix\n" if ($git && ($file || $fix));
362die "$P: --verbose cannot be used with --terse\n" if ($verbose && $terse);
363
364if ($color =~ /^[01]$/) {
365 $color = !$color;
366} elsif ($color =~ /^always$/i) {
367 $color = 1;
368} elsif ($color =~ /^never$/i) {
369 $color = 0;
370} elsif ($color =~ /^auto$/i) {
371 $color = (-t STDOUT);
372} else {
373 die "$P: Invalid color mode: $color\n";
374}
375
376load_docs() if ($verbose);
377list_types(0) if ($list_types);
378
379$fix = 1 if ($fix_inplace);
380$check_orig = $check;
381
382my $exit = 0;
383
384my $perl_version_ok = 1;
385if ($^V && $^V lt $minimum_perl_version) {
386 $perl_version_ok = 0;
387 printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
388 exit(1) if (!$ignore_perl_version);
389}
390
391#if no filenames are given, push '-' to read patch from stdin
392if ($#ARGV < 0) {
393 push(@ARGV, '-');
394}
395
396# skip TAB size 1 to avoid additional checks on $tabsize - 1
397die "$P: Invalid TAB size: $tabsize\n" if ($tabsize < 2);
398
399sub hash_save_array_words {
400 my ($hashRef, $arrayRef) = @_;
401
402 my @array = split(/,/, join(',', @$arrayRef));
403 foreach my $word (@array) {
404 $word =~ s/\s*\n?$//g;
405 $word =~ s/^\s*//g;
406 $word =~ s/\s+/ /g;
407 $word =~ tr/[a-z]/[A-Z]/;
408
409 next if ($word =~ m/^\s*#/);
410 next if ($word =~ m/^\s*$/);
411
412 $hashRef->{$word}++;
413 }
414}
415
416sub hash_show_words {
417 my ($hashRef, $prefix) = @_;
418
419 if (keys %$hashRef) {
420 print "\nNOTE: $prefix message types:";
421 foreach my $word (sort keys %$hashRef) {
422 print " $word";
423 }
424 print "\n";
425 }
426}
427
428hash_save_array_words(\%ignore_type, \@ignore);
429hash_save_array_words(\%use_type, \@use);
430
431my $dbg_values = 0;
432my $dbg_possible = 0;
433my $dbg_type = 0;
434my $dbg_attr = 0;
435for my $key (keys %debug) {
436 ## no critic
437 eval "\${dbg_$key} = '$debug{$key}';";
438 die "$@" if ($@);
439}
440
441my $rpt_cleaners = 0;
442
443if ($terse) {
444 $emacs = 1;
445 $quiet++;
446}
447
448if ($tree) {
449 if (defined $root) {
450 if (!top_of_kernel_tree($root)) {
451 die "$P: $root: --root does not point at a valid tree\n";
452 }
453 } else {
454 if (top_of_kernel_tree('.')) {
455 $root = '.';
456 } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
457 top_of_kernel_tree($1)) {
458 $root = $1;
459 }
460 }
461
462 if (!defined $root) {
463 print "Must be run from the top-level dir. of a kernel tree\n";
464 exit(2);
465 }
466}
467
468my $emitted_corrupt = 0;
469
470our $Ident = qr{
471 [A-Za-z_][A-Za-z\d_]*
472 (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
473 }x;
474our $Storage = qr{extern|static|asmlinkage};
475our $Sparse = qr{
476 __user|
477 __kernel|
478 __force|
479 __iomem|
480 __must_check|
481 __kprobes|
482 __ref|
483 __refconst|
484 __refdata|
485 __rcu|
486 __private
487 }x;
488our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
489our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
490our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
491our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
492our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
493
494# Notes to $Attribute:
495# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
496our $Attribute = qr{
497 const|
498 volatile|
499 __percpu|
500 __nocast|
501 __safe|
502 __bitwise|
503 __packed__|
504 __packed2__|
505 __naked|
506 __maybe_unused|
507 __always_unused|
508 __noreturn|
509 __used|
510 __cold|
511 __pure|
512 __noclone|
513 __deprecated|
514 __read_mostly|
515 __ro_after_init|
516 __kprobes|
517 $InitAttribute|
518 __aligned\s*\(.*\)|
519 ____cacheline_aligned|
520 ____cacheline_aligned_in_smp|
521 ____cacheline_internodealigned_in_smp|
522 __weak|
523 __alloc_size\s*\(\s*\d+\s*(?:,\s*\d+\s*)?\)
524 }x;
525our $Modifier;
526our $Inline = qr{inline|__always_inline|noinline|__inline|__inline__};
527our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
528our $Lval = qr{$Ident(?:$Member)*};
529
530our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u};
531our $Binary = qr{(?i)0b[01]+$Int_type?};
532our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?};
533our $Int = qr{[0-9]+$Int_type?};
534our $Octal = qr{0[0-7]+$Int_type?};
535our $String = qr{(?:\b[Lu])?"[X\t]*"};
536our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
537our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
538our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
539our $Float = qr{$Float_hex|$Float_dec|$Float_int};
540our $Constant = qr{$Float|$Binary|$Octal|$Hex|$Int};
541our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
542our $Compare = qr{<=|>=|==|!=|<|(?<!-)>};
543our $Arithmetic = qr{\+|-|\*|\/|%};
544our $Operators = qr{
545 <=|>=|==|!=|
546 =>|->|<<|>>|<|>|!|~|
547 &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
548 }x;
549
550our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
551
552our $BasicType;
553our $NonptrType;
554our $NonptrTypeMisordered;
555our $NonptrTypeWithAttr;
556our $Type;
557our $TypeMisordered;
558our $Declare;
559our $DeclareMisordered;
560
561our $NON_ASCII_UTF8 = qr{
562 [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
563 | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
564 | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
565 | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
566 | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
567 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
568 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
569}x;
570
571our $UTF8 = qr{
572 [\x09\x0A\x0D\x20-\x7E] # ASCII
573 | $NON_ASCII_UTF8
574}x;
575
576our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t};
577our $typeOtherOSTypedefs = qr{(?x:
578 u_(?:char|short|int|long) | # bsd
579 u(?:nchar|short|int|long) # sysv
580)};
581our $typeKernelTypedefs = qr{(?x:
582 (?:__)?(?:u|s|be|le)(?:8|16|32|64)|
583 atomic_t
584)};
585our $typeStdioTypedefs = qr{(?x:
586 FILE
587)};
588our $typeTypedefs = qr{(?x:
589 $typeC99Typedefs\b|
590 $typeOtherOSTypedefs\b|
591 $typeKernelTypedefs\b|
592 $typeStdioTypedefs\b
593)};
594
595our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
596
597our $logFunctions = qr{(?x:
598 printk(?:_ratelimited|_once|_deferred_once|_deferred|)|
599 (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
600 TP_printk|
601 WARN(?:_RATELIMIT|_ONCE|)|
602 panic|
603 MODULE_[A-Z_]+|
604 seq_vprintf|seq_printf|seq_puts
605)};
606
607our $allocFunctions = qr{(?x:
608 (?:(?:devm_)?
609 (?:kv|k|v)[czm]alloc(?:_array)?(?:_node)? |
610 kstrdup(?:_const)? |
611 kmemdup(?:_nul)?) |
612 (?:\w+)?alloc_skb(?:_ip_align)? |
613 # dev_alloc_skb/netdev_alloc_skb, et al
614 dma_alloc_coherent
615)};
616
617our $signature_tags = qr{(?xi:
618 Signed-off-by:|
619 Co-developed-by:|
620 Acked-by:|
621 Tested-by:|
622 Reviewed-by:|
623 Reported-by:|
624 Suggested-by:|
625 To:|
626 Cc:
627)};
628
629our @link_tags = qw(Link Closes);
630
631#Create a search and print patterns for all these strings to be used directly below
632our $link_tags_search = "";
633our $link_tags_print = "";
634foreach my $entry (@link_tags) {
635 if ($link_tags_search ne "") {
636 $link_tags_search .= '|';
637 $link_tags_print .= ' or ';
638 }
639 $entry .= ':';
640 $link_tags_search .= $entry;
641 $link_tags_print .= "'$entry'";
642}
643$link_tags_search = "(?:${link_tags_search})";
644
645our $tracing_logging_tags = qr{(?xi:
646 [=-]*> |
647 <[=-]* |
648 \[ |
649 \] |
650 start |
651 called |
652 entered |
653 entry |
654 enter |
655 in |
656 inside |
657 here |
658 begin |
659 exit |
660 end |
661 done |
662 leave |
663 completed |
664 out |
665 return |
666 [\.\!:\s]*
667)};
668
669sub edit_distance_min {
670 my (@arr) = @_;
671 my $len = scalar @arr;
672 if ((scalar @arr) < 1) {
673 # if underflow, return
674 return;
675 }
676 my $min = $arr[0];
677 for my $i (0 .. ($len-1)) {
678 if ($arr[$i] < $min) {
679 $min = $arr[$i];
680 }
681 }
682 return $min;
683}
684
685sub get_edit_distance {
686 my ($str1, $str2) = @_;
687 $str1 = lc($str1);
688 $str2 = lc($str2);
689 $str1 =~ s/-//g;
690 $str2 =~ s/-//g;
691 my $len1 = length($str1);
692 my $len2 = length($str2);
693 # two dimensional array storing minimum edit distance
694 my @distance;
695 for my $i (0 .. $len1) {
696 for my $j (0 .. $len2) {
697 if ($i == 0) {
698 $distance[$i][$j] = $j;
699 } elsif ($j == 0) {
700 $distance[$i][$j] = $i;
701 } elsif (substr($str1, $i-1, 1) eq substr($str2, $j-1, 1)) {
702 $distance[$i][$j] = $distance[$i - 1][$j - 1];
703 } else {
704 my $dist1 = $distance[$i][$j - 1]; #insert distance
705 my $dist2 = $distance[$i - 1][$j]; # remove
706 my $dist3 = $distance[$i - 1][$j - 1]; #replace
707 $distance[$i][$j] = 1 + edit_distance_min($dist1, $dist2, $dist3);
708 }
709 }
710 }
711 return $distance[$len1][$len2];
712}
713
714sub find_standard_signature {
715 my ($sign_off) = @_;
716 my @standard_signature_tags = (
717 'Signed-off-by:', 'Co-developed-by:', 'Acked-by:', 'Tested-by:',
718 'Reviewed-by:', 'Reported-by:', 'Suggested-by:'
719 );
720 foreach my $signature (@standard_signature_tags) {
721 return $signature if (get_edit_distance($sign_off, $signature) <= 2);
722 }
723
724 return "";
725}
726
727our $obsolete_archives = qr{(?xi:
728 \Qfreedesktop.org/archives/dri-devel\E |
729 \Qlists.infradead.org\E |
730 \Qlkml.org\E |
731 \Qmail-archive.com\E |
732 \Qmailman.alsa-project.org/pipermail\E |
733 \Qmarc.info\E |
734 \Qozlabs.org/pipermail\E |
735 \Qspinics.net\E
736)};
737
738our @typeListMisordered = (
739 qr{char\s+(?:un)?signed},
740 qr{int\s+(?:(?:un)?signed\s+)?short\s},
741 qr{int\s+short(?:\s+(?:un)?signed)},
742 qr{short\s+int(?:\s+(?:un)?signed)},
743 qr{(?:un)?signed\s+int\s+short},
744 qr{short\s+(?:un)?signed},
745 qr{long\s+int\s+(?:un)?signed},
746 qr{int\s+long\s+(?:un)?signed},
747 qr{long\s+(?:un)?signed\s+int},
748 qr{int\s+(?:un)?signed\s+long},
749 qr{int\s+(?:un)?signed},
750 qr{int\s+long\s+long\s+(?:un)?signed},
751 qr{long\s+long\s+int\s+(?:un)?signed},
752 qr{long\s+long\s+(?:un)?signed\s+int},
753 qr{long\s+long\s+(?:un)?signed},
754 qr{long\s+(?:un)?signed},
755);
756
757our @typeList = (
758 qr{void},
759 qr{(?:(?:un)?signed\s+)?char},
760 qr{(?:(?:un)?signed\s+)?short\s+int},
761 qr{(?:(?:un)?signed\s+)?short},
762 qr{(?:(?:un)?signed\s+)?int},
763 qr{(?:(?:un)?signed\s+)?long\s+int},
764 qr{(?:(?:un)?signed\s+)?long\s+long\s+int},
765 qr{(?:(?:un)?signed\s+)?long\s+long},
766 qr{(?:(?:un)?signed\s+)?long},
767 qr{(?:un)?signed},
768 qr{float},
769 qr{double},
770 qr{bool},
771 qr{struct\s+$Ident},
772 qr{union\s+$Ident},
773 qr{enum\s+$Ident},
774 qr{${Ident}_t},
775 qr{${Ident}_handler},
776 qr{${Ident}_handler_fn},
777 @typeListMisordered,
778);
779
780our $C90_int_types = qr{(?x:
781 long\s+long\s+int\s+(?:un)?signed|
782 long\s+long\s+(?:un)?signed\s+int|
783 long\s+long\s+(?:un)?signed|
784 (?:(?:un)?signed\s+)?long\s+long\s+int|
785 (?:(?:un)?signed\s+)?long\s+long|
786 int\s+long\s+long\s+(?:un)?signed|
787 int\s+(?:(?:un)?signed\s+)?long\s+long|
788
789 long\s+int\s+(?:un)?signed|
790 long\s+(?:un)?signed\s+int|
791 long\s+(?:un)?signed|
792 (?:(?:un)?signed\s+)?long\s+int|
793 (?:(?:un)?signed\s+)?long|
794 int\s+long\s+(?:un)?signed|
795 int\s+(?:(?:un)?signed\s+)?long|
796
797 int\s+(?:un)?signed|
798 (?:(?:un)?signed\s+)?int
799)};
800
801our @typeListFile = ();
802our @typeListWithAttr = (
803 @typeList,
804 qr{struct\s+$InitAttribute\s+$Ident},
805 qr{union\s+$InitAttribute\s+$Ident},
806);
807
808our @modifierList = (
809 qr{fastcall},
810);
811our @modifierListFile = ();
812
813our @mode_permission_funcs = (
814 ["module_param", 3],
815 ["module_param_(?:array|named|string)", 4],
816 ["module_param_array_named", 5],
817 ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
818 ["proc_create(?:_data|)", 2],
819 ["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2],
820 ["IIO_DEV_ATTR_[A-Z_]+", 1],
821 ["SENSOR_(?:DEVICE_|)ATTR_2", 2],
822 ["SENSOR_TEMPLATE(?:_2|)", 3],
823 ["__ATTR", 2],
824);
825
826my $word_pattern = '\b[A-Z]?[a-z]{2,}\b';
827
828#Create a search pattern for all these functions to speed up a loop below
829our $mode_perms_search = "";
830foreach my $entry (@mode_permission_funcs) {
831 $mode_perms_search .= '|' if ($mode_perms_search ne "");
832 $mode_perms_search .= $entry->[0];
833}
834$mode_perms_search = "(?:${mode_perms_search})";
835
836our %deprecated_apis = (
837 "synchronize_rcu_bh" => "synchronize_rcu",
838 "synchronize_rcu_bh_expedited" => "synchronize_rcu_expedited",
839 "call_rcu_bh" => "call_rcu",
840 "rcu_barrier_bh" => "rcu_barrier",
841 "synchronize_sched" => "synchronize_rcu",
842 "synchronize_sched_expedited" => "synchronize_rcu_expedited",
843 "call_rcu_sched" => "call_rcu",
844 "rcu_barrier_sched" => "rcu_barrier",
845 "get_state_synchronize_sched" => "get_state_synchronize_rcu",
846 "cond_synchronize_sched" => "cond_synchronize_rcu",
847 "kmap" => "kmap_local_page",
848 "kunmap" => "kunmap_local",
849 "kmap_atomic" => "kmap_local_page",
850 "kunmap_atomic" => "kunmap_local",
851);
852
853#Create a search pattern for all these strings to speed up a loop below
854our $deprecated_apis_search = "";
855foreach my $entry (keys %deprecated_apis) {
856 $deprecated_apis_search .= '|' if ($deprecated_apis_search ne "");
857 $deprecated_apis_search .= $entry;
858}
859$deprecated_apis_search = "(?:${deprecated_apis_search})";
860
861our $mode_perms_world_writable = qr{
862 S_IWUGO |
863 S_IWOTH |
864 S_IRWXUGO |
865 S_IALLUGO |
866 0[0-7][0-7][2367]
867}x;
868
869our %mode_permission_string_types = (
870 "S_IRWXU" => 0700,
871 "S_IRUSR" => 0400,
872 "S_IWUSR" => 0200,
873 "S_IXUSR" => 0100,
874 "S_IRWXG" => 0070,
875 "S_IRGRP" => 0040,
876 "S_IWGRP" => 0020,
877 "S_IXGRP" => 0010,
878 "S_IRWXO" => 0007,
879 "S_IROTH" => 0004,
880 "S_IWOTH" => 0002,
881 "S_IXOTH" => 0001,
882 "S_IRWXUGO" => 0777,
883 "S_IRUGO" => 0444,
884 "S_IWUGO" => 0222,
885 "S_IXUGO" => 0111,
886);
887
888#Create a search pattern for all these strings to speed up a loop below
889our $mode_perms_string_search = "";
890foreach my $entry (keys %mode_permission_string_types) {
891 $mode_perms_string_search .= '|' if ($mode_perms_string_search ne "");
892 $mode_perms_string_search .= $entry;
893}
894our $single_mode_perms_string_search = "(?:${mode_perms_string_search})";
895our $multi_mode_perms_string_search = qr{
896 ${single_mode_perms_string_search}
897 (?:\s*\|\s*${single_mode_perms_string_search})*
898}x;
899
900sub perms_to_octal {
901 my ($string) = @_;
902
903 return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/);
904
905 my $val = "";
906 my $oval = "";
907 my $to = 0;
908 my $curpos = 0;
909 my $lastpos = 0;
910 while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
911 $curpos = pos($string);
912 my $match = $2;
913 my $omatch = $1;
914 last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
915 $lastpos = $curpos;
916 $to |= $mode_permission_string_types{$match};
917 $val .= '\s*\|\s*' if ($val ne "");
918 $val .= $match;
919 $oval .= $omatch;
920 }
921 $oval =~ s/^\s*\|\s*//;
922 $oval =~ s/\s*\|\s*$//;
923 return sprintf("%04o", $to);
924}
925
926our $allowed_asm_includes = qr{(?x:
927 irq|
928 memory|
929 time|
930 reboot
931)};
932# memory.h: ARM has a custom one
933
934# Load common spelling mistakes and build regular expression list.
935my $misspellings;
936my %spelling_fix;
937
938if (open(my $spelling, '<', $spelling_file)) {
939 while (<$spelling>) {
940 my $line = $_;
941
942 $line =~ s/\s*\n?$//g;
943 $line =~ s/^\s*//g;
944
945 next if ($line =~ m/^\s*#/);
946 next if ($line =~ m/^\s*$/);
947
948 my ($suspect, $fix) = split(/\|\|/, $line);
949
950 $spelling_fix{$suspect} = $fix;
951 }
952 close($spelling);
953} else {
954 warn "No typos will be found - file '$spelling_file': $!\n";
955}
956
957if ($codespell) {
958 if (open(my $spelling, '<', $codespellfile)) {
959 while (<$spelling>) {
960 my $line = $_;
961
962 $line =~ s/\s*\n?$//g;
963 $line =~ s/^\s*//g;
964
965 next if ($line =~ m/^\s*#/);
966 next if ($line =~ m/^\s*$/);
967 next if ($line =~ m/, disabled/i);
968
969 $line =~ s/,.*$//;
970
971 my ($suspect, $fix) = split(/->/, $line);
972
973 $spelling_fix{$suspect} = $fix;
974 }
975 close($spelling);
976 } else {
977 warn "No codespell typos will be found - file '$codespellfile': $!\n";
978 }
979}
980
981$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
982
983sub read_words {
984 my ($wordsRef, $file) = @_;
985
986 if (open(my $words, '<', $file)) {
987 while (<$words>) {
988 my $line = $_;
989
990 $line =~ s/\s*\n?$//g;
991 $line =~ s/^\s*//g;
992
993 next if ($line =~ m/^\s*#/);
994 next if ($line =~ m/^\s*$/);
995 if ($line =~ /\s/) {
996 print("$file: '$line' invalid - ignored\n");
997 next;
998 }
999
1000 $$wordsRef .= '|' if (defined $$wordsRef);
1001 $$wordsRef .= $line;
1002 }
1003 close($file);
1004 return 1;
1005 }
1006
1007 return 0;
1008}
1009
1010my $const_structs;
1011if (show_type("CONST_STRUCT")) {
1012 read_words(\$const_structs, $conststructsfile)
1013 or warn "No structs that should be const will be found - file '$conststructsfile': $!\n";
1014}
1015
1016if (defined($typedefsfile)) {
1017 my $typeOtherTypedefs;
1018 read_words(\$typeOtherTypedefs, $typedefsfile)
1019 or warn "No additional types will be considered - file '$typedefsfile': $!\n";
1020 $typeTypedefs .= '|' . $typeOtherTypedefs if (defined $typeOtherTypedefs);
1021}
1022
1023sub build_types {
1024 my $mods = "(?x: \n" . join("|\n ", (@modifierList, @modifierListFile)) . "\n)";
1025 my $all = "(?x: \n" . join("|\n ", (@typeList, @typeListFile)) . "\n)";
1026 my $Misordered = "(?x: \n" . join("|\n ", @typeListMisordered) . "\n)";
1027 my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)";
1028 $Modifier = qr{(?:$Attribute|$Sparse|$mods)};
1029 $BasicType = qr{
1030 (?:$typeTypedefs\b)|
1031 (?:${all}\b)
1032 }x;
1033 $NonptrType = qr{
1034 (?:$Modifier\s+|const\s+)*
1035 (?:
1036 (?:typeof|__typeof__)\s*\([^\)]*\)|
1037 (?:$typeTypedefs\b)|
1038 (?:${all}\b)
1039 )
1040 (?:\s+$Modifier|\s+const)*
1041 }x;
1042 $NonptrTypeMisordered = qr{
1043 (?:$Modifier\s+|const\s+)*
1044 (?:
1045 (?:${Misordered}\b)
1046 )
1047 (?:\s+$Modifier|\s+const)*
1048 }x;
1049 $NonptrTypeWithAttr = qr{
1050 (?:$Modifier\s+|const\s+)*
1051 (?:
1052 (?:typeof|__typeof__)\s*\([^\)]*\)|
1053 (?:$typeTypedefs\b)|
1054 (?:${allWithAttr}\b)
1055 )
1056 (?:\s+$Modifier|\s+const)*
1057 }x;
1058 $Type = qr{
1059 $NonptrType
1060 (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
1061 (?:\s+$Inline|\s+$Modifier)*
1062 }x;
1063 $TypeMisordered = qr{
1064 $NonptrTypeMisordered
1065 (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
1066 (?:\s+$Inline|\s+$Modifier)*
1067 }x;
1068 $Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
1069 $DeclareMisordered = qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
1070}
1071build_types();
1072
1073our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
1074
1075# Using $balanced_parens, $LvalOrFunc, or $FuncArg
1076# requires at least perl version v5.10.0
1077# Any use must be runtime checked with $^V
1078
1079our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
1080our $LvalOrFunc = qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
1081our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
1082
1083our $declaration_macros = qr{(?x:
1084 (?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
1085 (?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
1086 (?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(|
1087 (?:$Storage\s+)?(?:XA_STATE|XA_STATE_ORDER)\s*\(
1088)};
1089
1090our %allow_repeated_words = (
1091 add => '',
1092 added => '',
1093 bad => '',
1094 be => '',
1095);
1096
1097sub deparenthesize {
1098 my ($string) = @_;
1099 return "" if (!defined($string));
1100
1101 while ($string =~ /^\s*\(.*\)\s*$/) {
1102 $string =~ s@^\s*\(\s*@@;
1103 $string =~ s@\s*\)\s*$@@;
1104 }
1105
1106 $string =~ s@\s+@ @g;
1107
1108 return $string;
1109}
1110
1111sub seed_camelcase_file {
1112 my ($file) = @_;
1113
1114 return if (!(-f $file));
1115
1116 local $/;
1117
1118 open(my $include_file, '<', "$file")
1119 or warn "$P: Can't read '$file' $!\n";
1120 my $text = <$include_file>;
1121 close($include_file);
1122
1123 my @lines = split('\n', $text);
1124
1125 foreach my $line (@lines) {
1126 next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
1127 if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
1128 $camelcase{$1} = 1;
1129 } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
1130 $camelcase{$1} = 1;
1131 } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
1132 $camelcase{$1} = 1;
1133 }
1134 }
1135}
1136
1137our %maintained_status = ();
1138
1139sub is_maintained_obsolete {
1140 my ($filename) = @_;
1141
1142 return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
1143
1144 if (!exists($maintained_status{$filename})) {
1145 $maintained_status{$filename} = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
1146 }
1147
1148 return $maintained_status{$filename} =~ /obsolete/i;
1149}
1150
1151sub is_SPDX_License_valid {
1152 my ($license) = @_;
1153
1154 return 1 if (!$tree || which("python3") eq "" || !(-x "$root/scripts/spdxcheck.py") || !(-e "$gitroot"));
1155
1156 my $root_path = abs_path($root);
1157 my $status = `cd "$root_path"; echo "$license" | scripts/spdxcheck.py -`;
1158 return 0 if ($status ne "");
1159 return 1;
1160}
1161
1162my $camelcase_seeded = 0;
1163sub seed_camelcase_includes {
1164 return if ($camelcase_seeded);
1165
1166 my $files;
1167 my $camelcase_cache = "";
1168 my @include_files = ();
1169
1170 $camelcase_seeded = 1;
1171
1172 if (-e "$gitroot") {
1173 my $git_last_include_commit = `${git_command} log --no-merges --pretty=format:"%h%n" -1 -- include`;
1174 chomp $git_last_include_commit;
1175 $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
1176 } else {
1177 my $last_mod_date = 0;
1178 $files = `find $root/include -name "*.h"`;
1179 @include_files = split('\n', $files);
1180 foreach my $file (@include_files) {
1181 my $date = POSIX::strftime("%Y%m%d%H%M",
1182 localtime((stat $file)[9]));
1183 $last_mod_date = $date if ($last_mod_date < $date);
1184 }
1185 $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
1186 }
1187
1188 if ($camelcase_cache ne "" && -f $camelcase_cache) {
1189 open(my $camelcase_file, '<', "$camelcase_cache")
1190 or warn "$P: Can't read '$camelcase_cache' $!\n";
1191 while (<$camelcase_file>) {
1192 chomp;
1193 $camelcase{$_} = 1;
1194 }
1195 close($camelcase_file);
1196
1197 return;
1198 }
1199
1200 if (-e "$gitroot") {
1201 $files = `${git_command} ls-files "include/*.h"`;
1202 @include_files = split('\n', $files);
1203 }
1204
1205 foreach my $file (@include_files) {
1206 seed_camelcase_file($file);
1207 }
1208
1209 if ($camelcase_cache ne "") {
1210 unlink glob ".checkpatch-camelcase.*";
1211 open(my $camelcase_file, '>', "$camelcase_cache")
1212 or warn "$P: Can't write '$camelcase_cache' $!\n";
1213 foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
1214 print $camelcase_file ("$_\n");
1215 }
1216 close($camelcase_file);
1217 }
1218}
1219
1220sub git_is_single_file {
1221 my ($filename) = @_;
1222
1223 return 0 if ((which("git") eq "") || !(-e "$gitroot"));
1224
1225 my $output = `${git_command} ls-files -- $filename 2>/dev/null`;
1226 my $count = $output =~ tr/\n//;
1227 return $count eq 1 && $output =~ m{^${filename}$};
1228}
1229
1230sub git_commit_info {
1231 my ($commit, $id, $desc) = @_;
1232
1233 return ($id, $desc) if ((which("git") eq "") || !(-e "$gitroot"));
1234
1235 my $output = `${git_command} log --no-color --format='%H %s' -1 $commit 2>&1`;
1236 $output =~ s/^\s*//gm;
1237 my @lines = split("\n", $output);
1238
1239 return ($id, $desc) if ($#lines < 0);
1240
1241 if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous/) {
1242# Maybe one day convert this block of bash into something that returns
1243# all matching commit ids, but it's very slow...
1244#
1245# echo "checking commits $1..."
1246# git rev-list --remotes | grep -i "^$1" |
1247# while read line ; do
1248# git log --format='%H %s' -1 $line |
1249# echo "commit $(cut -c 1-12,41-)"
1250# done
1251 } elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./ ||
1252 $lines[0] =~ /^fatal: bad object $commit/) {
1253 $id = undef;
1254 } else {
1255 $id = substr($lines[0], 0, 12);
1256 $desc = substr($lines[0], 41);
1257 }
1258
1259 return ($id, $desc);
1260}
1261
1262$chk_signoff = 0 if ($file);
1263$chk_fixes_tag = 0 if ($file);
1264
1265my @rawlines = ();
1266my @lines = ();
1267my @fixed = ();
1268my @fixed_inserted = ();
1269my @fixed_deleted = ();
1270my $fixlinenr = -1;
1271
1272# If input is git commits, extract all commits from the commit expressions.
1273# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
1274die "$P: No git repository found\n" if ($git && !-e "$gitroot");
1275
1276if ($git) {
1277 my @commits = ();
1278 foreach my $commit_expr (@ARGV) {
1279 my $git_range;
1280 if ($commit_expr =~ m/^(.*)-(\d+)$/) {
1281 $git_range = "-$2 $1";
1282 } elsif ($commit_expr =~ m/\.\./) {
1283 $git_range = "$commit_expr";
1284 } else {
1285 $git_range = "-1 $commit_expr";
1286 }
1287 my $lines = `${git_command} log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
1288 foreach my $line (split(/\n/, $lines)) {
1289 $line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
1290 next if (!defined($1) || !defined($2));
1291 my $sha1 = $1;
1292 my $subject = $2;
1293 unshift(@commits, $sha1);
1294 $git_commits{$sha1} = $subject;
1295 }
1296 }
1297 die "$P: no git commits after extraction!\n" if (@commits == 0);
1298 @ARGV = @commits;
1299}
1300
1301my $vname;
1302$allow_c99_comments = !defined $ignore_type{"C99_COMMENT_TOLERANCE"};
1303for my $filename (@ARGV) {
1304 my $FILE;
1305 my $is_git_file = git_is_single_file($filename);
1306 my $oldfile = $file;
1307 $file = 1 if ($is_git_file);
1308 if ($git) {
1309 open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
1310 die "$P: $filename: git format-patch failed - $!\n";
1311 } elsif ($file) {
1312 open($FILE, '-|', "diff -u /dev/null $filename") ||
1313 die "$P: $filename: diff failed - $!\n";
1314 } elsif ($filename eq '-') {
1315 open($FILE, '<&STDIN');
1316 } else {
1317 open($FILE, '<', "$filename") ||
1318 die "$P: $filename: open failed - $!\n";
1319 }
1320 if ($filename eq '-') {
1321 $vname = 'Your patch';
1322 } elsif ($git) {
1323 $vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
1324 } else {
1325 $vname = $filename;
1326 }
1327 while (<$FILE>) {
1328 chomp;
1329 push(@rawlines, $_);
1330 $vname = qq("$1") if ($filename eq '-' && $_ =~ m/^Subject:\s+(.+)/i);
1331 }
1332 close($FILE);
1333
1334 if ($#ARGV > 0 && $quiet == 0) {
1335 print '-' x length($vname) . "\n";
1336 print "$vname\n";
1337 print '-' x length($vname) . "\n";
1338 }
1339
1340 if (!process($filename)) {
1341 $exit = 1;
1342 }
1343 @rawlines = ();
1344 @lines = ();
1345 @fixed = ();
1346 @fixed_inserted = ();
1347 @fixed_deleted = ();
1348 $fixlinenr = -1;
1349 @modifierListFile = ();
1350 @typeListFile = ();
1351 build_types();
1352 $file = $oldfile if ($is_git_file);
1353}
1354
1355if (!$quiet) {
1356 hash_show_words(\%use_type, "Used");
1357 hash_show_words(\%ignore_type, "Ignored");
1358
1359 if (!$perl_version_ok) {
1360 print << "EOM"
1361
1362NOTE: perl $^V is not modern enough to detect all possible issues.
1363 An upgrade to at least perl $minimum_perl_version is suggested.
1364EOM
1365 }
1366 if ($exit) {
1367 print << "EOM"
1368
1369NOTE: If any of the errors are false positives, please report
1370 them to the maintainer, see CHECKPATCH in MAINTAINERS.
1371EOM
1372 }
1373}
1374
1375exit($exit);
1376
1377sub top_of_kernel_tree {
1378 my ($root) = @_;
1379
1380 my @tree_check = (
1381 "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
1382 "README", "Documentation", "arch", "include", "drivers",
1383 "fs", "init", "ipc", "kernel", "lib", "scripts",
1384 );
1385
1386 foreach my $check (@tree_check) {
1387 if (! -e $root . '/' . $check) {
1388 return 0;
1389 }
1390 }
1391 return 1;
1392}
1393
1394sub parse_email {
1395 my ($formatted_email) = @_;
1396
1397 my $name = "";
1398 my $quoted = "";
1399 my $name_comment = "";
1400 my $address = "";
1401 my $comment = "";
1402
1403 if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
1404 $name = $1;
1405 $address = $2;
1406 $comment = $3 if defined $3;
1407 } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
1408 $address = $1;
1409 $comment = $2 if defined $2;
1410 } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
1411 $address = $1;
1412 $comment = $2 if defined $2;
1413 $formatted_email =~ s/\Q$address\E.*$//;
1414 $name = $formatted_email;
1415 $name = trim($name);
1416 $name =~ s/^\"|\"$//g;
1417 # If there's a name left after stripping spaces and
1418 # leading quotes, and the address doesn't have both
1419 # leading and trailing angle brackets, the address
1420 # is invalid. ie:
1421 # "joe smith joe@smith.com" bad
1422 # "joe smith <joe@smith.com" bad
1423 if ($name ne "" && $address !~ /^<[^>]+>$/) {
1424 $name = "";
1425 $address = "";
1426 $comment = "";
1427 }
1428 }
1429
1430 # Extract comments from names excluding quoted parts
1431 # "John D. (Doe)" - Do not extract
1432 if ($name =~ s/\"(.+)\"//) {
1433 $quoted = $1;
1434 }
1435 while ($name =~ s/\s*($balanced_parens)\s*/ /) {
1436 $name_comment .= trim($1);
1437 }
1438 $name =~ s/^[ \"]+|[ \"]+$//g;
1439 $name = trim("$quoted $name");
1440
1441 $address = trim($address);
1442 $address =~ s/^\<|\>$//g;
1443 $comment = trim($comment);
1444
1445 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
1446 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
1447 $name = "\"$name\"";
1448 }
1449
1450 return ($name, $name_comment, $address, $comment);
1451}
1452
1453sub format_email {
1454 my ($name, $name_comment, $address, $comment) = @_;
1455
1456 my $formatted_email;
1457
1458 $name =~ s/^[ \"]+|[ \"]+$//g;
1459 $address = trim($address);
1460 $address =~ s/(?:\.|\,|\")+$//; ##trailing commas, dots or quotes
1461
1462 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
1463 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
1464 $name = "\"$name\"";
1465 }
1466
1467 $name_comment = trim($name_comment);
1468 $name_comment = " $name_comment" if ($name_comment ne "");
1469 $comment = trim($comment);
1470 $comment = " $comment" if ($comment ne "");
1471
1472 if ("$name" eq "") {
1473 $formatted_email = "$address";
1474 } else {
1475 $formatted_email = "$name$name_comment <$address>";
1476 }
1477 $formatted_email .= "$comment";
1478 return $formatted_email;
1479}
1480
1481sub reformat_email {
1482 my ($email) = @_;
1483
1484 my ($email_name, $name_comment, $email_address, $comment) = parse_email($email);
1485 return format_email($email_name, $name_comment, $email_address, $comment);
1486}
1487
1488sub same_email_addresses {
1489 my ($email1, $email2) = @_;
1490
1491 my ($email1_name, $name1_comment, $email1_address, $comment1) = parse_email($email1);
1492 my ($email2_name, $name2_comment, $email2_address, $comment2) = parse_email($email2);
1493
1494 return $email1_name eq $email2_name &&
1495 $email1_address eq $email2_address &&
1496 $name1_comment eq $name2_comment &&
1497 $comment1 eq $comment2;
1498}
1499
1500sub which {
1501 my ($bin) = @_;
1502
1503 foreach my $path (split(/:/, $ENV{PATH})) {
1504 if (-e "$path/$bin") {
1505 return "$path/$bin";
1506 }
1507 }
1508
1509 return "";
1510}
1511
1512sub which_conf {
1513 my ($conf) = @_;
1514
1515 foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
1516 if (-e "$path/$conf") {
1517 return "$path/$conf";
1518 }
1519 }
1520
1521 return "";
1522}
1523
1524sub expand_tabs {
1525 my ($str) = @_;
1526
1527 my $res = '';
1528 my $n = 0;
1529 for my $c (split(//, $str)) {
1530 if ($c eq "\t") {
1531 $res .= ' ';
1532 $n++;
1533 for (; ($n % $tabsize) != 0; $n++) {
1534 $res .= ' ';
1535 }
1536 next;
1537 }
1538 $res .= $c;
1539 $n++;
1540 }
1541
1542 return $res;
1543}
1544sub copy_spacing {
1545 (my $res = shift) =~ tr/\t/ /c;
1546 return $res;
1547}
1548
1549sub line_stats {
1550 my ($line) = @_;
1551
1552 # Drop the diff line leader and expand tabs
1553 $line =~ s/^.//;
1554 $line = expand_tabs($line);
1555
1556 # Pick the indent from the front of the line.
1557 my ($white) = ($line =~ /^(\s*)/);
1558
1559 return (length($line), length($white));
1560}
1561
1562my $sanitise_quote = '';
1563
1564sub sanitise_line_reset {
1565 my ($in_comment) = @_;
1566
1567 if ($in_comment) {
1568 $sanitise_quote = '*/';
1569 } else {
1570 $sanitise_quote = '';
1571 }
1572}
1573sub sanitise_line {
1574 my ($line) = @_;
1575
1576 my $res = '';
1577 my $l = '';
1578
1579 my $qlen = 0;
1580 my $off = 0;
1581 my $c;
1582
1583 # Always copy over the diff marker.
1584 $res = substr($line, 0, 1);
1585
1586 for ($off = 1; $off < length($line); $off++) {
1587 $c = substr($line, $off, 1);
1588
1589 # Comments we are whacking completely including the begin
1590 # and end, all to $;.
1591 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
1592 $sanitise_quote = '*/';
1593
1594 substr($res, $off, 2, "$;$;");
1595 $off++;
1596 next;
1597 }
1598 if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
1599 $sanitise_quote = '';
1600 substr($res, $off, 2, "$;$;");
1601 $off++;
1602 next;
1603 }
1604 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
1605 $sanitise_quote = '//';
1606
1607 substr($res, $off, 2, $sanitise_quote);
1608 $off++;
1609 next;
1610 }
1611
1612 # A \ in a string means ignore the next character.
1613 if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
1614 $c eq "\\") {
1615 substr($res, $off, 2, 'XX');
1616 $off++;
1617 next;
1618 }
1619 # Regular quotes.
1620 if ($c eq "'" || $c eq '"') {
1621 if ($sanitise_quote eq '') {
1622 $sanitise_quote = $c;
1623
1624 substr($res, $off, 1, $c);
1625 next;
1626 } elsif ($sanitise_quote eq $c) {
1627 $sanitise_quote = '';
1628 }
1629 }
1630
1631 #print "c<$c> SQ<$sanitise_quote>\n";
1632 if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
1633 substr($res, $off, 1, $;);
1634 } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
1635 substr($res, $off, 1, $;);
1636 } elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
1637 substr($res, $off, 1, 'X');
1638 } else {
1639 substr($res, $off, 1, $c);
1640 }
1641 }
1642
1643 if ($sanitise_quote eq '//') {
1644 $sanitise_quote = '';
1645 }
1646
1647 # The pathname on a #include may be surrounded by '<' and '>'.
1648 if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
1649 my $clean = 'X' x length($1);
1650 $res =~ s@\<.*\>@<$clean>@;
1651
1652 # The whole of a #error is a string.
1653 } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
1654 my $clean = 'X' x length($1);
1655 $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
1656 }
1657
1658 if ($allow_c99_comments && $res =~ m@(//.*$)@) {
1659 my $match = $1;
1660 $res =~ s/\Q$match\E/"$;" x length($match)/e;
1661 }
1662
1663 return $res;
1664}
1665
1666sub get_quoted_string {
1667 my ($line, $rawline) = @_;
1668
1669 return "" if (!defined($line) || !defined($rawline));
1670 return "" if ($line !~ m/($String)/g);
1671 return substr($rawline, $-[0], $+[0] - $-[0]);
1672}
1673
1674sub ctx_statement_block {
1675 my ($linenr, $remain, $off) = @_;
1676 my $line = $linenr - 1;
1677 my $blk = '';
1678 my $soff = $off;
1679 my $coff = $off - 1;
1680 my $coff_set = 0;
1681
1682 my $loff = 0;
1683
1684 my $type = '';
1685 my $level = 0;
1686 my @stack = ();
1687 my $p;
1688 my $c;
1689 my $len = 0;
1690
1691 my $remainder;
1692 while (1) {
1693 @stack = (['', 0]) if ($#stack == -1);
1694
1695 #warn "CSB: blk<$blk> remain<$remain>\n";
1696 # If we are about to drop off the end, pull in more
1697 # context.
1698 if ($off >= $len) {
1699 for (; $remain > 0; $line++) {
1700 last if (!defined $lines[$line]);
1701 next if ($lines[$line] =~ /^-/);
1702 $remain--;
1703 $loff = $len;
1704 $blk .= $lines[$line] . "\n";
1705 $len = length($blk);
1706 $line++;
1707 last;
1708 }
1709 # Bail if there is no further context.
1710 #warn "CSB: blk<$blk> off<$off> len<$len>\n";
1711 if ($off >= $len) {
1712 last;
1713 }
1714 if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
1715 $level++;
1716 $type = '#';
1717 }
1718 }
1719 $p = $c;
1720 $c = substr($blk, $off, 1);
1721 $remainder = substr($blk, $off);
1722
1723 #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
1724
1725 # Handle nested #if/#else.
1726 if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
1727 push(@stack, [ $type, $level ]);
1728 } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
1729 ($type, $level) = @{$stack[$#stack - 1]};
1730 } elsif ($remainder =~ /^#\s*endif\b/) {
1731 ($type, $level) = @{pop(@stack)};
1732 }
1733
1734 # Statement ends at the ';' or a close '}' at the
1735 # outermost level.
1736 if ($level == 0 && $c eq ';') {
1737 last;
1738 }
1739
1740 # An else is really a conditional as long as its not else if
1741 if ($level == 0 && $coff_set == 0 &&
1742 (!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
1743 $remainder =~ /^(else)(?:\s|{)/ &&
1744 $remainder !~ /^else\s+if\b/) {
1745 $coff = $off + length($1) - 1;
1746 $coff_set = 1;
1747 #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
1748 #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
1749 }
1750
1751 if (($type eq '' || $type eq '(') && $c eq '(') {
1752 $level++;
1753 $type = '(';
1754 }
1755 if ($type eq '(' && $c eq ')') {
1756 $level--;
1757 $type = ($level != 0)? '(' : '';
1758
1759 if ($level == 0 && $coff < $soff) {
1760 $coff = $off;
1761 $coff_set = 1;
1762 #warn "CSB: mark coff<$coff>\n";
1763 }
1764 }
1765 if (($type eq '' || $type eq '{') && $c eq '{') {
1766 $level++;
1767 $type = '{';
1768 }
1769 if ($type eq '{' && $c eq '}') {
1770 $level--;
1771 $type = ($level != 0)? '{' : '';
1772
1773 if ($level == 0) {
1774 if (substr($blk, $off + 1, 1) eq ';') {
1775 $off++;
1776 }
1777 last;
1778 }
1779 }
1780 # Preprocessor commands end at the newline unless escaped.
1781 if ($type eq '#' && $c eq "\n" && $p ne "\\") {
1782 $level--;
1783 $type = '';
1784 $off++;
1785 last;
1786 }
1787 $off++;
1788 }
1789 # We are truly at the end, so shuffle to the next line.
1790 if ($off == $len) {
1791 $loff = $len + 1;
1792 $line++;
1793 $remain--;
1794 }
1795
1796 my $statement = substr($blk, $soff, $off - $soff + 1);
1797 my $condition = substr($blk, $soff, $coff - $soff + 1);
1798
1799 #warn "STATEMENT<$statement>\n";
1800 #warn "CONDITION<$condition>\n";
1801
1802 #print "coff<$coff> soff<$off> loff<$loff>\n";
1803
1804 return ($statement, $condition,
1805 $line, $remain + 1, $off - $loff + 1, $level);
1806}
1807
1808sub statement_lines {
1809 my ($stmt) = @_;
1810
1811 # Strip the diff line prefixes and rip blank lines at start and end.
1812 $stmt =~ s/(^|\n)./$1/g;
1813 $stmt =~ s/^\s*//;
1814 $stmt =~ s/\s*$//;
1815
1816 my @stmt_lines = ($stmt =~ /\n/g);
1817
1818 return $#stmt_lines + 2;
1819}
1820
1821sub statement_rawlines {
1822 my ($stmt) = @_;
1823
1824 my @stmt_lines = ($stmt =~ /\n/g);
1825
1826 return $#stmt_lines + 2;
1827}
1828
1829sub statement_block_size {
1830 my ($stmt) = @_;
1831
1832 $stmt =~ s/(^|\n)./$1/g;
1833 $stmt =~ s/^\s*{//;
1834 $stmt =~ s/}\s*$//;
1835 $stmt =~ s/^\s*//;
1836 $stmt =~ s/\s*$//;
1837
1838 my @stmt_lines = ($stmt =~ /\n/g);
1839 my @stmt_statements = ($stmt =~ /;/g);
1840
1841 my $stmt_lines = $#stmt_lines + 2;
1842 my $stmt_statements = $#stmt_statements + 1;
1843
1844 if ($stmt_lines > $stmt_statements) {
1845 return $stmt_lines;
1846 } else {
1847 return $stmt_statements;
1848 }
1849}
1850
1851sub ctx_statement_full {
1852 my ($linenr, $remain, $off) = @_;
1853 my ($statement, $condition, $level);
1854
1855 my (@chunks);
1856
1857 # Grab the first conditional/block pair.
1858 ($statement, $condition, $linenr, $remain, $off, $level) =
1859 ctx_statement_block($linenr, $remain, $off);
1860 #print "F: c<$condition> s<$statement> remain<$remain>\n";
1861 push(@chunks, [ $condition, $statement ]);
1862 if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
1863 return ($level, $linenr, @chunks);
1864 }
1865
1866 # Pull in the following conditional/block pairs and see if they
1867 # could continue the statement.
1868 for (;;) {
1869 ($statement, $condition, $linenr, $remain, $off, $level) =
1870 ctx_statement_block($linenr, $remain, $off);
1871 #print "C: c<$condition> s<$statement> remain<$remain>\n";
1872 last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
1873 #print "C: push\n";
1874 push(@chunks, [ $condition, $statement ]);
1875 }
1876
1877 return ($level, $linenr, @chunks);
1878}
1879
1880sub ctx_block_get {
1881 my ($linenr, $remain, $outer, $open, $close, $off) = @_;
1882 my $line;
1883 my $start = $linenr - 1;
1884 my $blk = '';
1885 my @o;
1886 my @c;
1887 my @res = ();
1888
1889 my $level = 0;
1890 my @stack = ($level);
1891 for ($line = $start; $remain > 0; $line++) {
1892 next if ($rawlines[$line] =~ /^-/);
1893 $remain--;
1894
1895 $blk .= $rawlines[$line];
1896
1897 # Handle nested #if/#else.
1898 if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
1899 push(@stack, $level);
1900 } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
1901 $level = $stack[$#stack - 1];
1902 } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
1903 $level = pop(@stack);
1904 }
1905
1906 foreach my $c (split(//, $lines[$line])) {
1907 ##print "C<$c>L<$level><$open$close>O<$off>\n";
1908 if ($off > 0) {
1909 $off--;
1910 next;
1911 }
1912
1913 if ($c eq $close && $level > 0) {
1914 $level--;
1915 last if ($level == 0);
1916 } elsif ($c eq $open) {
1917 $level++;
1918 }
1919 }
1920
1921 if (!$outer || $level <= 1) {
1922 push(@res, $rawlines[$line]);
1923 }
1924
1925 last if ($level == 0);
1926 }
1927
1928 return ($level, @res);
1929}
1930sub ctx_block_outer {
1931 my ($linenr, $remain) = @_;
1932
1933 my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1934 return @r;
1935}
1936sub ctx_block {
1937 my ($linenr, $remain) = @_;
1938
1939 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1940 return @r;
1941}
1942sub ctx_statement {
1943 my ($linenr, $remain, $off) = @_;
1944
1945 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1946 return @r;
1947}
1948sub ctx_block_level {
1949 my ($linenr, $remain) = @_;
1950
1951 return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1952}
1953sub ctx_statement_level {
1954 my ($linenr, $remain, $off) = @_;
1955
1956 return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1957}
1958
1959sub ctx_locate_comment {
1960 my ($first_line, $end_line) = @_;
1961
1962 # If c99 comment on the current line, or the line before or after
1963 my ($current_comment) = ($rawlines[$end_line - 1] =~ m@^\+.*(//.*$)@);
1964 return $current_comment if (defined $current_comment);
1965 ($current_comment) = ($rawlines[$end_line - 2] =~ m@^[\+ ].*(//.*$)@);
1966 return $current_comment if (defined $current_comment);
1967 ($current_comment) = ($rawlines[$end_line] =~ m@^[\+ ].*(//.*$)@);
1968 return $current_comment if (defined $current_comment);
1969
1970 # Catch a comment on the end of the line itself.
1971 ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
1972 return $current_comment if (defined $current_comment);
1973
1974 # Look through the context and try and figure out if there is a
1975 # comment.
1976 my $in_comment = 0;
1977 $current_comment = '';
1978 for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
1979 my $line = $rawlines[$linenr - 1];
1980 #warn " $line\n";
1981 if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1982 $in_comment = 1;
1983 }
1984 if ($line =~ m@/\*@) {
1985 $in_comment = 1;
1986 }
1987 if (!$in_comment && $current_comment ne '') {
1988 $current_comment = '';
1989 }
1990 $current_comment .= $line . "\n" if ($in_comment);
1991 if ($line =~ m@\*/@) {
1992 $in_comment = 0;
1993 }
1994 }
1995
1996 chomp($current_comment);
1997 return($current_comment);
1998}
1999sub ctx_has_comment {
2000 my ($first_line, $end_line) = @_;
2001 my $cmt = ctx_locate_comment($first_line, $end_line);
2002
2003 ##print "LINE: $rawlines[$end_line - 1 ]\n";
2004 ##print "CMMT: $cmt\n";
2005
2006 return ($cmt ne '');
2007}
2008
2009sub raw_line {
2010 my ($linenr, $cnt) = @_;
2011
2012 my $offset = $linenr - 1;
2013 $cnt++;
2014
2015 my $line;
2016 while ($cnt) {
2017 $line = $rawlines[$offset++];
2018 next if (defined($line) && $line =~ /^-/);
2019 $cnt--;
2020 }
2021
2022 return $line;
2023}
2024
2025sub get_stat_real {
2026 my ($linenr, $lc) = @_;
2027
2028 my $stat_real = raw_line($linenr, 0);
2029 for (my $count = $linenr + 1; $count <= $lc; $count++) {
2030 $stat_real = $stat_real . "\n" . raw_line($count, 0);
2031 }
2032
2033 return $stat_real;
2034}
2035
2036sub get_stat_here {
2037 my ($linenr, $cnt, $here) = @_;
2038
2039 my $herectx = $here . "\n";
2040 for (my $n = 0; $n < $cnt; $n++) {
2041 $herectx .= raw_line($linenr, $n) . "\n";
2042 }
2043
2044 return $herectx;
2045}
2046
2047sub cat_vet {
2048 my ($vet) = @_;
2049 my ($res, $coded);
2050
2051 $res = '';
2052 while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
2053 $res .= $1;
2054 if ($2 ne '') {
2055 $coded = sprintf("^%c", unpack('C', $2) + 64);
2056 $res .= $coded;
2057 }
2058 }
2059 $res =~ s/$/\$/;
2060
2061 return $res;
2062}
2063
2064my $av_preprocessor = 0;
2065my $av_pending;
2066my @av_paren_type;
2067my $av_pend_colon;
2068
2069sub annotate_reset {
2070 $av_preprocessor = 0;
2071 $av_pending = '_';
2072 @av_paren_type = ('E');
2073 $av_pend_colon = 'O';
2074}
2075
2076sub annotate_values {
2077 my ($stream, $type) = @_;
2078
2079 my $res;
2080 my $var = '_' x length($stream);
2081 my $cur = $stream;
2082
2083 print "$stream\n" if ($dbg_values > 1);
2084
2085 while (length($cur)) {
2086 @av_paren_type = ('E') if ($#av_paren_type < 0);
2087 print " <" . join('', @av_paren_type) .
2088 "> <$type> <$av_pending>" if ($dbg_values > 1);
2089 if ($cur =~ /^(\s+)/o) {
2090 print "WS($1)\n" if ($dbg_values > 1);
2091 if ($1 =~ /\n/ && $av_preprocessor) {
2092 $type = pop(@av_paren_type);
2093 $av_preprocessor = 0;
2094 }
2095
2096 } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
2097 print "CAST($1)\n" if ($dbg_values > 1);
2098 push(@av_paren_type, $type);
2099 $type = 'c';
2100
2101 } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
2102 print "DECLARE($1)\n" if ($dbg_values > 1);
2103 $type = 'T';
2104
2105 } elsif ($cur =~ /^($Modifier)\s*/) {
2106 print "MODIFIER($1)\n" if ($dbg_values > 1);
2107 $type = 'T';
2108
2109 } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
2110 print "DEFINE($1,$2)\n" if ($dbg_values > 1);
2111 $av_preprocessor = 1;
2112 push(@av_paren_type, $type);
2113 if ($2 ne '') {
2114 $av_pending = 'N';
2115 }
2116 $type = 'E';
2117
2118 } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
2119 print "UNDEF($1)\n" if ($dbg_values > 1);
2120 $av_preprocessor = 1;
2121 push(@av_paren_type, $type);
2122
2123 } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
2124 print "PRE_START($1)\n" if ($dbg_values > 1);
2125 $av_preprocessor = 1;
2126
2127 push(@av_paren_type, $type);
2128 push(@av_paren_type, $type);
2129 $type = 'E';
2130
2131 } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
2132 print "PRE_RESTART($1)\n" if ($dbg_values > 1);
2133 $av_preprocessor = 1;
2134
2135 push(@av_paren_type, $av_paren_type[$#av_paren_type]);
2136
2137 $type = 'E';
2138
2139 } elsif ($cur =~ /^(\#\s*(?:endif))/o) {
2140 print "PRE_END($1)\n" if ($dbg_values > 1);
2141
2142 $av_preprocessor = 1;
2143
2144 # Assume all arms of the conditional end as this
2145 # one does, and continue as if the #endif was not here.
2146 pop(@av_paren_type);
2147 push(@av_paren_type, $type);
2148 $type = 'E';
2149
2150 } elsif ($cur =~ /^(\\\n)/o) {
2151 print "PRECONT($1)\n" if ($dbg_values > 1);
2152
2153 } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
2154 print "ATTR($1)\n" if ($dbg_values > 1);
2155 $av_pending = $type;
2156 $type = 'N';
2157
2158 } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
2159 print "SIZEOF($1)\n" if ($dbg_values > 1);
2160 if (defined $2) {
2161 $av_pending = 'V';
2162 }
2163 $type = 'N';
2164
2165 } elsif ($cur =~ /^(if|while|for)\b/o) {
2166 print "COND($1)\n" if ($dbg_values > 1);
2167 $av_pending = 'E';
2168 $type = 'N';
2169
2170 } elsif ($cur =~/^(case)/o) {
2171 print "CASE($1)\n" if ($dbg_values > 1);
2172 $av_pend_colon = 'C';
2173 $type = 'N';
2174
2175 } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
2176 print "KEYWORD($1)\n" if ($dbg_values > 1);
2177 $type = 'N';
2178
2179 } elsif ($cur =~ /^(\()/o) {
2180 print "PAREN('$1')\n" if ($dbg_values > 1);
2181 push(@av_paren_type, $av_pending);
2182 $av_pending = '_';
2183 $type = 'N';
2184
2185 } elsif ($cur =~ /^(\))/o) {
2186 my $new_type = pop(@av_paren_type);
2187 if ($new_type ne '_') {
2188 $type = $new_type;
2189 print "PAREN('$1') -> $type\n"
2190 if ($dbg_values > 1);
2191 } else {
2192 print "PAREN('$1')\n" if ($dbg_values > 1);
2193 }
2194
2195 } elsif ($cur =~ /^($Ident)\s*\(/o) {
2196 print "FUNC($1)\n" if ($dbg_values > 1);
2197 $type = 'V';
2198 $av_pending = 'V';
2199
2200 } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
2201 if (defined $2 && $type eq 'C' || $type eq 'T') {
2202 $av_pend_colon = 'B';
2203 } elsif ($type eq 'E') {
2204 $av_pend_colon = 'L';
2205 }
2206 print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
2207 $type = 'V';
2208
2209 } elsif ($cur =~ /^($Ident|$Constant)/o) {
2210 print "IDENT($1)\n" if ($dbg_values > 1);
2211 $type = 'V';
2212
2213 } elsif ($cur =~ /^($Assignment)/o) {
2214 print "ASSIGN($1)\n" if ($dbg_values > 1);
2215 $type = 'N';
2216
2217 } elsif ($cur =~/^(;|{|})/) {
2218 print "END($1)\n" if ($dbg_values > 1);
2219 $type = 'E';
2220 $av_pend_colon = 'O';
2221
2222 } elsif ($cur =~/^(,)/) {
2223 print "COMMA($1)\n" if ($dbg_values > 1);
2224 $type = 'C';
2225
2226 } elsif ($cur =~ /^(\?)/o) {
2227 print "QUESTION($1)\n" if ($dbg_values > 1);
2228 $type = 'N';
2229
2230 } elsif ($cur =~ /^(:)/o) {
2231 print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
2232
2233 substr($var, length($res), 1, $av_pend_colon);
2234 if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
2235 $type = 'E';
2236 } else {
2237 $type = 'N';
2238 }
2239 $av_pend_colon = 'O';
2240
2241 } elsif ($cur =~ /^(\[)/o) {
2242 print "CLOSE($1)\n" if ($dbg_values > 1);
2243 $type = 'N';
2244
2245 } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
2246 my $variant;
2247
2248 print "OPV($1)\n" if ($dbg_values > 1);
2249 if ($type eq 'V') {
2250 $variant = 'B';
2251 } else {
2252 $variant = 'U';
2253 }
2254
2255 substr($var, length($res), 1, $variant);
2256 $type = 'N';
2257
2258 } elsif ($cur =~ /^($Operators)/o) {
2259 print "OP($1)\n" if ($dbg_values > 1);
2260 if ($1 ne '++' && $1 ne '--') {
2261 $type = 'N';
2262 }
2263
2264 } elsif ($cur =~ /(^.)/o) {
2265 print "C($1)\n" if ($dbg_values > 1);
2266 }
2267 if (defined $1) {
2268 $cur = substr($cur, length($1));
2269 $res .= $type x length($1);
2270 }
2271 }
2272
2273 return ($res, $var);
2274}
2275
2276sub possible {
2277 my ($possible, $line) = @_;
2278 my $notPermitted = qr{(?:
2279 ^(?:
2280 $Modifier|
2281 $Storage|
2282 $Type|
2283 DEFINE_\S+
2284 )$|
2285 ^(?:
2286 goto|
2287 return|
2288 case|
2289 else|
2290 asm|__asm__|
2291 do|
2292 \#|
2293 \#\#|
2294 )(?:\s|$)|
2295 ^(?:typedef|struct|enum)\b
2296 )}x;
2297 warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
2298 if ($possible !~ $notPermitted) {
2299 # Check for modifiers.
2300 $possible =~ s/\s*$Storage\s*//g;
2301 $possible =~ s/\s*$Sparse\s*//g;
2302 if ($possible =~ /^\s*$/) {
2303
2304 } elsif ($possible =~ /\s/) {
2305 $possible =~ s/\s*$Type\s*//g;
2306 for my $modifier (split(' ', $possible)) {
2307 if ($modifier !~ $notPermitted) {
2308 warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
2309 push(@modifierListFile, $modifier);
2310 }
2311 }
2312
2313 } else {
2314 warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
2315 push(@typeListFile, $possible);
2316 }
2317 build_types();
2318 } else {
2319 warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
2320 }
2321}
2322
2323my $prefix = '';
2324
2325sub show_type {
2326 my ($type) = @_;
2327
2328 $type =~ tr/[a-z]/[A-Z]/;
2329
2330 return defined $use_type{$type} if (scalar keys %use_type > 0);
2331
2332 return !defined $ignore_type{$type};
2333}
2334
2335sub report {
2336 my ($level, $type, $msg) = @_;
2337
2338 if (!show_type($type) ||
2339 (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
2340 return 0;
2341 }
2342 my $output = '';
2343 if ($color) {
2344 if ($level eq 'ERROR') {
2345 $output .= RED;
2346 } elsif ($level eq 'WARNING') {
2347 $output .= YELLOW;
2348 } else {
2349 $output .= GREEN;
2350 }
2351 }
2352 $output .= $prefix . $level . ':';
2353 if ($show_types) {
2354 $output .= BLUE if ($color);
2355 $output .= "$type:";
2356 }
2357 $output .= RESET if ($color);
2358 $output .= ' ' . $msg . "\n";
2359
2360 if ($showfile) {
2361 my @lines = split("\n", $output, -1);
2362 splice(@lines, 1, 1);
2363 $output = join("\n", @lines);
2364 }
2365
2366 if ($terse) {
2367 $output = (split('\n', $output))[0] . "\n";
2368 }
2369
2370 if ($verbose && exists($verbose_messages{$type}) &&
2371 !exists($verbose_emitted{$type})) {
2372 $output .= $verbose_messages{$type} . "\n\n";
2373 $verbose_emitted{$type} = 1;
2374 }
2375
2376 push(our @report, $output);
2377
2378 return 1;
2379}
2380
2381sub report_dump {
2382 our @report;
2383}
2384
2385sub fixup_current_range {
2386 my ($lineRef, $offset, $length) = @_;
2387
2388 if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) {
2389 my $o = $1;
2390 my $l = $2;
2391 my $no = $o + $offset;
2392 my $nl = $l + $length;
2393 $$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/;
2394 }
2395}
2396
2397sub fix_inserted_deleted_lines {
2398 my ($linesRef, $insertedRef, $deletedRef) = @_;
2399
2400 my $range_last_linenr = 0;
2401 my $delta_offset = 0;
2402
2403 my $old_linenr = 0;
2404 my $new_linenr = 0;
2405
2406 my $next_insert = 0;
2407 my $next_delete = 0;
2408
2409 my @lines = ();
2410
2411 my $inserted = @{$insertedRef}[$next_insert++];
2412 my $deleted = @{$deletedRef}[$next_delete++];
2413
2414 foreach my $old_line (@{$linesRef}) {
2415 my $save_line = 1;
2416 my $line = $old_line; #don't modify the array
2417 if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) { #new filename
2418 $delta_offset = 0;
2419 } elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) { #new hunk
2420 $range_last_linenr = $new_linenr;
2421 fixup_current_range(\$line, $delta_offset, 0);
2422 }
2423
2424 while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) {
2425 $deleted = @{$deletedRef}[$next_delete++];
2426 $save_line = 0;
2427 fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1);
2428 }
2429
2430 while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) {
2431 push(@lines, ${$inserted}{'LINE'});
2432 $inserted = @{$insertedRef}[$next_insert++];
2433 $new_linenr++;
2434 fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1);
2435 }
2436
2437 if ($save_line) {
2438 push(@lines, $line);
2439 $new_linenr++;
2440 }
2441
2442 $old_linenr++;
2443 }
2444
2445 return @lines;
2446}
2447
2448sub fix_insert_line {
2449 my ($linenr, $line) = @_;
2450
2451 my $inserted = {
2452 LINENR => $linenr,
2453 LINE => $line,
2454 };
2455 push(@fixed_inserted, $inserted);
2456}
2457
2458sub fix_delete_line {
2459 my ($linenr, $line) = @_;
2460
2461 my $deleted = {
2462 LINENR => $linenr,
2463 LINE => $line,
2464 };
2465
2466 push(@fixed_deleted, $deleted);
2467}
2468
2469sub ERROR {
2470 my ($type, $msg) = @_;
2471
2472 if (report("ERROR", $type, $msg)) {
2473 our $clean = 0;
2474 our $cnt_error++;
2475 return 1;
2476 }
2477 return 0;
2478}
2479sub WARN {
2480 my ($type, $msg) = @_;
2481
2482 if (report("WARNING", $type, $msg)) {
2483 our $clean = 0;
2484 our $cnt_warn++;
2485 return 1;
2486 }
2487 return 0;
2488}
2489sub CHK {
2490 my ($type, $msg) = @_;
2491
2492 if ($check && report("CHECK", $type, $msg)) {
2493 our $clean = 0;
2494 our $cnt_chk++;
2495 return 1;
2496 }
2497 return 0;
2498}
2499
2500sub check_absolute_file {
2501 my ($absolute, $herecurr) = @_;
2502 my $file = $absolute;
2503
2504 ##print "absolute<$absolute>\n";
2505
2506 # See if any suffix of this path is a path within the tree.
2507 while ($file =~ s@^[^/]*/@@) {
2508 if (-f "$root/$file") {
2509 ##print "file<$file>\n";
2510 last;
2511 }
2512 }
2513 if (! -f _) {
2514 return 0;
2515 }
2516
2517 # It is, so see if the prefix is acceptable.
2518 my $prefix = $absolute;
2519 substr($prefix, -length($file)) = '';
2520
2521 ##print "prefix<$prefix>\n";
2522 if ($prefix ne ".../") {
2523 WARN("USE_RELATIVE_PATH",
2524 "use relative pathname instead of absolute in changelog text\n" . $herecurr);
2525 }
2526}
2527
2528sub trim {
2529 my ($string) = @_;
2530
2531 $string =~ s/^\s+|\s+$//g;
2532
2533 return $string;
2534}
2535
2536sub ltrim {
2537 my ($string) = @_;
2538
2539 $string =~ s/^\s+//;
2540
2541 return $string;
2542}
2543
2544sub rtrim {
2545 my ($string) = @_;
2546
2547 $string =~ s/\s+$//;
2548
2549 return $string;
2550}
2551
2552sub string_find_replace {
2553 my ($string, $find, $replace) = @_;
2554
2555 $string =~ s/$find/$replace/g;
2556
2557 return $string;
2558}
2559
2560sub tabify {
2561 my ($leading) = @_;
2562
2563 my $source_indent = $tabsize;
2564 my $max_spaces_before_tab = $source_indent - 1;
2565 my $spaces_to_tab = " " x $source_indent;
2566
2567 #convert leading spaces to tabs
2568 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
2569 #Remove spaces before a tab
2570 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
2571
2572 return "$leading";
2573}
2574
2575sub pos_last_openparen {
2576 my ($line) = @_;
2577
2578 my $pos = 0;
2579
2580 my $opens = $line =~ tr/\(/\(/;
2581 my $closes = $line =~ tr/\)/\)/;
2582
2583 my $last_openparen = 0;
2584
2585 if (($opens == 0) || ($closes >= $opens)) {
2586 return -1;
2587 }
2588
2589 my $len = length($line);
2590
2591 for ($pos = 0; $pos < $len; $pos++) {
2592 my $string = substr($line, $pos);
2593 if ($string =~ /^($FuncArg|$balanced_parens)/) {
2594 $pos += length($1) - 1;
2595 } elsif (substr($line, $pos, 1) eq '(') {
2596 $last_openparen = $pos;
2597 } elsif (index($string, '(') == -1) {
2598 last;
2599 }
2600 }
2601
2602 return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
2603}
2604
2605sub get_raw_comment {
2606 my ($line, $rawline) = @_;
2607 my $comment = '';
2608
2609 for my $i (0 .. (length($line) - 1)) {
2610 if (substr($line, $i, 1) eq "$;") {
2611 $comment .= substr($rawline, $i, 1);
2612 }
2613 }
2614
2615 return $comment;
2616}
2617
2618sub exclude_global_initialisers {
2619 my ($realfile) = @_;
2620
2621 # Do not check for BPF programs (tools/testing/selftests/bpf/progs/*.c, samples/bpf/*_kern.c, *.bpf.c).
2622 return $realfile =~ m@^tools/testing/selftests/bpf/progs/.*\.c$@ ||
2623 $realfile =~ m@^samples/bpf/.*_kern\.c$@ ||
2624 $realfile =~ m@/bpf/.*\.bpf\.c$@;
2625}
2626
2627sub process {
2628 my $filename = shift;
2629
2630 my $linenr=0;
2631 my $prevline="";
2632 my $prevrawline="";
2633 my $stashline="";
2634 my $stashrawline="";
2635
2636 my $length;
2637 my $indent;
2638 my $previndent=0;
2639 my $stashindent=0;
2640
2641 our $clean = 1;
2642 my $signoff = 0;
2643 my $fixes_tag = 0;
2644 my $is_revert = 0;
2645 my $needs_fixes_tag = "";
2646 my $author = '';
2647 my $authorsignoff = 0;
2648 my $author_sob = '';
2649 my $is_patch = 0;
2650 my $is_binding_patch = -1;
2651 my $in_header_lines = $file ? 0 : 1;
2652 my $in_commit_log = 0; #Scanning lines before patch
2653 my $has_patch_separator = 0; #Found a --- line
2654 my $has_commit_log = 0; #Encountered lines before patch
2655 my $commit_log_lines = 0; #Number of commit log lines
2656 my $commit_log_possible_stack_dump = 0;
2657 my $commit_log_long_line = 0;
2658 my $commit_log_has_diff = 0;
2659 my $reported_maintainer_file = 0;
2660 my $non_utf8_charset = 0;
2661
2662 my $last_git_commit_id_linenr = -1;
2663
2664 my $last_blank_line = 0;
2665 my $last_coalesced_string_linenr = -1;
2666
2667 our @report = ();
2668 our $cnt_lines = 0;
2669 our $cnt_error = 0;
2670 our $cnt_warn = 0;
2671 our $cnt_chk = 0;
2672
2673 # Trace the real file/line as we go.
2674 my $realfile = '';
2675 my $realline = 0;
2676 my $realcnt = 0;
2677 my $here = '';
2678 my $context_function; #undef'd unless there's a known function
2679 my $in_comment = 0;
2680 my $comment_edge = 0;
2681 my $first_line = 0;
2682 my $p1_prefix = '';
2683
2684 my $prev_values = 'E';
2685
2686 # suppression flags
2687 my %suppress_ifbraces;
2688 my %suppress_whiletrailers;
2689 my %suppress_export;
2690 my $suppress_statement = 0;
2691
2692 my %signatures = ();
2693
2694 # Pre-scan the patch sanitizing the lines.
2695 # Pre-scan the patch looking for any __setup documentation.
2696 #
2697 my @setup_docs = ();
2698 my $setup_docs = 0;
2699
2700 my $camelcase_file_seeded = 0;
2701
2702 my $checklicenseline = 1;
2703
2704 sanitise_line_reset();
2705 my $line;
2706 foreach my $rawline (@rawlines) {
2707 $linenr++;
2708 $line = $rawline;
2709
2710 push(@fixed, $rawline) if ($fix);
2711
2712 if ($rawline=~/^\+\+\+\s+(\S+)/) {
2713 $setup_docs = 0;
2714 if ($1 =~ m@Documentation/admin-guide/kernel-parameters.txt$@) {
2715 $setup_docs = 1;
2716 }
2717 #next;
2718 }
2719 if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
2720 $realline=$1-1;
2721 if (defined $2) {
2722 $realcnt=$3+1;
2723 } else {
2724 $realcnt=1+1;
2725 }
2726 $in_comment = 0;
2727
2728 # Guestimate if this is a continuing comment. Run
2729 # the context looking for a comment "edge". If this
2730 # edge is a close comment then we must be in a comment
2731 # at context start.
2732 my $edge;
2733 my $cnt = $realcnt;
2734 for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
2735 next if (defined $rawlines[$ln - 1] &&
2736 $rawlines[$ln - 1] =~ /^-/);
2737 $cnt--;
2738 #print "RAW<$rawlines[$ln - 1]>\n";
2739 last if (!defined $rawlines[$ln - 1]);
2740 if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
2741 $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
2742 ($edge) = $1;
2743 last;
2744 }
2745 }
2746 if (defined $edge && $edge eq '*/') {
2747 $in_comment = 1;
2748 }
2749
2750 # Guestimate if this is a continuing comment. If this
2751 # is the start of a diff block and this line starts
2752 # ' *' then it is very likely a comment.
2753 if (!defined $edge &&
2754 $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
2755 {
2756 $in_comment = 1;
2757 }
2758
2759 ##print "COMMENT:$in_comment edge<$edge> $rawline\n";
2760 sanitise_line_reset($in_comment);
2761
2762 } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
2763 # Standardise the strings and chars within the input to
2764 # simplify matching -- only bother with positive lines.
2765 $line = sanitise_line($rawline);
2766 }
2767 push(@lines, $line);
2768
2769 if ($realcnt > 1) {
2770 $realcnt-- if ($line =~ /^(?:\+| |$)/);
2771 } else {
2772 $realcnt = 0;
2773 }
2774
2775 #print "==>$rawline\n";
2776 #print "-->$line\n";
2777
2778 if ($setup_docs && $line =~ /^\+/) {
2779 push(@setup_docs, $line);
2780 }
2781 }
2782
2783 $prefix = '';
2784
2785 $realcnt = 0;
2786 $linenr = 0;
2787 $fixlinenr = -1;
2788 foreach my $line (@lines) {
2789 $linenr++;
2790 $fixlinenr++;
2791 my $sline = $line; #copy of $line
2792 $sline =~ s/$;/ /g; #with comments as spaces
2793
2794 my $rawline = $rawlines[$linenr - 1];
2795 my $raw_comment = get_raw_comment($line, $rawline);
2796
2797# check if it's a mode change, rename or start of a patch
2798 if (!$in_commit_log &&
2799 ($line =~ /^ mode change [0-7]+ => [0-7]+ \S+\s*$/ ||
2800 ($line =~ /^rename (?:from|to) \S+\s*$/ ||
2801 $line =~ /^diff --git a\/[\w\/\.\_\-]+ b\/\S+\s*$/))) {
2802 $is_patch = 1;
2803 }
2804
2805#extract the line range in the file after the patch is applied
2806 if (!$in_commit_log &&
2807 $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {
2808 my $context = $4;
2809 $is_patch = 1;
2810 $first_line = $linenr + 1;
2811 $realline=$1-1;
2812 if (defined $2) {
2813 $realcnt=$3+1;
2814 } else {
2815 $realcnt=1+1;
2816 }
2817 annotate_reset();
2818 $prev_values = 'E';
2819
2820 %suppress_ifbraces = ();
2821 %suppress_whiletrailers = ();
2822 %suppress_export = ();
2823 $suppress_statement = 0;
2824 if ($context =~ /\b(\w+)\s*\(/) {
2825 $context_function = $1;
2826 } else {
2827 undef $context_function;
2828 }
2829 next;
2830
2831# track the line number as we move through the hunk, note that
2832# new versions of GNU diff omit the leading space on completely
2833# blank context lines so we need to count that too.
2834 } elsif ($line =~ /^( |\+|$)/) {
2835 $realline++;
2836 $realcnt-- if ($realcnt != 0);
2837
2838 # Measure the line length and indent.
2839 ($length, $indent) = line_stats($rawline);
2840
2841 # Track the previous line.
2842 ($prevline, $stashline) = ($stashline, $line);
2843 ($previndent, $stashindent) = ($stashindent, $indent);
2844 ($prevrawline, $stashrawline) = ($stashrawline, $rawline);
2845
2846 #warn "line<$line>\n";
2847
2848 } elsif ($realcnt == 1) {
2849 $realcnt--;
2850 }
2851
2852 my $hunk_line = ($realcnt != 0);
2853
2854 $here = "#$linenr: " if (!$file);
2855 $here = "#$realline: " if ($file);
2856
2857 my $found_file = 0;
2858 # extract the filename as it passes
2859 if ($line =~ /^diff --git.*?(\S+)$/) {
2860 $realfile = $1;
2861 $realfile =~ s@^([^/]*)/@@ if (!$file);
2862 $in_commit_log = 0;
2863 $found_file = 1;
2864 } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
2865 $realfile = $1;
2866 $realfile =~ s@^([^/]*)/@@ if (!$file);
2867 $in_commit_log = 0;
2868
2869 $p1_prefix = $1;
2870 if (!$file && $tree && $p1_prefix ne '' &&
2871 -e "$root/$p1_prefix") {
2872 WARN("PATCH_PREFIX",
2873 "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
2874 }
2875
2876 if ($realfile =~ m@^include/asm/@) {
2877 ERROR("MODIFIED_INCLUDE_ASM",
2878 "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
2879 }
2880 $found_file = 1;
2881 }
2882
2883#make up the handle for any error we report on this line
2884 if ($showfile) {
2885 $prefix = "$realfile:$realline: "
2886 } elsif ($emacs) {
2887 if ($file) {
2888 $prefix = "$filename:$realline: ";
2889 } else {
2890 $prefix = "$filename:$linenr: ";
2891 }
2892 }
2893
2894 if ($found_file) {
2895 if (is_maintained_obsolete($realfile)) {
2896 WARN("OBSOLETE",
2897 "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy. No unnecessary modifications please.\n");
2898 }
2899 if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
2900 $check = 1;
2901 } else {
2902 $check = $check_orig;
2903 }
2904 $checklicenseline = 1;
2905
2906 if ($realfile !~ /^MAINTAINERS/) {
2907 my $last_binding_patch = $is_binding_patch;
2908
2909 $is_binding_patch = () = $realfile =~ m@^(?:Documentation/devicetree/|include/dt-bindings/)@;
2910
2911 if (($last_binding_patch != -1) &&
2912 ($last_binding_patch ^ $is_binding_patch)) {
2913 WARN("DT_SPLIT_BINDING_PATCH",
2914 "DT binding docs and includes should be a separate patch. See: Documentation/devicetree/bindings/submitting-patches.rst\n");
2915 }
2916 }
2917
2918 next;
2919 }
2920
2921 $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
2922
2923 my $hereline = "$here\n$rawline\n";
2924 my $herecurr = "$here\n$rawline\n";
2925 my $hereprev = "$here\n$prevrawline\n$rawline\n";
2926
2927 $cnt_lines++ if ($realcnt != 0);
2928
2929# Verify the existence of a commit log if appropriate
2930# 2 is used because a $signature is counted in $commit_log_lines
2931 if ($in_commit_log) {
2932 if ($line !~ /^\s*$/) {
2933 $commit_log_lines++; #could be a $signature
2934 }
2935 } elsif ($has_commit_log && $commit_log_lines < 2) {
2936 WARN("COMMIT_MESSAGE",
2937 "Missing commit description - Add an appropriate one\n");
2938 $commit_log_lines = 2; #warn only once
2939 }
2940
2941# Check if the commit log has what seems like a diff which can confuse patch
2942 if ($in_commit_log && !$commit_log_has_diff &&
2943 (($line =~ m@^\s+diff\b.*a/([\w/]+)@ &&
2944 $line =~ m@^\s+diff\b.*a/[\w/]+\s+b/$1\b@) ||
2945 $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ ||
2946 $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) {
2947 ERROR("DIFF_IN_COMMIT_MSG",
2948 "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr);
2949 $commit_log_has_diff = 1;
2950 }
2951
2952# Check for incorrect file permissions
2953 if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
2954 my $permhere = $here . "FILE: $realfile\n";
2955 if ($realfile !~ m@scripts/@ &&
2956 $realfile !~ /\.(py|pl|awk|sh)$/) {
2957 ERROR("EXECUTE_PERMISSIONS",
2958 "do not set execute permissions for source files\n" . $permhere);
2959 }
2960 }
2961
2962# Check the patch for a From:
2963 if (decode("MIME-Header", $line) =~ /^From:\s*(.*)/) {
2964 $author = $1;
2965 my $curline = $linenr;
2966 while(defined($rawlines[$curline]) && ($rawlines[$curline++] =~ /^[ \t]\s*(.*)/)) {
2967 $author .= $1;
2968 }
2969 $author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i);
2970 $author =~ s/"//g;
2971 $author = reformat_email($author);
2972 }
2973
2974# Check the patch for a signoff:
2975 if ($line =~ /^\s*signed-off-by:\s*(.*)/i) {
2976 $signoff++;
2977 $in_commit_log = 0;
2978 if ($author ne '' && $authorsignoff != 1) {
2979 if (same_email_addresses($1, $author)) {
2980 $authorsignoff = 1;
2981 } else {
2982 my $ctx = $1;
2983 my ($email_name, $email_comment, $email_address, $comment1) = parse_email($ctx);
2984 my ($author_name, $author_comment, $author_address, $comment2) = parse_email($author);
2985
2986 if (lc $email_address eq lc $author_address && $email_name eq $author_name) {
2987 $author_sob = $ctx;
2988 $authorsignoff = 2;
2989 } elsif (lc $email_address eq lc $author_address) {
2990 $author_sob = $ctx;
2991 $authorsignoff = 3;
2992 } elsif ($email_name eq $author_name) {
2993 $author_sob = $ctx;
2994 $authorsignoff = 4;
2995
2996 my $address1 = $email_address;
2997 my $address2 = $author_address;
2998
2999 if ($address1 =~ /(\S+)\+\S+(\@.*)/) {
3000 $address1 = "$1$2";
3001 }
3002 if ($address2 =~ /(\S+)\+\S+(\@.*)/) {
3003 $address2 = "$1$2";
3004 }
3005 if ($address1 eq $address2) {
3006 $authorsignoff = 5;
3007 }
3008 }
3009 }
3010 }
3011 }
3012
3013# Check for patch separator
3014 if ($line =~ /^---$/) {
3015 $has_patch_separator = 1;
3016 $in_commit_log = 0;
3017 }
3018
3019# Check if MAINTAINERS is being updated. If so, there's probably no need to
3020# emit the "does MAINTAINERS need updating?" message on file add/move/delete
3021 if ($line =~ /^\s*MAINTAINERS\s*\|/) {
3022 $reported_maintainer_file = 1;
3023 }
3024
3025# Check signature styles
3026 if (!$in_header_lines &&
3027 $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
3028 my $space_before = $1;
3029 my $sign_off = $2;
3030 my $space_after = $3;
3031 my $email = $4;
3032 my $ucfirst_sign_off = ucfirst(lc($sign_off));
3033
3034 if ($sign_off !~ /$signature_tags/) {
3035 my $suggested_signature = find_standard_signature($sign_off);
3036 if ($suggested_signature eq "") {
3037 WARN("BAD_SIGN_OFF",
3038 "Non-standard signature: $sign_off\n" . $herecurr);
3039 } else {
3040 if (WARN("BAD_SIGN_OFF",
3041 "Non-standard signature: '$sign_off' - perhaps '$suggested_signature'?\n" . $herecurr) &&
3042 $fix) {
3043 $fixed[$fixlinenr] =~ s/$sign_off/$suggested_signature/;
3044 }
3045 }
3046 }
3047 if (defined $space_before && $space_before ne "") {
3048 if (WARN("BAD_SIGN_OFF",
3049 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
3050 $fix) {
3051 $fixed[$fixlinenr] =
3052 "$ucfirst_sign_off $email";
3053 }
3054 }
3055 if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
3056 if (WARN("BAD_SIGN_OFF",
3057 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
3058 $fix) {
3059 $fixed[$fixlinenr] =
3060 "$ucfirst_sign_off $email";
3061 }
3062
3063 }
3064 if (!defined $space_after || $space_after ne " ") {
3065 if (WARN("BAD_SIGN_OFF",
3066 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
3067 $fix) {
3068 $fixed[$fixlinenr] =
3069 "$ucfirst_sign_off $email";
3070 }
3071 }
3072
3073 my ($email_name, $name_comment, $email_address, $comment) = parse_email($email);
3074 my $suggested_email = format_email(($email_name, $name_comment, $email_address, $comment));
3075 if ($suggested_email eq "") {
3076 ERROR("BAD_SIGN_OFF",
3077 "Unrecognized email address: '$email'\n" . $herecurr);
3078 } else {
3079 my $dequoted = $suggested_email;
3080 $dequoted =~ s/^"//;
3081 $dequoted =~ s/" </ </;
3082 # Don't force email to have quotes
3083 # Allow just an angle bracketed address
3084 if (!same_email_addresses($email, $suggested_email)) {
3085 if (WARN("BAD_SIGN_OFF",
3086 "email address '$email' might be better as '$suggested_email'\n" . $herecurr) &&
3087 $fix) {
3088 $fixed[$fixlinenr] =~ s/\Q$email\E/$suggested_email/;
3089 }
3090 }
3091
3092 # Address part shouldn't have comments
3093 my $stripped_address = $email_address;
3094 $stripped_address =~ s/\([^\(\)]*\)//g;
3095 if ($email_address ne $stripped_address) {
3096 if (WARN("BAD_SIGN_OFF",
3097 "address part of email should not have comments: '$email_address'\n" . $herecurr) &&
3098 $fix) {
3099 $fixed[$fixlinenr] =~ s/\Q$email_address\E/$stripped_address/;
3100 }
3101 }
3102
3103 # Only one name comment should be allowed
3104 my $comment_count = () = $name_comment =~ /\([^\)]+\)/g;
3105 if ($comment_count > 1) {
3106 WARN("BAD_SIGN_OFF",
3107 "Use a single name comment in email: '$email'\n" . $herecurr);
3108 }
3109
3110
3111 # stable@vger.kernel.org or stable@kernel.org shouldn't
3112 # have an email name. In addition comments should strictly
3113 # begin with a #
3114 if ($email =~ /^.*stable\@(?:vger\.)?kernel\.org/i) {
3115 if (($comment ne "" && $comment !~ /^#.+/) ||
3116 ($email_name ne "")) {
3117 my $cur_name = $email_name;
3118 my $new_comment = $comment;
3119 $cur_name =~ s/[a-zA-Z\s\-\"]+//g;
3120
3121 # Remove brackets enclosing comment text
3122 # and # from start of comments to get comment text
3123 $new_comment =~ s/^\((.*)\)$/$1/;
3124 $new_comment =~ s/^\[(.*)\]$/$1/;
3125 $new_comment =~ s/^[\s\#]+|\s+$//g;
3126
3127 $new_comment = trim("$new_comment $cur_name") if ($cur_name ne $new_comment);
3128 $new_comment = " # $new_comment" if ($new_comment ne "");
3129 my $new_email = "$email_address$new_comment";
3130
3131 if (WARN("BAD_STABLE_ADDRESS_STYLE",
3132 "Invalid email format for stable: '$email', prefer '$new_email'\n" . $herecurr) &&
3133 $fix) {
3134 $fixed[$fixlinenr] =~ s/\Q$email\E/$new_email/;
3135 }
3136 }
3137 } elsif ($comment ne "" && $comment !~ /^(?:#.+|\(.+\))$/) {
3138 my $new_comment = $comment;
3139
3140 # Extract comment text from within brackets or
3141 # c89 style /*...*/ comments
3142 $new_comment =~ s/^\[(.*)\]$/$1/;
3143 $new_comment =~ s/^\/\*(.*)\*\/$/$1/;
3144
3145 $new_comment = trim($new_comment);
3146 $new_comment =~ s/^[^\w]$//; # Single lettered comment with non word character is usually a typo
3147 $new_comment = "($new_comment)" if ($new_comment ne "");
3148 my $new_email = format_email($email_name, $name_comment, $email_address, $new_comment);
3149
3150 if (WARN("BAD_SIGN_OFF",
3151 "Unexpected content after email: '$email', should be: '$new_email'\n" . $herecurr) &&
3152 $fix) {
3153 $fixed[$fixlinenr] =~ s/\Q$email\E/$new_email/;
3154 }
3155 }
3156 }
3157
3158# Check for duplicate signatures
3159 my $sig_nospace = $line;
3160 $sig_nospace =~ s/\s//g;
3161 $sig_nospace = lc($sig_nospace);
3162 if (defined $signatures{$sig_nospace}) {
3163 WARN("BAD_SIGN_OFF",
3164 "Duplicate signature\n" . $herecurr);
3165 } else {
3166 $signatures{$sig_nospace} = 1;
3167 }
3168
3169# Check Co-developed-by: immediately followed by Signed-off-by: with same name and email
3170 if ($sign_off =~ /^co-developed-by:$/i) {
3171 if ($email eq $author) {
3172 WARN("BAD_SIGN_OFF",
3173 "Co-developed-by: should not be used to attribute nominal patch author '$author'\n" . $herecurr);
3174 }
3175 if (!defined $lines[$linenr]) {
3176 WARN("BAD_SIGN_OFF",
3177 "Co-developed-by: must be immediately followed by Signed-off-by:\n" . $herecurr);
3178 } elsif ($rawlines[$linenr] !~ /^signed-off-by:\s*(.*)/i) {
3179 WARN("BAD_SIGN_OFF",
3180 "Co-developed-by: must be immediately followed by Signed-off-by:\n" . $herecurr . $rawlines[$linenr] . "\n");
3181 } elsif ($1 ne $email) {
3182 WARN("BAD_SIGN_OFF",
3183 "Co-developed-by and Signed-off-by: name/email do not match\n" . $herecurr . $rawlines[$linenr] . "\n");
3184 }
3185 }
3186
3187# check if Reported-by: is followed by a Closes: tag
3188 if ($sign_off =~ /^reported(?:|-and-tested)-by:$/i) {
3189 if (!defined $lines[$linenr]) {
3190 WARN("BAD_REPORTED_BY_LINK",
3191 "Reported-by: should be immediately followed by Closes: with a URL to the report\n" . $herecurr . "\n");
3192 } elsif ($rawlines[$linenr] !~ /^closes:\s*/i) {
3193 WARN("BAD_REPORTED_BY_LINK",
3194 "Reported-by: should be immediately followed by Closes: with a URL to the report\n" . $herecurr . $rawlines[$linenr] . "\n");
3195 }
3196 }
3197 }
3198
3199# These indicate a bug fix
3200 if (!$in_header_lines && !$is_patch &&
3201 $line =~ /^This reverts commit/) {
3202 $is_revert = 1;
3203 }
3204
3205 if (!$in_header_lines && !$is_patch &&
3206 $line =~ /((?:(?:BUG: K.|UB)SAN: |Call Trace:|stable\@|syzkaller))/) {
3207 $needs_fixes_tag = $1;
3208 }
3209
3210# Check Fixes: styles is correct
3211 if (!$in_header_lines &&
3212 $line =~ /^\s*(fixes:?)\s*(?:commit\s*)?([0-9a-f]{5,40})(?:\s*($balanced_parens))?/i) {
3213 my $tag = $1;
3214 my $orig_commit = $2;
3215 my $title;
3216 my $title_has_quotes = 0;
3217 $fixes_tag = 1;
3218 if (defined $3) {
3219 # Always strip leading/trailing parens then double quotes if existing
3220 $title = substr($3, 1, -1);
3221 if ($title =~ /^".*"$/) {
3222 $title = substr($title, 1, -1);
3223 $title_has_quotes = 1;
3224 }
3225 } else {
3226 $title = "commit title"
3227 }
3228
3229
3230 my $tag_case = not ($tag eq "Fixes:");
3231 my $tag_space = not ($line =~ /^fixes:? [0-9a-f]{5,40} ($balanced_parens)/i);
3232
3233 my $id_length = not ($orig_commit =~ /^[0-9a-f]{12}$/i);
3234 my $id_case = not ($orig_commit !~ /[A-F]/);
3235
3236 my $id = "0123456789ab";
3237 my ($cid, $ctitle) = git_commit_info($orig_commit, $id,
3238 $title);
3239
3240 if ($ctitle ne $title || $tag_case || $tag_space ||
3241 $id_length || $id_case || !$title_has_quotes) {
3242 if (WARN("BAD_FIXES_TAG",
3243 "Please use correct Fixes: style 'Fixes: <12 chars of sha1> (\"<title line>\")' - ie: 'Fixes: $cid (\"$ctitle\")'\n" . $herecurr) &&
3244 $fix) {
3245 $fixed[$fixlinenr] = "Fixes: $cid (\"$ctitle\")";
3246 }
3247 }
3248 }
3249
3250# Check email subject for common tools that don't need to be mentioned
3251 if ($in_header_lines &&
3252 $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) {
3253 WARN("EMAIL_SUBJECT",
3254 "A patch subject line should describe the change not the tool that found it\n" . $herecurr);
3255 }
3256
3257# Check for Gerrit Change-Ids not in any patch context
3258 if ($realfile eq '' && !$has_patch_separator && $line =~ /^\s*change-id:/i) {
3259 if (ERROR("GERRIT_CHANGE_ID",
3260 "Remove Gerrit Change-Id's before submitting upstream\n" . $herecurr) &&
3261 $fix) {
3262 fix_delete_line($fixlinenr, $rawline);
3263 }
3264 }
3265
3266# Check if the commit log is in a possible stack dump
3267 if ($in_commit_log && !$commit_log_possible_stack_dump &&
3268 ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
3269 $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||
3270 # timestamp
3271 $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/) ||
3272 $line =~ /^(?:\s+\w+:\s+[0-9a-fA-F]+){3,3}/ ||
3273 $line =~ /^\s*\#\d+\s*\[[0-9a-fA-F]+\]\s*\w+ at [0-9a-fA-F]+/) {
3274 # stack dump address styles
3275 $commit_log_possible_stack_dump = 1;
3276 }
3277
3278# Check for line lengths > 75 in commit log, warn once
3279 if ($in_commit_log && !$commit_log_long_line &&
3280 length($line) > 75 &&
3281 !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ ||
3282 # file delta changes
3283 $line =~ /^\s*(?:[\w\.\-\+]*\/)++[\w\.\-\+]+:/ ||
3284 # filename then :
3285 $line =~ /^\s*(?:Fixes:|$link_tags_search|$signature_tags)/i ||
3286 # A Fixes:, link or signature tag line
3287 $commit_log_possible_stack_dump)) {
3288 WARN("COMMIT_LOG_LONG_LINE",
3289 "Prefer a maximum 75 chars per line (possible unwrapped commit description?)\n" . $herecurr);
3290 $commit_log_long_line = 1;
3291 }
3292
3293# Reset possible stack dump if a blank line is found
3294 if ($in_commit_log && $commit_log_possible_stack_dump &&
3295 $line =~ /^\s*$/) {
3296 $commit_log_possible_stack_dump = 0;
3297 }
3298
3299# Check for odd tags before a URI/URL
3300 if ($in_commit_log &&
3301 $line =~ /^\s*(\w+:)\s*http/ && $1 !~ /^$link_tags_search$/) {
3302 if ($1 =~ /^v(?:ersion)?\d+/i) {
3303 WARN("COMMIT_LOG_VERSIONING",
3304 "Patch version information should be after the --- line\n" . $herecurr);
3305 } else {
3306 WARN("COMMIT_LOG_USE_LINK",
3307 "Unknown link reference '$1', use $link_tags_print instead\n" . $herecurr);
3308 }
3309 }
3310
3311# Check for misuse of the link tags
3312 if ($in_commit_log &&
3313 $line =~ /^\s*(\w+:)\s*(\S+)/) {
3314 my $tag = $1;
3315 my $value = $2;
3316 if ($tag =~ /^$link_tags_search$/ && $value !~ m{^https?://}) {
3317 WARN("COMMIT_LOG_WRONG_LINK",
3318 "'$tag' should be followed by a public http(s) link\n" . $herecurr);
3319 }
3320 }
3321
3322# Check for lines starting with a #
3323 if ($in_commit_log && $line =~ /^#/) {
3324 if (WARN("COMMIT_COMMENT_SYMBOL",
3325 "Commit log lines starting with '#' are dropped by git as comments\n" . $herecurr) &&
3326 $fix) {
3327 $fixed[$fixlinenr] =~ s/^/ /;
3328 }
3329 }
3330
3331# Check for git id commit length and improperly formed commit descriptions
3332# A correctly formed commit description is:
3333# commit <SHA-1 hash length 12+ chars> ("Complete commit subject")
3334# with the commit subject '("' prefix and '")' suffix
3335# This is a fairly compilicated block as it tests for what appears to be
3336# bare SHA-1 hash with minimum length of 5. It also avoids several types of
3337# possible SHA-1 matches.
3338# A commit match can span multiple lines so this block attempts to find a
3339# complete typical commit on a maximum of 3 lines
3340 if ($perl_version_ok &&
3341 $in_commit_log && !$commit_log_possible_stack_dump &&
3342 $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink|base-commit):/i &&
3343 $line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
3344 (($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
3345 ($line =~ /\bcommit\s*$/i && defined($rawlines[$linenr]) && $rawlines[$linenr] =~ /^\s*[0-9a-f]{5,}\b/i)) ||
3346 ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
3347 $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
3348 $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
3349 my $init_char = "c";
3350 my $orig_commit = "";
3351 my $short = 1;
3352 my $long = 0;
3353 my $case = 1;
3354 my $space = 1;
3355 my $id = '0123456789ab';
3356 my $orig_desc = "commit description";
3357 my $description = "";
3358 my $herectx = $herecurr;
3359 my $has_parens = 0;
3360 my $has_quotes = 0;
3361
3362 my $input = $line;
3363 if ($line =~ /(?:\bcommit\s+[0-9a-f]{5,}|\bcommit\s*$)/i) {
3364 for (my $n = 0; $n < 2; $n++) {
3365 if ($input =~ /\bcommit\s+[0-9a-f]{5,}\s*($balanced_parens)/i) {
3366 $orig_desc = $1;
3367 $has_parens = 1;
3368 # Always strip leading/trailing parens then double quotes if existing
3369 $orig_desc = substr($orig_desc, 1, -1);
3370 if ($orig_desc =~ /^".*"$/) {
3371 $orig_desc = substr($orig_desc, 1, -1);
3372 $has_quotes = 1;
3373 }
3374 last;
3375 }
3376 last if ($#lines < $linenr + $n);
3377 $input .= " " . trim($rawlines[$linenr + $n]);
3378 $herectx .= "$rawlines[$linenr + $n]\n";
3379 }
3380 $herectx = $herecurr if (!$has_parens);
3381 }
3382
3383 if ($input =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
3384 $init_char = $1;
3385 $orig_commit = lc($2);
3386 $short = 0 if ($input =~ /\bcommit\s+[0-9a-f]{12,40}/i);
3387 $long = 1 if ($input =~ /\bcommit\s+[0-9a-f]{41,}/i);
3388 $space = 0 if ($input =~ /\bcommit [0-9a-f]/i);
3389 $case = 0 if ($input =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
3390 } elsif ($input =~ /\b([0-9a-f]{12,40})\b/i) {
3391 $orig_commit = lc($1);
3392 }
3393
3394 ($id, $description) = git_commit_info($orig_commit,
3395 $id, $orig_desc);
3396
3397 if (defined($id) &&
3398 ($short || $long || $space || $case || ($orig_desc ne $description) || !$has_quotes) &&
3399 $last_git_commit_id_linenr != $linenr - 1) {
3400 ERROR("GIT_COMMIT_ID",
3401 "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herectx);
3402 }
3403 #don't report the next line if this line ends in commit and the sha1 hash is the next line
3404 $last_git_commit_id_linenr = $linenr if ($line =~ /\bcommit\s*$/i);
3405 }
3406
3407# Check for mailing list archives other than lore.kernel.org
3408 if ($rawline =~ m{http.*\b$obsolete_archives}) {
3409 WARN("PREFER_LORE_ARCHIVE",
3410 "Use lore.kernel.org archive links when possible - see https://lore.kernel.org/lists.html\n" . $herecurr);
3411 }
3412
3413# Check for added, moved or deleted files
3414 if (!$reported_maintainer_file && !$in_commit_log &&
3415 ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
3416 $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
3417 ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
3418 (defined($1) || defined($2))))) {
3419 $is_patch = 1;
3420 $reported_maintainer_file = 1;
3421 WARN("FILE_PATH_CHANGES",
3422 "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
3423 }
3424
3425# Check for adding new DT bindings not in schema format
3426 if (!$in_commit_log &&
3427 ($line =~ /^new file mode\s*\d+\s*$/) &&
3428 ($realfile =~ m@^Documentation/devicetree/bindings/.*\.txt$@)) {
3429 WARN("DT_SCHEMA_BINDING_PATCH",
3430 "DT bindings should be in DT schema format. See: Documentation/devicetree/bindings/writing-schema.rst\n");
3431 }
3432
3433# Check for wrappage within a valid hunk of the file
3434 if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
3435 ERROR("CORRUPTED_PATCH",
3436 "patch seems to be corrupt (line wrapped?)\n" .
3437 $herecurr) if (!$emitted_corrupt++);
3438 }
3439
3440# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
3441 if (($realfile =~ /^$/ || $line =~ /^\+/) &&
3442 $rawline !~ m/^$UTF8*$/) {
3443 my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
3444
3445 my $blank = copy_spacing($rawline);
3446 my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
3447 my $hereptr = "$hereline$ptr\n";
3448
3449 CHK("INVALID_UTF8",
3450 "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
3451 }
3452
3453# Check if it's the start of a commit log
3454# (not a header line and we haven't seen the patch filename)
3455 if ($in_header_lines && $realfile =~ /^$/ &&
3456 !($rawline =~ /^\s+(?:\S|$)/ ||
3457 $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {
3458 $in_header_lines = 0;
3459 $in_commit_log = 1;
3460 $has_commit_log = 1;
3461 }
3462
3463# Check if there is UTF-8 in a commit log when a mail header has explicitly
3464# declined it, i.e defined some charset where it is missing.
3465 if ($in_header_lines &&
3466 $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
3467 $1 !~ /utf-8/i) {
3468 $non_utf8_charset = 1;
3469 }
3470
3471 if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
3472 $rawline =~ /$NON_ASCII_UTF8/) {
3473 WARN("UTF8_BEFORE_PATCH",
3474 "8-bit UTF-8 used in possible commit log\n" . $herecurr);
3475 }
3476
3477# Check for absolute kernel paths in commit message
3478 if ($tree && $in_commit_log) {
3479 while ($line =~ m{(?:^|\s)(/\S*)}g) {
3480 my $file = $1;
3481
3482 if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
3483 check_absolute_file($1, $herecurr)) {
3484 #
3485 } else {
3486 check_absolute_file($file, $herecurr);
3487 }
3488 }
3489 }
3490
3491# Check for various typo / spelling mistakes
3492 if (defined($misspellings) &&
3493 ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
3494 while ($rawline =~ /(?:^|[^\w\-'`])($misspellings)(?:[^\w\-'`]|$)/gi) {
3495 my $typo = $1;
3496 my $blank = copy_spacing($rawline);
3497 my $ptr = substr($blank, 0, $-[1]) . "^" x length($typo);
3498 my $hereptr = "$hereline$ptr\n";
3499 my $typo_fix = $spelling_fix{lc($typo)};
3500 $typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
3501 $typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
3502 my $msg_level = \&WARN;
3503 $msg_level = \&CHK if ($file);
3504 if (&{$msg_level}("TYPO_SPELLING",
3505 "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $hereptr) &&
3506 $fix) {
3507 $fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
3508 }
3509 }
3510 }
3511
3512# check for invalid commit id
3513 if ($in_commit_log && $line =~ /(^fixes:|\bcommit)\s+([0-9a-f]{6,40})\b/i) {
3514 my $id;
3515 my $description;
3516 ($id, $description) = git_commit_info($2, undef, undef);
3517 if (!defined($id)) {
3518 WARN("UNKNOWN_COMMIT_ID",
3519 "Unknown commit id '$2', maybe rebased or not pulled?\n" . $herecurr);
3520 }
3521 }
3522
3523# check for repeated words separated by a single space
3524# avoid false positive from list command eg, '-rw-r--r-- 1 root root'
3525 if (($rawline =~ /^\+/ || $in_commit_log) &&
3526 $rawline !~ /[bcCdDlMnpPs\?-][rwxsStT-]{9}/) {
3527 pos($rawline) = 1 if (!$in_commit_log);
3528 while ($rawline =~ /\b($word_pattern) (?=($word_pattern))/g) {
3529
3530 my $first = $1;
3531 my $second = $2;
3532 my $start_pos = $-[1];
3533 my $end_pos = $+[2];
3534 if ($first =~ /(?:struct|union|enum)/) {
3535 pos($rawline) += length($first) + length($second) + 1;
3536 next;
3537 }
3538
3539 next if (lc($first) ne lc($second));
3540 next if ($first eq 'long');
3541
3542 # check for character before and after the word matches
3543 my $start_char = '';
3544 my $end_char = '';
3545 $start_char = substr($rawline, $start_pos - 1, 1) if ($start_pos > ($in_commit_log ? 0 : 1));
3546 $end_char = substr($rawline, $end_pos, 1) if ($end_pos < length($rawline));
3547
3548 next if ($start_char =~ /^\S$/);
3549 next if (index(" \t.,;?!", $end_char) == -1);
3550
3551 # avoid repeating hex occurrences like 'ff ff fe 09 ...'
3552 if ($first =~ /\b[0-9a-f]{2,}\b/i) {
3553 next if (!exists($allow_repeated_words{lc($first)}));
3554 }
3555
3556 if (WARN("REPEATED_WORD",
3557 "Possible repeated word: '$first'\n" . $herecurr) &&
3558 $fix) {
3559 $fixed[$fixlinenr] =~ s/\b$first $second\b/$first/;
3560 }
3561 }
3562
3563 # if it's a repeated word on consecutive lines in a comment block
3564 if ($prevline =~ /$;+\s*$/ &&
3565 $prevrawline =~ /($word_pattern)\s*$/) {
3566 my $last_word = $1;
3567 if ($rawline =~ /^\+\s*\*\s*$last_word /) {
3568 if (WARN("REPEATED_WORD",
3569 "Possible repeated word: '$last_word'\n" . $hereprev) &&
3570 $fix) {
3571 $fixed[$fixlinenr] =~ s/(\+\s*\*\s*)$last_word /$1/;
3572 }
3573 }
3574 }
3575 }
3576
3577# ignore non-hunk lines and lines being removed
3578 next if (!$hunk_line || $line =~ /^-/);
3579
3580#trailing whitespace
3581 if ($line =~ /^\+.*\015/) {
3582 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3583 if (ERROR("DOS_LINE_ENDINGS",
3584 "DOS line endings\n" . $herevet) &&
3585 $fix) {
3586 $fixed[$fixlinenr] =~ s/[\s\015]+$//;
3587 }
3588 } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
3589 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3590 if (ERROR("TRAILING_WHITESPACE",
3591 "trailing whitespace\n" . $herevet) &&
3592 $fix) {
3593 $fixed[$fixlinenr] =~ s/\s+$//;
3594 }
3595
3596 $rpt_cleaners = 1;
3597 }
3598
3599# Check for FSF mailing addresses.
3600 if ($rawline =~ /\bwrite to the Free/i ||
3601 $rawline =~ /\b675\s+Mass\s+Ave/i ||
3602 $rawline =~ /\b59\s+Temple\s+Pl/i ||
3603 $rawline =~ /\b51\s+Franklin\s+St/i) {
3604 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3605 my $msg_level = \&ERROR;
3606 $msg_level = \&CHK if ($file);
3607 &{$msg_level}("FSF_MAILING_ADDRESS",
3608 "Do not include the paragraph about writing to the Free Software Foundation's mailing address from the sample GPL notice. The FSF has changed addresses in the past, and may do so again. Linux already includes a copy of the GPL.\n" . $herevet)
3609 }
3610
3611# check for Kconfig help text having a real description
3612# Only applies when adding the entry originally, after that we do not have
3613# sufficient context to determine whether it is indeed long enough.
3614 if ($realfile =~ /Kconfig/ &&
3615 # 'choice' is usually the last thing on the line (though
3616 # Kconfig supports named choices), so use a word boundary
3617 # (\b) rather than a whitespace character (\s)
3618 $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) {
3619 my $ln = $linenr;
3620 my $needs_help = 0;
3621 my $has_help = 0;
3622 my $help_length = 0;
3623 while (defined $lines[$ln]) {
3624 my $f = $lines[$ln++];
3625
3626 next if ($f =~ /^-/);
3627 last if ($f !~ /^[\+ ]/); # !patch context
3628
3629 if ($f =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) {
3630 $needs_help = 1;
3631 next;
3632 }
3633 if ($f =~ /^\+\s*help\s*$/) {
3634 $has_help = 1;
3635 next;
3636 }
3637
3638 $f =~ s/^.//; # strip patch context [+ ]
3639 $f =~ s/#.*//; # strip # directives
3640 $f =~ s/^\s+//; # strip leading blanks
3641 next if ($f =~ /^$/); # skip blank lines
3642
3643 # At the end of this Kconfig block:
3644 # This only checks context lines in the patch
3645 # and so hopefully shouldn't trigger false
3646 # positives, even though some of these are
3647 # common words in help texts
3648 if ($f =~ /^(?:config|menuconfig|choice|endchoice|
3649 if|endif|menu|endmenu|source)\b/x) {
3650 last;
3651 }
3652 $help_length++ if ($has_help);
3653 }
3654 if ($needs_help &&
3655 $help_length < $min_conf_desc_length) {
3656 my $stat_real = get_stat_real($linenr, $ln - 1);
3657 WARN("CONFIG_DESCRIPTION",
3658 "please write a help paragraph that fully describes the config symbol\n" . "$here\n$stat_real\n");
3659 }
3660 }
3661
3662# check MAINTAINERS entries
3663 if ($realfile =~ /^MAINTAINERS$/) {
3664# check MAINTAINERS entries for the right form
3665 if ($rawline =~ /^\+[A-Z]:/ &&
3666 $rawline !~ /^\+[A-Z]:\t\S/) {
3667 if (WARN("MAINTAINERS_STYLE",
3668 "MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) &&
3669 $fix) {
3670 $fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/;
3671 }
3672 }
3673# check MAINTAINERS entries for the right ordering too
3674 my $preferred_order = 'MRLSWQBCPTFXNK';
3675 if ($rawline =~ /^\+[A-Z]:/ &&
3676 $prevrawline =~ /^[\+ ][A-Z]:/) {
3677 $rawline =~ /^\+([A-Z]):\s*(.*)/;
3678 my $cur = $1;
3679 my $curval = $2;
3680 $prevrawline =~ /^[\+ ]([A-Z]):\s*(.*)/;
3681 my $prev = $1;
3682 my $prevval = $2;
3683 my $curindex = index($preferred_order, $cur);
3684 my $previndex = index($preferred_order, $prev);
3685 if ($curindex < 0) {
3686 WARN("MAINTAINERS_STYLE",
3687 "Unknown MAINTAINERS entry type: '$cur'\n" . $herecurr);
3688 } else {
3689 if ($previndex >= 0 && $curindex < $previndex) {
3690 WARN("MAINTAINERS_STYLE",
3691 "Misordered MAINTAINERS entry - list '$cur:' before '$prev:'\n" . $hereprev);
3692 } elsif ((($prev eq 'F' && $cur eq 'F') ||
3693 ($prev eq 'X' && $cur eq 'X')) &&
3694 ($prevval cmp $curval) > 0) {
3695 WARN("MAINTAINERS_STYLE",
3696 "Misordered MAINTAINERS entry - list file patterns in alphabetic order\n" . $hereprev);
3697 }
3698 }
3699 }
3700 }
3701
3702 if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
3703 ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
3704 my $flag = $1;
3705 my $replacement = {
3706 'EXTRA_AFLAGS' => 'asflags-y',
3707 'EXTRA_CFLAGS' => 'ccflags-y',
3708 'EXTRA_CPPFLAGS' => 'cppflags-y',
3709 'EXTRA_LDFLAGS' => 'ldflags-y',
3710 };
3711
3712 WARN("DEPRECATED_VARIABLE",
3713 "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
3714 }
3715
3716# check for DT compatible documentation
3717 if (defined $root &&
3718 (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
3719 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
3720
3721 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
3722
3723 my $dt_path = $root . "/Documentation/devicetree/bindings/";
3724 my $vp_file = $dt_path . "vendor-prefixes.yaml";
3725
3726 foreach my $compat (@compats) {
3727 my $compat2 = $compat;
3728 $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
3729 my $compat3 = $compat;
3730 $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
3731 `grep -Erq "$compat|$compat2|$compat3" $dt_path`;
3732 if ( $? >> 8 ) {
3733 WARN("UNDOCUMENTED_DT_STRING",
3734 "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
3735 }
3736
3737 next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
3738 my $vendor = $1;
3739 `grep -Eq "\\"\\^\Q$vendor\E,\\.\\*\\":" $vp_file`;
3740 if ( $? >> 8 ) {
3741 WARN("UNDOCUMENTED_DT_STRING",
3742 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
3743 }
3744 }
3745 }
3746
3747# check for using SPDX license tag at beginning of files
3748 if ($realline == $checklicenseline) {
3749 if ($rawline =~ /^[ \+]\s*\#\!\s*\//) {
3750 $checklicenseline = 2;
3751 } elsif ($rawline =~ /^\+/) {
3752 my $comment = "";
3753 if ($realfile =~ /\.(h|s|S)$/) {
3754 $comment = '/*';
3755 } elsif ($realfile =~ /\.(c|rs|dts|dtsi)$/) {
3756 $comment = '//';
3757 } elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc|yaml)$/) {
3758 $comment = '#';
3759 } elsif ($realfile =~ /\.rst$/) {
3760 $comment = '..';
3761 }
3762
3763# check SPDX comment style for .[chsS] files
3764 if ($realfile =~ /\.[chsS]$/ &&
3765 $rawline =~ /SPDX-License-Identifier:/ &&
3766 $rawline !~ m@^\+\s*\Q$comment\E\s*@) {
3767 WARN("SPDX_LICENSE_TAG",
3768 "Improper SPDX comment style for '$realfile', please use '$comment' instead\n" . $herecurr);
3769 }
3770
3771 if ($comment !~ /^$/ &&
3772 $rawline !~ m@^\+\Q$comment\E SPDX-License-Identifier: @) {
3773 WARN("SPDX_LICENSE_TAG",
3774 "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr);
3775 } elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) {
3776 my $spdx_license = $1;
3777 if (!is_SPDX_License_valid($spdx_license)) {
3778 WARN("SPDX_LICENSE_TAG",
3779 "'$spdx_license' is not supported in LICENSES/...\n" . $herecurr);
3780 }
3781 if ($realfile =~ m@^Documentation/devicetree/bindings/@ &&
3782 $spdx_license !~ /GPL-2\.0(?:-only)? OR BSD-2-Clause/) {
3783 my $msg_level = \&WARN;
3784 $msg_level = \&CHK if ($file);
3785 if (&{$msg_level}("SPDX_LICENSE_TAG",
3786
3787 "DT binding documents should be licensed (GPL-2.0-only OR BSD-2-Clause)\n" . $herecurr) &&
3788 $fix) {
3789 $fixed[$fixlinenr] =~ s/SPDX-License-Identifier: .*/SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)/;
3790 }
3791 }
3792 if ($realfile =~ m@^include/dt-bindings/@ &&
3793 $spdx_license !~ /GPL-2\.0(?:-only)? OR \S+/) {
3794 WARN("SPDX_LICENSE_TAG",
3795 "DT binding headers should be licensed (GPL-2.0-only OR .*)\n" . $herecurr);
3796 }
3797 }
3798 }
3799 }
3800
3801# check for embedded filenames
3802 if ($rawline =~ /^\+.*\b\Q$realfile\E\b/) {
3803 WARN("EMBEDDED_FILENAME",
3804 "It's generally not useful to have the filename in the file\n" . $herecurr);
3805 }
3806
3807# check we are in a valid source file if not then ignore this hunk
3808 next if ($realfile !~ /\.(h|c|rs|s|S|sh|dtsi|dts)$/);
3809
3810# check for using SPDX-License-Identifier on the wrong line number
3811 if ($realline != $checklicenseline &&
3812 $rawline =~ /\bSPDX-License-Identifier:/ &&
3813 substr($line, @-, @+ - @-) eq "$;" x (@+ - @-)) {
3814 WARN("SPDX_LICENSE_TAG",
3815 "Misplaced SPDX-License-Identifier tag - use line $checklicenseline instead\n" . $herecurr);
3816 }
3817
3818# line length limit (with some exclusions)
3819#
3820# There are a few types of lines that may extend beyond $max_line_length:
3821# logging functions like pr_info that end in a string
3822# lines with a single string
3823# #defines that are a single string
3824# lines with an RFC3986 like URL
3825#
3826# There are 3 different line length message types:
3827# LONG_LINE_COMMENT a comment starts before but extends beyond $max_line_length
3828# LONG_LINE_STRING a string starts before but extends beyond $max_line_length
3829# LONG_LINE all other lines longer than $max_line_length
3830#
3831# if LONG_LINE is ignored, the other 2 types are also ignored
3832#
3833
3834 if ($line =~ /^\+/ && $length > $max_line_length) {
3835 my $msg_type = "LONG_LINE";
3836
3837 # Check the allowed long line types first
3838
3839 # logging functions that end in a string that starts
3840 # before $max_line_length
3841 if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&
3842 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
3843 $msg_type = "";
3844
3845 # lines with only strings (w/ possible termination)
3846 # #defines with only strings
3847 } elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
3848 $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {
3849 $msg_type = "";
3850
3851 # More special cases
3852 } elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ ||
3853 $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {
3854 $msg_type = "";
3855
3856 # URL ($rawline is used in case the URL is in a comment)
3857 } elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) {
3858 $msg_type = "";
3859
3860 # Otherwise set the alternate message types
3861
3862 # a comment starts before $max_line_length
3863 } elsif ($line =~ /($;[\s$;]*)$/ &&
3864 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
3865 $msg_type = "LONG_LINE_COMMENT"
3866
3867 # a quoted string starts before $max_line_length
3868 } elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&
3869 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
3870 $msg_type = "LONG_LINE_STRING"
3871 }
3872
3873 if ($msg_type ne "" &&
3874 show_type("LONG_LINE") && show_type($msg_type)) {
3875 my $msg_level = \&WARN;
3876 $msg_level = \&CHK if ($file);
3877 &{$msg_level}($msg_type,
3878 "line length of $length exceeds $max_line_length columns\n" . $herecurr);
3879 }
3880 }
3881
3882# check for adding lines without a newline.
3883 if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
3884 if (WARN("MISSING_EOF_NEWLINE",
3885 "adding a line without newline at end of file\n" . $herecurr) &&
3886 $fix) {
3887 fix_delete_line($fixlinenr+1, "No newline at end of file");
3888 }
3889 }
3890
3891# check for .L prefix local symbols in .S files
3892 if ($realfile =~ /\.S$/ &&
3893 $line =~ /^\+\s*(?:[A-Z]+_)?SYM_[A-Z]+_(?:START|END)(?:_[A-Z_]+)?\s*\(\s*\.L/) {
3894 WARN("AVOID_L_PREFIX",
3895 "Avoid using '.L' prefixed local symbol names for denoting a range of code via 'SYM_*_START/END' annotations; see Documentation/core-api/asm-annotations.rst\n" . $herecurr);
3896 }
3897
3898# check we are in a valid source file C or perl if not then ignore this hunk
3899 next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
3900
3901# at the beginning of a line any tabs must come first and anything
3902# more than $tabsize must use tabs.
3903 if ($rawline =~ /^\+\s* \t\s*\S/ ||
3904 $rawline =~ /^\+\s* \s*/) {
3905 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3906 $rpt_cleaners = 1;
3907 if (ERROR("CODE_INDENT",
3908 "code indent should use tabs where possible\n" . $herevet) &&
3909 $fix) {
3910 $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3911 }
3912 }
3913
3914# check for space before tabs.
3915 if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
3916 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3917 if (WARN("SPACE_BEFORE_TAB",
3918 "please, no space before tabs\n" . $herevet) &&
3919 $fix) {
3920 while ($fixed[$fixlinenr] =~
3921 s/(^\+.*) {$tabsize,$tabsize}\t/$1\t\t/) {}
3922 while ($fixed[$fixlinenr] =~
3923 s/(^\+.*) +\t/$1\t/) {}
3924 }
3925 }
3926
3927# check for assignments on the start of a line
3928 if ($sline =~ /^\+\s+($Assignment)[^=]/) {
3929 my $operator = $1;
3930 if (CHK("ASSIGNMENT_CONTINUATIONS",
3931 "Assignment operator '$1' should be on the previous line\n" . $hereprev) &&
3932 $fix && $prevrawline =~ /^\+/) {
3933 # add assignment operator to the previous line, remove from current line
3934 $fixed[$fixlinenr - 1] .= " $operator";
3935 $fixed[$fixlinenr] =~ s/\Q$operator\E\s*//;
3936 }
3937 }
3938
3939# check for && or || at the start of a line
3940 if ($rawline =~ /^\+\s*(&&|\|\|)/) {
3941 my $operator = $1;
3942 if (CHK("LOGICAL_CONTINUATIONS",
3943 "Logical continuations should be on the previous line\n" . $hereprev) &&
3944 $fix && $prevrawline =~ /^\+/) {
3945 # insert logical operator at last non-comment, non-whitepsace char on previous line
3946 $prevline =~ /[\s$;]*$/;
3947 my $line_end = substr($prevrawline, $-[0]);
3948 $fixed[$fixlinenr - 1] =~ s/\Q$line_end\E$/ $operator$line_end/;
3949 $fixed[$fixlinenr] =~ s/\Q$operator\E\s*//;
3950 }
3951 }
3952
3953# check indentation starts on a tab stop
3954 if ($perl_version_ok &&
3955 $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
3956 my $indent = length($1);
3957 if ($indent % $tabsize) {
3958 if (WARN("TABSTOP",
3959 "Statements should start on a tabstop\n" . $herecurr) &&
3960 $fix) {
3961 $fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/$tabsize)@e;
3962 }
3963 }
3964 }
3965
3966# check multi-line statement indentation matches previous line
3967 if ($perl_version_ok &&
3968 $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
3969 $prevline =~ /^\+(\t*)(.*)$/;
3970 my $oldindent = $1;
3971 my $rest = $2;
3972
3973 my $pos = pos_last_openparen($rest);
3974 if ($pos >= 0) {
3975 $line =~ /^(\+| )([ \t]*)/;
3976 my $newindent = $2;
3977
3978 my $goodtabindent = $oldindent .
3979 "\t" x ($pos / $tabsize) .
3980 " " x ($pos % $tabsize);
3981 my $goodspaceindent = $oldindent . " " x $pos;
3982
3983 if ($newindent ne $goodtabindent &&
3984 $newindent ne $goodspaceindent) {
3985
3986 if (CHK("PARENTHESIS_ALIGNMENT",
3987 "Alignment should match open parenthesis\n" . $hereprev) &&
3988 $fix && $line =~ /^\+/) {
3989 $fixed[$fixlinenr] =~
3990 s/^\+[ \t]*/\+$goodtabindent/;
3991 }
3992 }
3993 }
3994 }
3995
3996# check for space after cast like "(int) foo" or "(struct foo) bar"
3997# avoid checking a few false positives:
3998# "sizeof(<type>)" or "__alignof__(<type>)"
3999# function pointer declarations like "(*foo)(int) = bar;"
4000# structure definitions like "(struct foo) { 0 };"
4001# multiline macros that define functions
4002# known attributes or the __attribute__ keyword
4003 if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&
4004 (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {
4005 if (CHK("SPACING",
4006 "No space is necessary after a cast\n" . $herecurr) &&
4007 $fix) {
4008 $fixed[$fixlinenr] =~
4009 s/(\(\s*$Type\s*\))[ \t]+/$1/;
4010 }
4011 }
4012
4013# Block comments use * on subsequent lines
4014 if ($prevline =~ /$;[ \t]*$/ && #ends in comment
4015 $prevrawline =~ /^\+.*?\/\*/ && #starting /*
4016 $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */
4017 $rawline =~ /^\+/ && #line is new
4018 $rawline !~ /^\+[ \t]*\*/) { #no leading *
4019 WARN("BLOCK_COMMENT_STYLE",
4020 "Block comments use * on subsequent lines\n" . $hereprev);
4021 }
4022
4023# Block comments use */ on trailing lines
4024 if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */
4025 $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/
4026 $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/
4027 $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */
4028 WARN("BLOCK_COMMENT_STYLE",
4029 "Block comments use a trailing */ on a separate line\n" . $herecurr);
4030 }
4031
4032# Block comment * alignment
4033 if ($prevline =~ /$;[ \t]*$/ && #ends in comment
4034 $line =~ /^\+[ \t]*$;/ && #leading comment
4035 $rawline =~ /^\+[ \t]*\*/ && #leading *
4036 (($prevrawline =~ /^\+.*?\/\*/ && #leading /*
4037 $prevrawline !~ /\*\/[ \t]*$/) || #no trailing */
4038 $prevrawline =~ /^\+[ \t]*\*/)) { #leading *
4039 my $oldindent;
4040 $prevrawline =~ m@^\+([ \t]*/?)\*@;
4041 if (defined($1)) {
4042 $oldindent = expand_tabs($1);
4043 } else {
4044 $prevrawline =~ m@^\+(.*/?)\*@;
4045 $oldindent = expand_tabs($1);
4046 }
4047 $rawline =~ m@^\+([ \t]*)\*@;
4048 my $newindent = $1;
4049 $newindent = expand_tabs($newindent);
4050 if (length($oldindent) ne length($newindent)) {
4051 WARN("BLOCK_COMMENT_STYLE",
4052 "Block comments should align the * on each line\n" . $hereprev);
4053 }
4054 }
4055
4056# check for missing blank lines after struct/union declarations
4057# with exceptions for various attributes and macros
4058 if ($prevline =~ /^[\+ ]};?\s*$/ &&
4059 $line =~ /^\+/ &&
4060 !($line =~ /^\+\s*$/ ||
4061 $line =~ /^\+\s*(?:EXPORT_SYMBOL|early_param|ALLOW_ERROR_INJECTION)/ ||
4062 $line =~ /^\+\s*MODULE_/i ||
4063 $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
4064 $line =~ /^\+[a-z_]*init/ ||
4065 $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
4066 $line =~ /^\+\s*DECLARE/ ||
4067 $line =~ /^\+\s*builtin_[\w_]*driver/ ||
4068 $line =~ /^\+\s*__setup/)) {
4069 if (CHK("LINE_SPACING",
4070 "Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&
4071 $fix) {
4072 fix_insert_line($fixlinenr, "\+");
4073 }
4074 }
4075
4076# check for multiple consecutive blank lines
4077 if ($prevline =~ /^[\+ ]\s*$/ &&
4078 $line =~ /^\+\s*$/ &&
4079 $last_blank_line != ($linenr - 1)) {
4080 if (CHK("LINE_SPACING",
4081 "Please don't use multiple blank lines\n" . $hereprev) &&
4082 $fix) {
4083 fix_delete_line($fixlinenr, $rawline);
4084 }
4085
4086 $last_blank_line = $linenr;
4087 }
4088
4089# check for missing blank lines after declarations
4090# (declarations must have the same indentation and not be at the start of line)
4091 if (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/) {
4092 # use temporaries
4093 my $sl = $sline;
4094 my $pl = $prevline;
4095 # remove $Attribute/$Sparse uses to simplify comparisons
4096 $sl =~ s/\b(?:$Attribute|$Sparse)\b//g;
4097 $pl =~ s/\b(?:$Attribute|$Sparse)\b//g;
4098 if (($pl =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
4099 # function pointer declarations
4100 $pl =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
4101 # foo bar; where foo is some local typedef or #define
4102 $pl =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
4103 # known declaration macros
4104 $pl =~ /^\+\s+$declaration_macros/) &&
4105 # for "else if" which can look like "$Ident $Ident"
4106 !($pl =~ /^\+\s+$c90_Keywords\b/ ||
4107 # other possible extensions of declaration lines
4108 $pl =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
4109 # not starting a section or a macro "\" extended line
4110 $pl =~ /(?:\{\s*|\\)$/) &&
4111 # looks like a declaration
4112 !($sl =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
4113 # function pointer declarations
4114 $sl =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
4115 # foo bar; where foo is some local typedef or #define
4116 $sl =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
4117 # known declaration macros
4118 $sl =~ /^\+\s+$declaration_macros/ ||
4119 # start of struct or union or enum
4120 $sl =~ /^\+\s+(?:static\s+)?(?:const\s+)?(?:union|struct|enum|typedef)\b/ ||
4121 # start or end of block or continuation of declaration
4122 $sl =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
4123 # bitfield continuation
4124 $sl =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
4125 # other possible extensions of declaration lines
4126 $sl =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/)) {
4127 if (WARN("LINE_SPACING",
4128 "Missing a blank line after declarations\n" . $hereprev) &&
4129 $fix) {
4130 fix_insert_line($fixlinenr, "\+");
4131 }
4132 }
4133 }
4134
4135# check for spaces at the beginning of a line.
4136# Exceptions:
4137# 1) within comments
4138# 2) indented preprocessor commands
4139# 3) hanging labels
4140 if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) {
4141 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
4142 if (WARN("LEADING_SPACE",
4143 "please, no spaces at the start of a line\n" . $herevet) &&
4144 $fix) {
4145 $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
4146 }
4147 }
4148
4149# check we are in a valid C source file if not then ignore this hunk
4150 next if ($realfile !~ /\.(h|c)$/);
4151
4152# check for unusual line ending [ or (
4153 if ($line =~ /^\+.*([\[\(])\s*$/) {
4154 CHK("OPEN_ENDED_LINE",
4155 "Lines should not end with a '$1'\n" . $herecurr);
4156 }
4157
4158# check if this appears to be the start function declaration, save the name
4159 if ($sline =~ /^\+\{\s*$/ &&
4160 $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) {
4161 $context_function = $1;
4162 }
4163
4164# check if this appears to be the end of function declaration
4165 if ($sline =~ /^\+\}\s*$/) {
4166 undef $context_function;
4167 }
4168
4169# check indentation of any line with a bare else
4170# (but not if it is a multiple line "if (foo) return bar; else return baz;")
4171# if the previous line is a break or return and is indented 1 tab more...
4172 if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
4173 my $tabs = length($1) + 1;
4174 if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ ||
4175 ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ &&
4176 defined $lines[$linenr] &&
4177 $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) {
4178 WARN("UNNECESSARY_ELSE",
4179 "else is not generally useful after a break or return\n" . $hereprev);
4180 }
4181 }
4182
4183# check indentation of a line with a break;
4184# if the previous line is a goto, return or break
4185# and is indented the same # of tabs
4186 if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
4187 my $tabs = $1;
4188 if ($prevline =~ /^\+$tabs(goto|return|break)\b/) {
4189 if (WARN("UNNECESSARY_BREAK",
4190 "break is not useful after a $1\n" . $hereprev) &&
4191 $fix) {
4192 fix_delete_line($fixlinenr, $rawline);
4193 }
4194 }
4195 }
4196
4197# check for RCS/CVS revision markers
4198 if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
4199 WARN("CVS_KEYWORD",
4200 "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
4201 }
4202
4203# check for old HOTPLUG __dev<foo> section markings
4204 if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
4205 WARN("HOTPLUG_SECTION",
4206 "Using $1 is unnecessary\n" . $herecurr);
4207 }
4208
4209# Check for potential 'bare' types
4210 my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
4211 $realline_next);
4212#print "LINE<$line>\n";
4213 if ($linenr > $suppress_statement &&
4214 $realcnt && $sline =~ /.\s*\S/) {
4215 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
4216 ctx_statement_block($linenr, $realcnt, 0);
4217 $stat =~ s/\n./\n /g;
4218 $cond =~ s/\n./\n /g;
4219
4220#print "linenr<$linenr> <$stat>\n";
4221 # If this statement has no statement boundaries within
4222 # it there is no point in retrying a statement scan
4223 # until we hit end of it.
4224 my $frag = $stat; $frag =~ s/;+\s*$//;
4225 if ($frag !~ /(?:{|;)/) {
4226#print "skip<$line_nr_next>\n";
4227 $suppress_statement = $line_nr_next;
4228 }
4229
4230 # Find the real next line.
4231 $realline_next = $line_nr_next;
4232 if (defined $realline_next &&
4233 (!defined $lines[$realline_next - 1] ||
4234 substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
4235 $realline_next++;
4236 }
4237
4238 my $s = $stat;
4239 $s =~ s/{.*$//s;
4240
4241 # Ignore goto labels.
4242 if ($s =~ /$Ident:\*$/s) {
4243
4244 # Ignore functions being called
4245 } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
4246
4247 } elsif ($s =~ /^.\s*else\b/s) {
4248
4249 # declarations always start with types
4250 } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) {
4251 my $type = $1;
4252 $type =~ s/\s+/ /g;
4253 possible($type, "A:" . $s);
4254
4255 # definitions in global scope can only start with types
4256 } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
4257 possible($1, "B:" . $s);
4258 }
4259
4260 # any (foo ... *) is a pointer cast, and foo is a type
4261 while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
4262 possible($1, "C:" . $s);
4263 }
4264
4265 # Check for any sort of function declaration.
4266 # int foo(something bar, other baz);
4267 # void (*store_gdt)(x86_descr_ptr *);
4268 if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
4269 my ($name_len) = length($1);
4270
4271 my $ctx = $s;
4272 substr($ctx, 0, $name_len + 1, '');
4273 $ctx =~ s/\)[^\)]*$//;
4274
4275 for my $arg (split(/\s*,\s*/, $ctx)) {
4276 if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
4277
4278 possible($1, "D:" . $s);
4279 }
4280 }
4281 }
4282
4283 }
4284
4285#
4286# Checks which may be anchored in the context.
4287#
4288
4289# Check for switch () and associated case and default
4290# statements should be at the same indent.
4291 if ($line=~/\bswitch\s*\(.*\)/) {
4292 my $err = '';
4293 my $sep = '';
4294 my @ctx = ctx_block_outer($linenr, $realcnt);
4295 shift(@ctx);
4296 for my $ctx (@ctx) {
4297 my ($clen, $cindent) = line_stats($ctx);
4298 if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
4299 $indent != $cindent) {
4300 $err .= "$sep$ctx\n";
4301 $sep = '';
4302 } else {
4303 $sep = "[...]\n";
4304 }
4305 }
4306 if ($err ne '') {
4307 ERROR("SWITCH_CASE_INDENT_LEVEL",
4308 "switch and case should be at the same indent\n$hereline$err");
4309 }
4310 }
4311
4312# if/while/etc brace do not go on next line, unless defining a do while loop,
4313# or if that brace on the next line is for something else
4314 if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
4315 my $pre_ctx = "$1$2";
4316
4317 my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
4318
4319 if ($line =~ /^\+\t{6,}/) {
4320 WARN("DEEP_INDENTATION",
4321 "Too many leading tabs - consider code refactoring\n" . $herecurr);
4322 }
4323
4324 my $ctx_cnt = $realcnt - $#ctx - 1;
4325 my $ctx = join("\n", @ctx);
4326
4327 my $ctx_ln = $linenr;
4328 my $ctx_skip = $realcnt;
4329
4330 while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
4331 defined $lines[$ctx_ln - 1] &&
4332 $lines[$ctx_ln - 1] =~ /^-/)) {
4333 ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
4334 $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
4335 $ctx_ln++;
4336 }
4337
4338 #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
4339 #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
4340
4341 if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
4342 ERROR("OPEN_BRACE",
4343 "that open brace { should be on the previous line\n" .
4344 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
4345 }
4346 if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
4347 $ctx =~ /\)\s*\;\s*$/ &&
4348 defined $lines[$ctx_ln - 1])
4349 {
4350 my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
4351 if ($nindent > $indent) {
4352 WARN("TRAILING_SEMICOLON",
4353 "trailing semicolon indicates no statements, indent implies otherwise\n" .
4354 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
4355 }
4356 }
4357 }
4358
4359# Check relative indent for conditionals and blocks.
4360 if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
4361 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
4362 ctx_statement_block($linenr, $realcnt, 0)
4363 if (!defined $stat);
4364 my ($s, $c) = ($stat, $cond);
4365
4366 substr($s, 0, length($c), '');
4367
4368 # remove inline comments
4369 $s =~ s/$;/ /g;
4370 $c =~ s/$;/ /g;
4371
4372 # Find out how long the conditional actually is.
4373 my @newlines = ($c =~ /\n/gs);
4374 my $cond_lines = 1 + $#newlines;
4375
4376 # Make sure we remove the line prefixes as we have
4377 # none on the first line, and are going to readd them
4378 # where necessary.
4379 $s =~ s/\n./\n/gs;
4380 while ($s =~ /\n\s+\\\n/) {
4381 $cond_lines += $s =~ s/\n\s+\\\n/\n/g;
4382 }
4383
4384 # We want to check the first line inside the block
4385 # starting at the end of the conditional, so remove:
4386 # 1) any blank line termination
4387 # 2) any opening brace { on end of the line
4388 # 3) any do (...) {
4389 my $continuation = 0;
4390 my $check = 0;
4391 $s =~ s/^.*\bdo\b//;
4392 $s =~ s/^\s*{//;
4393 if ($s =~ s/^\s*\\//) {
4394 $continuation = 1;
4395 }
4396 if ($s =~ s/^\s*?\n//) {
4397 $check = 1;
4398 $cond_lines++;
4399 }
4400
4401 # Also ignore a loop construct at the end of a
4402 # preprocessor statement.
4403 if (($prevline =~ /^.\s*#\s*define\s/ ||
4404 $prevline =~ /\\\s*$/) && $continuation == 0) {
4405 $check = 0;
4406 }
4407
4408 my $cond_ptr = -1;
4409 $continuation = 0;
4410 while ($cond_ptr != $cond_lines) {
4411 $cond_ptr = $cond_lines;
4412
4413 # If we see an #else/#elif then the code
4414 # is not linear.
4415 if ($s =~ /^\s*\#\s*(?:else|elif)/) {
4416 $check = 0;
4417 }
4418
4419 # Ignore:
4420 # 1) blank lines, they should be at 0,
4421 # 2) preprocessor lines, and
4422 # 3) labels.
4423 if ($continuation ||
4424 $s =~ /^\s*?\n/ ||
4425 $s =~ /^\s*#\s*?/ ||
4426 $s =~ /^\s*$Ident\s*:/) {
4427 $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
4428 if ($s =~ s/^.*?\n//) {
4429 $cond_lines++;
4430 }
4431 }
4432 }
4433
4434 my (undef, $sindent) = line_stats("+" . $s);
4435 my $stat_real = raw_line($linenr, $cond_lines);
4436
4437 # Check if either of these lines are modified, else
4438 # this is not this patch's fault.
4439 if (!defined($stat_real) ||
4440 $stat !~ /^\+/ && $stat_real !~ /^\+/) {
4441 $check = 0;
4442 }
4443 if (defined($stat_real) && $cond_lines > 1) {
4444 $stat_real = "[...]\n$stat_real";
4445 }
4446
4447 #print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n";
4448
4449 if ($check && $s ne '' &&
4450 (($sindent % $tabsize) != 0 ||
4451 ($sindent < $indent) ||
4452 ($sindent == $indent &&
4453 ($s !~ /^\s*(?:\}|\{|else\b)/)) ||
4454 ($sindent > $indent + $tabsize))) {
4455 WARN("SUSPECT_CODE_INDENT",
4456 "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
4457 }
4458 }
4459
4460 # Track the 'values' across context and added lines.
4461 my $opline = $line; $opline =~ s/^./ /;
4462 my ($curr_values, $curr_vars) =
4463 annotate_values($opline . "\n", $prev_values);
4464 $curr_values = $prev_values . $curr_values;
4465 if ($dbg_values) {
4466 my $outline = $opline; $outline =~ s/\t/ /g;
4467 print "$linenr > .$outline\n";
4468 print "$linenr > $curr_values\n";
4469 print "$linenr > $curr_vars\n";
4470 }
4471 $prev_values = substr($curr_values, -1);
4472
4473#ignore lines not being added
4474 next if ($line =~ /^[^\+]/);
4475
4476# check for self assignments used to avoid compiler warnings
4477# e.g.: int foo = foo, *bar = NULL;
4478# struct foo bar = *(&(bar));
4479 if ($line =~ /^\+\s*(?:$Declare)?([A-Za-z_][A-Za-z\d_]*)\s*=/) {
4480 my $var = $1;
4481 if ($line =~ /^\+\s*(?:$Declare)?$var\s*=\s*(?:$var|\*\s*\(?\s*&\s*\(?\s*$var\s*\)?\s*\)?)\s*[;,]/) {
4482 WARN("SELF_ASSIGNMENT",
4483 "Do not use self-assignments to avoid compiler warnings\n" . $herecurr);
4484 }
4485 }
4486
4487# check for dereferences that span multiple lines
4488 if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ &&
4489 $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) {
4490 $prevline =~ /($Lval\s*(?:\.|->))\s*$/;
4491 my $ref = $1;
4492 $line =~ /^.\s*($Lval)/;
4493 $ref .= $1;
4494 $ref =~ s/\s//g;
4495 WARN("MULTILINE_DEREFERENCE",
4496 "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev);
4497 }
4498
4499# check for declarations of signed or unsigned without int
4500 while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
4501 my $type = $1;
4502 my $var = $2;
4503 $var = "" if (!defined $var);
4504 if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
4505 my $sign = $1;
4506 my $pointer = $2;
4507
4508 $pointer = "" if (!defined $pointer);
4509
4510 if (WARN("UNSPECIFIED_INT",
4511 "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) &&
4512 $fix) {
4513 my $decl = trim($sign) . " int ";
4514 my $comp_pointer = $pointer;
4515 $comp_pointer =~ s/\s//g;
4516 $decl .= $comp_pointer;
4517 $decl = rtrim($decl) if ($var eq "");
4518 $fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;
4519 }
4520 }
4521 }
4522
4523# TEST: allow direct testing of the type matcher.
4524 if ($dbg_type) {
4525 if ($line =~ /^.\s*$Declare\s*$/) {
4526 ERROR("TEST_TYPE",
4527 "TEST: is type\n" . $herecurr);
4528 } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
4529 ERROR("TEST_NOT_TYPE",
4530 "TEST: is not type ($1 is)\n". $herecurr);
4531 }
4532 next;
4533 }
4534# TEST: allow direct testing of the attribute matcher.
4535 if ($dbg_attr) {
4536 if ($line =~ /^.\s*$Modifier\s*$/) {
4537 ERROR("TEST_ATTR",
4538 "TEST: is attr\n" . $herecurr);
4539 } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
4540 ERROR("TEST_NOT_ATTR",
4541 "TEST: is not attr ($1 is)\n". $herecurr);
4542 }
4543 next;
4544 }
4545
4546# check for initialisation to aggregates open brace on the next line
4547 if ($line =~ /^.\s*{/ &&
4548 $prevline =~ /(?:^|[^=])=\s*$/) {
4549 if (ERROR("OPEN_BRACE",
4550 "that open brace { should be on the previous line\n" . $hereprev) &&
4551 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
4552 fix_delete_line($fixlinenr - 1, $prevrawline);
4553 fix_delete_line($fixlinenr, $rawline);
4554 my $fixedline = $prevrawline;
4555 $fixedline =~ s/\s*=\s*$/ = {/;
4556 fix_insert_line($fixlinenr, $fixedline);
4557 $fixedline = $line;
4558 $fixedline =~ s/^(.\s*)\{\s*/$1/;
4559 fix_insert_line($fixlinenr, $fixedline);
4560 }
4561 }
4562
4563#
4564# Checks which are anchored on the added line.
4565#
4566
4567# check for malformed paths in #include statements (uses RAW line)
4568 if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
4569 my $path = $1;
4570 if ($path =~ m{//}) {
4571 ERROR("MALFORMED_INCLUDE",
4572 "malformed #include filename\n" . $herecurr);
4573 }
4574 if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
4575 ERROR("UAPI_INCLUDE",
4576 "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
4577 }
4578 }
4579
4580# no C99 // comments
4581 if ($line =~ m{//}) {
4582 if (ERROR("C99_COMMENTS",
4583 "do not use C99 // comments\n" . $herecurr) &&
4584 $fix) {
4585 my $line = $fixed[$fixlinenr];
4586 if ($line =~ /\/\/(.*)$/) {
4587 my $comment = trim($1);
4588 $fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
4589 }
4590 }
4591 }
4592 # Remove C99 comments.
4593 $line =~ s@//.*@@;
4594 $opline =~ s@//.*@@;
4595
4596# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
4597# the whole statement.
4598#print "APW <$lines[$realline_next - 1]>\n";
4599 if (defined $realline_next &&
4600 exists $lines[$realline_next - 1] &&
4601 !defined $suppress_export{$realline_next} &&
4602 ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/)) {
4603 # Handle definitions which produce identifiers with
4604 # a prefix:
4605 # XXX(foo);
4606 # EXPORT_SYMBOL(something_foo);
4607 my $name = $1;
4608 $name =~ s/^\s*($Ident).*/$1/;
4609 if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
4610 $name =~ /^${Ident}_$2/) {
4611#print "FOO C name<$name>\n";
4612 $suppress_export{$realline_next} = 1;
4613
4614 } elsif ($stat !~ /(?:
4615 \n.}\s*$|
4616 ^.DEFINE_$Ident\(\Q$name\E\)|
4617 ^.DECLARE_$Ident\(\Q$name\E\)|
4618 ^.LIST_HEAD\(\Q$name\E\)|
4619 ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
4620 \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
4621 )/x) {
4622#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
4623 $suppress_export{$realline_next} = 2;
4624 } else {
4625 $suppress_export{$realline_next} = 1;
4626 }
4627 }
4628 if (!defined $suppress_export{$linenr} &&
4629 $prevline =~ /^.\s*$/ &&
4630 ($line =~ /EXPORT_SYMBOL.*\((.*)\)/)) {
4631#print "FOO B <$lines[$linenr - 1]>\n";
4632 $suppress_export{$linenr} = 2;
4633 }
4634 if (defined $suppress_export{$linenr} &&
4635 $suppress_export{$linenr} == 2) {
4636 WARN("EXPORT_SYMBOL",
4637 "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
4638 }
4639
4640# check for global initialisers.
4641 if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/ &&
4642 !exclude_global_initialisers($realfile)) {
4643 if (ERROR("GLOBAL_INITIALISERS",
4644 "do not initialise globals to $1\n" . $herecurr) &&
4645 $fix) {
4646 $fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
4647 }
4648 }
4649# check for static initialisers.
4650 if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
4651 if (ERROR("INITIALISED_STATIC",
4652 "do not initialise statics to $1\n" .
4653 $herecurr) &&
4654 $fix) {
4655 $fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
4656 }
4657 }
4658
4659# check for misordered declarations of char/short/int/long with signed/unsigned
4660 while ($sline =~ m{(\b$TypeMisordered\b)}g) {
4661 my $tmp = trim($1);
4662 WARN("MISORDERED_TYPE",
4663 "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr);
4664 }
4665
4666# check for unnecessary <signed> int declarations of short/long/long long
4667 while ($sline =~ m{\b($TypeMisordered(\s*\*)*|$C90_int_types)\b}g) {
4668 my $type = trim($1);
4669 next if ($type !~ /\bint\b/);
4670 next if ($type !~ /\b(?:short|long\s+long|long)\b/);
4671 my $new_type = $type;
4672 $new_type =~ s/\b\s*int\s*\b/ /;
4673 $new_type =~ s/\b\s*(?:un)?signed\b\s*/ /;
4674 $new_type =~ s/^const\s+//;
4675 $new_type = "unsigned $new_type" if ($type =~ /\bunsigned\b/);
4676 $new_type = "const $new_type" if ($type =~ /^const\b/);
4677 $new_type =~ s/\s+/ /g;
4678 $new_type = trim($new_type);
4679 if (WARN("UNNECESSARY_INT",
4680 "Prefer '$new_type' over '$type' as the int is unnecessary\n" . $herecurr) &&
4681 $fix) {
4682 $fixed[$fixlinenr] =~ s/\b\Q$type\E\b/$new_type/;
4683 }
4684 }
4685
4686# check for static const char * arrays.
4687 if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
4688 WARN("STATIC_CONST_CHAR_ARRAY",
4689 "static const char * array should probably be static const char * const\n" .
4690 $herecurr);
4691 }
4692
4693# check for initialized const char arrays that should be static const
4694 if ($line =~ /^\+\s*const\s+(char|unsigned\s+char|_*u8|(?:[us]_)?int8_t)\s+\w+\s*\[\s*(?:\w+\s*)?\]\s*=\s*"/) {
4695 if (WARN("STATIC_CONST_CHAR_ARRAY",
4696 "const array should probably be static const\n" . $herecurr) &&
4697 $fix) {
4698 $fixed[$fixlinenr] =~ s/(^.\s*)const\b/${1}static const/;
4699 }
4700 }
4701
4702# check for static char foo[] = "bar" declarations.
4703 if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
4704 WARN("STATIC_CONST_CHAR_ARRAY",
4705 "static char array declaration should probably be static const char\n" .
4706 $herecurr);
4707 }
4708
4709# check for const <foo> const where <foo> is not a pointer or array type
4710 if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
4711 my $found = $1;
4712 if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {
4713 WARN("CONST_CONST",
4714 "'const $found const *' should probably be 'const $found * const'\n" . $herecurr);
4715 } elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {
4716 WARN("CONST_CONST",
4717 "'const $found const' should probably be 'const $found'\n" . $herecurr);
4718 }
4719 }
4720
4721# check for const static or static <non ptr type> const declarations
4722# prefer 'static const <foo>' over 'const static <foo>' and 'static <foo> const'
4723 if ($sline =~ /^\+\s*const\s+static\s+($Type)\b/ ||
4724 $sline =~ /^\+\s*static\s+($BasicType)\s+const\b/) {
4725 if (WARN("STATIC_CONST",
4726 "Move const after static - use 'static const $1'\n" . $herecurr) &&
4727 $fix) {
4728 $fixed[$fixlinenr] =~ s/\bconst\s+static\b/static const/;
4729 $fixed[$fixlinenr] =~ s/\bstatic\s+($BasicType)\s+const\b/static const $1/;
4730 }
4731 }
4732
4733# check for non-global char *foo[] = {"bar", ...} declarations.
4734 if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
4735 WARN("STATIC_CONST_CHAR_ARRAY",
4736 "char * array declaration might be better as static const\n" .
4737 $herecurr);
4738 }
4739
4740# check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo)
4741 if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {
4742 my $array = $1;
4743 if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {
4744 my $array_div = $1;
4745 if (WARN("ARRAY_SIZE",
4746 "Prefer ARRAY_SIZE($array)\n" . $herecurr) &&
4747 $fix) {
4748 $fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;
4749 }
4750 }
4751 }
4752
4753# check for function declarations without arguments like "int foo()"
4754 if ($line =~ /(\b$Type\s*$Ident)\s*\(\s*\)/) {
4755 if (ERROR("FUNCTION_WITHOUT_ARGS",
4756 "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
4757 $fix) {
4758 $fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
4759 }
4760 }
4761
4762# check for new typedefs, only function parameters and sparse annotations
4763# make sense.
4764 if ($line =~ /\btypedef\s/ &&
4765 $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
4766 $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
4767 $line !~ /\b$typeTypedefs\b/ &&
4768 $line !~ /\b__bitwise\b/) {
4769 WARN("NEW_TYPEDEFS",
4770 "do not add new typedefs\n" . $herecurr);
4771 }
4772
4773# * goes on variable not on type
4774 # (char*[ const])
4775 while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
4776 #print "AA<$1>\n";
4777 my ($ident, $from, $to) = ($1, $2, $2);
4778
4779 # Should start with a space.
4780 $to =~ s/^(\S)/ $1/;
4781 # Should not end with a space.
4782 $to =~ s/\s+$//;
4783 # '*'s should not have spaces between.
4784 while ($to =~ s/\*\s+\*/\*\*/) {
4785 }
4786
4787## print "1: from<$from> to<$to> ident<$ident>\n";
4788 if ($from ne $to) {
4789 if (ERROR("POINTER_LOCATION",
4790 "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) &&
4791 $fix) {
4792 my $sub_from = $ident;
4793 my $sub_to = $ident;
4794 $sub_to =~ s/\Q$from\E/$to/;
4795 $fixed[$fixlinenr] =~
4796 s@\Q$sub_from\E@$sub_to@;
4797 }
4798 }
4799 }
4800 while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
4801 #print "BB<$1>\n";
4802 my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
4803
4804 # Should start with a space.
4805 $to =~ s/^(\S)/ $1/;
4806 # Should not end with a space.
4807 $to =~ s/\s+$//;
4808 # '*'s should not have spaces between.
4809 while ($to =~ s/\*\s+\*/\*\*/) {
4810 }
4811 # Modifiers should have spaces.
4812 $to =~ s/(\b$Modifier$)/$1 /;
4813
4814## print "2: from<$from> to<$to> ident<$ident>\n";
4815 if ($from ne $to && $ident !~ /^$Modifier$/) {
4816 if (ERROR("POINTER_LOCATION",
4817 "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) &&
4818 $fix) {
4819
4820 my $sub_from = $match;
4821 my $sub_to = $match;
4822 $sub_to =~ s/\Q$from\E/$to/;
4823 $fixed[$fixlinenr] =~
4824 s@\Q$sub_from\E@$sub_to@;
4825 }
4826 }
4827 }
4828
4829# do not use BUG() or variants
4830 if ($line =~ /\b(?!AA_|BUILD_|DCCP_|IDA_|KVM_|RWLOCK_|snd_|SPIN_)(?:[a-zA-Z_]*_)?BUG(?:_ON)?(?:_[A-Z_]+)?\s*\(/) {
4831 my $msg_level = \&WARN;
4832 $msg_level = \&CHK if ($file);
4833 &{$msg_level}("AVOID_BUG",
4834 "Do not crash the kernel unless it is absolutely unavoidable--use WARN_ON_ONCE() plus recovery code (if feasible) instead of BUG() or variants\n" . $herecurr);
4835 }
4836
4837# avoid LINUX_VERSION_CODE
4838 if ($line =~ /\bLINUX_VERSION_CODE\b/) {
4839 WARN("LINUX_VERSION_CODE",
4840 "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
4841 }
4842
4843# check for uses of printk_ratelimit
4844 if ($line =~ /\bprintk_ratelimit\s*\(/) {
4845 WARN("PRINTK_RATELIMITED",
4846 "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
4847 }
4848
4849# printk should use KERN_* levels
4850 if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) {
4851 WARN("PRINTK_WITHOUT_KERN_LEVEL",
4852 "printk() should include KERN_<LEVEL> facility level\n" . $herecurr);
4853 }
4854
4855# prefer variants of (subsystem|netdev|dev|pr)_<level> to printk(KERN_<LEVEL>
4856 if ($line =~ /\b(printk(_once|_ratelimited)?)\s*\(\s*KERN_([A-Z]+)/) {
4857 my $printk = $1;
4858 my $modifier = $2;
4859 my $orig = $3;
4860 $modifier = "" if (!defined($modifier));
4861 my $level = lc($orig);
4862 $level = "warn" if ($level eq "warning");
4863 my $level2 = $level;
4864 $level2 = "dbg" if ($level eq "debug");
4865 $level .= $modifier;
4866 $level2 .= $modifier;
4867 WARN("PREFER_PR_LEVEL",
4868 "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to $printk(KERN_$orig ...\n" . $herecurr);
4869 }
4870
4871# prefer dev_<level> to dev_printk(KERN_<LEVEL>
4872 if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
4873 my $orig = $1;
4874 my $level = lc($orig);
4875 $level = "warn" if ($level eq "warning");
4876 $level = "dbg" if ($level eq "debug");
4877 WARN("PREFER_DEV_LEVEL",
4878 "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
4879 }
4880
4881# trace_printk should not be used in production code.
4882 if ($line =~ /\b(trace_printk|trace_puts|ftrace_vprintk)\s*\(/) {
4883 WARN("TRACE_PRINTK",
4884 "Do not use $1() in production code (this can be ignored if built only with a debug config option)\n" . $herecurr);
4885 }
4886
4887# ENOSYS means "bad syscall nr" and nothing else. This will have a small
4888# number of false positives, but assembly files are not checked, so at
4889# least the arch entry code will not trigger this warning.
4890 if ($line =~ /\bENOSYS\b/) {
4891 WARN("ENOSYS",
4892 "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr);
4893 }
4894
4895# ENOTSUPP is not a standard error code and should be avoided in new patches.
4896# Folks usually mean EOPNOTSUPP (also called ENOTSUP), when they type ENOTSUPP.
4897# Similarly to ENOSYS warning a small number of false positives is expected.
4898 if (!$file && $line =~ /\bENOTSUPP\b/) {
4899 if (WARN("ENOTSUPP",
4900 "ENOTSUPP is not a SUSV4 error code, prefer EOPNOTSUPP\n" . $herecurr) &&
4901 $fix) {
4902 $fixed[$fixlinenr] =~ s/\bENOTSUPP\b/EOPNOTSUPP/;
4903 }
4904 }
4905
4906# function brace can't be on same line, except for #defines of do while,
4907# or if closed on same line
4908 if ($perl_version_ok &&
4909 $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&
4910 $sline !~ /\#\s*define\b.*do\s*\{/ &&
4911 $sline !~ /}/) {
4912 if (ERROR("OPEN_BRACE",
4913 "open brace '{' following function definitions go on the next line\n" . $herecurr) &&
4914 $fix) {
4915 fix_delete_line($fixlinenr, $rawline);
4916 my $fixed_line = $rawline;
4917 $fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*)\{(.*)$/;
4918 my $line1 = $1;
4919 my $line2 = $2;
4920 fix_insert_line($fixlinenr, ltrim($line1));
4921 fix_insert_line($fixlinenr, "\+{");
4922 if ($line2 !~ /^\s*$/) {
4923 fix_insert_line($fixlinenr, "\+\t" . trim($line2));
4924 }
4925 }
4926 }
4927
4928# open braces for enum, union and struct go on the same line.
4929 if ($line =~ /^.\s*{/ &&
4930 $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
4931 if (ERROR("OPEN_BRACE",
4932 "open brace '{' following $1 go on the same line\n" . $hereprev) &&
4933 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
4934 fix_delete_line($fixlinenr - 1, $prevrawline);
4935 fix_delete_line($fixlinenr, $rawline);
4936 my $fixedline = rtrim($prevrawline) . " {";
4937 fix_insert_line($fixlinenr, $fixedline);
4938 $fixedline = $rawline;
4939 $fixedline =~ s/^(.\s*)\{\s*/$1\t/;
4940 if ($fixedline !~ /^\+\s*$/) {
4941 fix_insert_line($fixlinenr, $fixedline);
4942 }
4943 }
4944 }
4945
4946# missing space after union, struct or enum definition
4947 if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
4948 if (WARN("SPACING",
4949 "missing space after $1 definition\n" . $herecurr) &&
4950 $fix) {
4951 $fixed[$fixlinenr] =~
4952 s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
4953 }
4954 }
4955
4956# Function pointer declarations
4957# check spacing between type, funcptr, and args
4958# canonical declaration is "type (*funcptr)(args...)"
4959 if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
4960 my $declare = $1;
4961 my $pre_pointer_space = $2;
4962 my $post_pointer_space = $3;
4963 my $funcname = $4;
4964 my $post_funcname_space = $5;
4965 my $pre_args_space = $6;
4966
4967# the $Declare variable will capture all spaces after the type
4968# so check it for a missing trailing missing space but pointer return types
4969# don't need a space so don't warn for those.
4970 my $post_declare_space = "";
4971 if ($declare =~ /(\s+)$/) {
4972 $post_declare_space = $1;
4973 $declare = rtrim($declare);
4974 }
4975 if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
4976 WARN("SPACING",
4977 "missing space after return type\n" . $herecurr);
4978 $post_declare_space = " ";
4979 }
4980
4981# unnecessary space "type (*funcptr)(args...)"
4982# This test is not currently implemented because these declarations are
4983# equivalent to
4984# int foo(int bar, ...)
4985# and this is form shouldn't/doesn't generate a checkpatch warning.
4986#
4987# elsif ($declare =~ /\s{2,}$/) {
4988# WARN("SPACING",
4989# "Multiple spaces after return type\n" . $herecurr);
4990# }
4991
4992# unnecessary space "type ( *funcptr)(args...)"
4993 if (defined $pre_pointer_space &&
4994 $pre_pointer_space =~ /^\s/) {
4995 WARN("SPACING",
4996 "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
4997 }
4998
4999# unnecessary space "type (* funcptr)(args...)"
5000 if (defined $post_pointer_space &&
5001 $post_pointer_space =~ /^\s/) {
5002 WARN("SPACING",
5003 "Unnecessary space before function pointer name\n" . $herecurr);
5004 }
5005
5006# unnecessary space "type (*funcptr )(args...)"
5007 if (defined $post_funcname_space &&
5008 $post_funcname_space =~ /^\s/) {
5009 WARN("SPACING",
5010 "Unnecessary space after function pointer name\n" . $herecurr);
5011 }
5012
5013# unnecessary space "type (*funcptr) (args...)"
5014 if (defined $pre_args_space &&
5015 $pre_args_space =~ /^\s/) {
5016 WARN("SPACING",
5017 "Unnecessary space before function pointer arguments\n" . $herecurr);
5018 }
5019
5020 if (show_type("SPACING") && $fix) {
5021 $fixed[$fixlinenr] =~
5022 s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
5023 }
5024 }
5025
5026# check for spacing round square brackets; allowed:
5027# 1. with a type on the left -- int [] a;
5028# 2. at the beginning of a line for slice initialisers -- [0...10] = 5,
5029# 3. inside a curly brace -- = { [0...10] = 5 }
5030 while ($line =~ /(.*?\s)\[/g) {
5031 my ($where, $prefix) = ($-[1], $1);
5032 if ($prefix !~ /$Type\s+$/ &&
5033 ($where != 0 || $prefix !~ /^.\s+$/) &&
5034 $prefix !~ /[{,:]\s+$/) {
5035 if (ERROR("BRACKET_SPACE",
5036 "space prohibited before open square bracket '['\n" . $herecurr) &&
5037 $fix) {
5038 $fixed[$fixlinenr] =~
5039 s/^(\+.*?)\s+\[/$1\[/;
5040 }
5041 }
5042 }
5043
5044# check for spaces between functions and their parentheses.
5045 while ($line =~ /($Ident)\s+\(/g) {
5046 my $name = $1;
5047 my $ctx_before = substr($line, 0, $-[1]);
5048 my $ctx = "$ctx_before$name";
5049
5050 # Ignore those directives where spaces _are_ permitted.
5051 if ($name =~ /^(?:
5052 if|for|while|switch|return|case|
5053 volatile|__volatile__|
5054 __attribute__|format|__extension__|
5055 asm|__asm__|scoped_guard)$/x)
5056 {
5057 # cpp #define statements have non-optional spaces, ie
5058 # if there is a space between the name and the open
5059 # parenthesis it is simply not a parameter group.
5060 } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
5061
5062 # cpp #elif statement condition may start with a (
5063 } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
5064
5065 # If this whole things ends with a type its most
5066 # likely a typedef for a function.
5067 } elsif ($ctx =~ /$Type$/) {
5068
5069 } else {
5070 if (WARN("SPACING",
5071 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
5072 $fix) {
5073 $fixed[$fixlinenr] =~
5074 s/\b$name\s+\(/$name\(/;
5075 }
5076 }
5077 }
5078
5079# Check operator spacing.
5080 if (!($line=~/\#\s*include/)) {
5081 my $fixed_line = "";
5082 my $line_fixed = 0;
5083
5084 my $ops = qr{
5085 <<=|>>=|<=|>=|==|!=|
5086 \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
5087 =>|->|<<|>>|<|>|=|!|~|
5088 &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
5089 \?:|\?|:
5090 }x;
5091 my @elements = split(/($ops|;)/, $opline);
5092
5093## print("element count: <" . $#elements . ">\n");
5094## foreach my $el (@elements) {
5095## print("el: <$el>\n");
5096## }
5097
5098 my @fix_elements = ();
5099 my $off = 0;
5100
5101 foreach my $el (@elements) {
5102 push(@fix_elements, substr($rawline, $off, length($el)));
5103 $off += length($el);
5104 }
5105
5106 $off = 0;
5107
5108 my $blank = copy_spacing($opline);
5109 my $last_after = -1;
5110
5111 for (my $n = 0; $n < $#elements; $n += 2) {
5112
5113 my $good = $fix_elements[$n] . $fix_elements[$n + 1];
5114
5115## print("n: <$n> good: <$good>\n");
5116
5117 $off += length($elements[$n]);
5118
5119 # Pick up the preceding and succeeding characters.
5120 my $ca = substr($opline, 0, $off);
5121 my $cc = '';
5122 if (length($opline) >= ($off + length($elements[$n + 1]))) {
5123 $cc = substr($opline, $off + length($elements[$n + 1]));
5124 }
5125 my $cb = "$ca$;$cc";
5126
5127 my $a = '';
5128 $a = 'V' if ($elements[$n] ne '');
5129 $a = 'W' if ($elements[$n] =~ /\s$/);
5130 $a = 'C' if ($elements[$n] =~ /$;$/);
5131 $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
5132 $a = 'O' if ($elements[$n] eq '');
5133 $a = 'E' if ($ca =~ /^\s*$/);
5134
5135 my $op = $elements[$n + 1];
5136
5137 my $c = '';
5138 if (defined $elements[$n + 2]) {
5139 $c = 'V' if ($elements[$n + 2] ne '');
5140 $c = 'W' if ($elements[$n + 2] =~ /^\s/);
5141 $c = 'C' if ($elements[$n + 2] =~ /^$;/);
5142 $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
5143 $c = 'O' if ($elements[$n + 2] eq '');
5144 $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
5145 } else {
5146 $c = 'E';
5147 }
5148
5149 my $ctx = "${a}x${c}";
5150
5151 my $at = "(ctx:$ctx)";
5152
5153 my $ptr = substr($blank, 0, $off) . "^";
5154 my $hereptr = "$hereline$ptr\n";
5155
5156 # Pull out the value of this operator.
5157 my $op_type = substr($curr_values, $off + 1, 1);
5158
5159 # Get the full operator variant.
5160 my $opv = $op . substr($curr_vars, $off, 1);
5161
5162 # Ignore operators passed as parameters.
5163 if ($op_type ne 'V' &&
5164 $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) {
5165
5166# # Ignore comments
5167# } elsif ($op =~ /^$;+$/) {
5168
5169 # ; should have either the end of line or a space or \ after it
5170 } elsif ($op eq ';') {
5171 if ($ctx !~ /.x[WEBC]/ &&
5172 $cc !~ /^\\/ && $cc !~ /^;/) {
5173 if (ERROR("SPACING",
5174 "space required after that '$op' $at\n" . $hereptr)) {
5175 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
5176 $line_fixed = 1;
5177 }
5178 }
5179
5180 # // is a comment
5181 } elsif ($op eq '//') {
5182
5183 # : when part of a bitfield
5184 } elsif ($opv eq ':B') {
5185 # skip the bitfield test for now
5186
5187 # No spaces for:
5188 # ->
5189 } elsif ($op eq '->') {
5190 if ($ctx =~ /Wx.|.xW/) {
5191 if (ERROR("SPACING",
5192 "spaces prohibited around that '$op' $at\n" . $hereptr)) {
5193 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
5194 if (defined $fix_elements[$n + 2]) {
5195 $fix_elements[$n + 2] =~ s/^\s+//;
5196 }
5197 $line_fixed = 1;
5198 }
5199 }
5200
5201 # , must not have a space before and must have a space on the right.
5202 } elsif ($op eq ',') {
5203 my $rtrim_before = 0;
5204 my $space_after = 0;
5205 if ($ctx =~ /Wx./) {
5206 if (ERROR("SPACING",
5207 "space prohibited before that '$op' $at\n" . $hereptr)) {
5208 $line_fixed = 1;
5209 $rtrim_before = 1;
5210 }
5211 }
5212 if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
5213 if (ERROR("SPACING",
5214 "space required after that '$op' $at\n" . $hereptr)) {
5215 $line_fixed = 1;
5216 $last_after = $n;
5217 $space_after = 1;
5218 }
5219 }
5220 if ($rtrim_before || $space_after) {
5221 if ($rtrim_before) {
5222 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
5223 } else {
5224 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
5225 }
5226 if ($space_after) {
5227 $good .= " ";
5228 }
5229 }
5230
5231 # '*' as part of a type definition -- reported already.
5232 } elsif ($opv eq '*_') {
5233 #warn "'*' is part of type\n";
5234
5235 # unary operators should have a space before and
5236 # none after. May be left adjacent to another
5237 # unary operator, or a cast
5238 } elsif ($op eq '!' || $op eq '~' ||
5239 $opv eq '*U' || $opv eq '-U' ||
5240 $opv eq '&U' || $opv eq '&&U') {
5241 if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
5242 if (ERROR("SPACING",
5243 "space required before that '$op' $at\n" . $hereptr)) {
5244 if ($n != $last_after + 2) {
5245 $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
5246 $line_fixed = 1;
5247 }
5248 }
5249 }
5250 if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
5251 # A unary '*' may be const
5252
5253 } elsif ($ctx =~ /.xW/) {
5254 if (ERROR("SPACING",
5255 "space prohibited after that '$op' $at\n" . $hereptr)) {
5256 $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
5257 if (defined $fix_elements[$n + 2]) {
5258 $fix_elements[$n + 2] =~ s/^\s+//;
5259 }
5260 $line_fixed = 1;
5261 }
5262 }
5263
5264 # unary ++ and unary -- are allowed no space on one side.
5265 } elsif ($op eq '++' or $op eq '--') {
5266 if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
5267 if (ERROR("SPACING",
5268 "space required one side of that '$op' $at\n" . $hereptr)) {
5269 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
5270 $line_fixed = 1;
5271 }
5272 }
5273 if ($ctx =~ /Wx[BE]/ ||
5274 ($ctx =~ /Wx./ && $cc =~ /^;/)) {
5275 if (ERROR("SPACING",
5276 "space prohibited before that '$op' $at\n" . $hereptr)) {
5277 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
5278 $line_fixed = 1;
5279 }
5280 }
5281 if ($ctx =~ /ExW/) {
5282 if (ERROR("SPACING",
5283 "space prohibited after that '$op' $at\n" . $hereptr)) {
5284 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
5285 if (defined $fix_elements[$n + 2]) {
5286 $fix_elements[$n + 2] =~ s/^\s+//;
5287 }
5288 $line_fixed = 1;
5289 }
5290 }
5291
5292 # << and >> may either have or not have spaces both sides
5293 } elsif ($op eq '<<' or $op eq '>>' or
5294 $op eq '&' or $op eq '^' or $op eq '|' or
5295 $op eq '+' or $op eq '-' or
5296 $op eq '*' or $op eq '/' or
5297 $op eq '%')
5298 {
5299 if ($check) {
5300 if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {
5301 if (CHK("SPACING",
5302 "spaces preferred around that '$op' $at\n" . $hereptr)) {
5303 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
5304 $fix_elements[$n + 2] =~ s/^\s+//;
5305 $line_fixed = 1;
5306 }
5307 } elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {
5308 if (CHK("SPACING",
5309 "space preferred before that '$op' $at\n" . $hereptr)) {
5310 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);
5311 $line_fixed = 1;
5312 }
5313 }
5314 } elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
5315 if (ERROR("SPACING",
5316 "need consistent spacing around '$op' $at\n" . $hereptr)) {
5317 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
5318 if (defined $fix_elements[$n + 2]) {
5319 $fix_elements[$n + 2] =~ s/^\s+//;
5320 }
5321 $line_fixed = 1;
5322 }
5323 }
5324
5325 # A colon needs no spaces before when it is
5326 # terminating a case value or a label.
5327 } elsif ($opv eq ':C' || $opv eq ':L') {
5328 if ($ctx =~ /Wx./ and $realfile !~ m@.*\.lds\.h$@) {
5329 if (ERROR("SPACING",
5330 "space prohibited before that '$op' $at\n" . $hereptr)) {
5331 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
5332 $line_fixed = 1;
5333 }
5334 }
5335
5336 # All the others need spaces both sides.
5337 } elsif ($ctx !~ /[EWC]x[CWE]/) {
5338 my $ok = 0;
5339
5340 # Ignore email addresses <foo@bar>
5341 if (($op eq '<' &&
5342 $cc =~ /^\S+\@\S+>/) ||
5343 ($op eq '>' &&
5344 $ca =~ /<\S+\@\S+$/))
5345 {
5346 $ok = 1;
5347 }
5348
5349 # for asm volatile statements
5350 # ignore a colon with another
5351 # colon immediately before or after
5352 if (($op eq ':') &&
5353 ($ca =~ /:$/ || $cc =~ /^:/)) {
5354 $ok = 1;
5355 }
5356
5357 # messages are ERROR, but ?: are CHK
5358 if ($ok == 0) {
5359 my $msg_level = \&ERROR;
5360 $msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
5361
5362 if (&{$msg_level}("SPACING",
5363 "spaces required around that '$op' $at\n" . $hereptr)) {
5364 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
5365 if (defined $fix_elements[$n + 2]) {
5366 $fix_elements[$n + 2] =~ s/^\s+//;
5367 }
5368 $line_fixed = 1;
5369 }
5370 }
5371 }
5372 $off += length($elements[$n + 1]);
5373
5374## print("n: <$n> GOOD: <$good>\n");
5375
5376 $fixed_line = $fixed_line . $good;
5377 }
5378
5379 if (($#elements % 2) == 0) {
5380 $fixed_line = $fixed_line . $fix_elements[$#elements];
5381 }
5382
5383 if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
5384 $fixed[$fixlinenr] = $fixed_line;
5385 }
5386
5387
5388 }
5389
5390# check for whitespace before a non-naked semicolon
5391 if ($line =~ /^\+.*\S\s+;\s*$/) {
5392 if (WARN("SPACING",
5393 "space prohibited before semicolon\n" . $herecurr) &&
5394 $fix) {
5395 1 while $fixed[$fixlinenr] =~
5396 s/^(\+.*\S)\s+;/$1;/;
5397 }
5398 }
5399
5400# check for multiple assignments
5401 if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
5402 CHK("MULTIPLE_ASSIGNMENTS",
5403 "multiple assignments should be avoided\n" . $herecurr);
5404 }
5405
5406## # check for multiple declarations, allowing for a function declaration
5407## # continuation.
5408## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
5409## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
5410##
5411## # Remove any bracketed sections to ensure we do not
5412## # falsely report the parameters of functions.
5413## my $ln = $line;
5414## while ($ln =~ s/\([^\(\)]*\)//g) {
5415## }
5416## if ($ln =~ /,/) {
5417## WARN("MULTIPLE_DECLARATION",
5418## "declaring multiple variables together should be avoided\n" . $herecurr);
5419## }
5420## }
5421
5422#need space before brace following if, while, etc
5423 if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
5424 $line =~ /\b(?:else|do)\{/) {
5425 if (ERROR("SPACING",
5426 "space required before the open brace '{'\n" . $herecurr) &&
5427 $fix) {
5428 $fixed[$fixlinenr] =~ s/^(\+.*(?:do|else|\)))\{/$1 {/;
5429 }
5430 }
5431
5432## # check for blank lines before declarations
5433## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
5434## $prevrawline =~ /^.\s*$/) {
5435## WARN("SPACING",
5436## "No blank lines before declarations\n" . $hereprev);
5437## }
5438##
5439
5440# closing brace should have a space following it when it has anything
5441# on the line
5442 if ($line =~ /}(?!(?:,|;|\)|\}))\S/) {
5443 if (ERROR("SPACING",
5444 "space required after that close brace '}'\n" . $herecurr) &&
5445 $fix) {
5446 $fixed[$fixlinenr] =~
5447 s/}((?!(?:,|;|\)))\S)/} $1/;
5448 }
5449 }
5450
5451# check spacing on square brackets
5452 if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
5453 if (ERROR("SPACING",
5454 "space prohibited after that open square bracket '['\n" . $herecurr) &&
5455 $fix) {
5456 $fixed[$fixlinenr] =~
5457 s/\[\s+/\[/;
5458 }
5459 }
5460 if ($line =~ /\s\]/) {
5461 if (ERROR("SPACING",
5462 "space prohibited before that close square bracket ']'\n" . $herecurr) &&
5463 $fix) {
5464 $fixed[$fixlinenr] =~
5465 s/\s+\]/\]/;
5466 }
5467 }
5468
5469# check spacing on parentheses
5470 if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
5471 $line !~ /for\s*\(\s+;/) {
5472 if (ERROR("SPACING",
5473 "space prohibited after that open parenthesis '('\n" . $herecurr) &&
5474 $fix) {
5475 $fixed[$fixlinenr] =~
5476 s/\(\s+/\(/;
5477 }
5478 }
5479 if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
5480 $line !~ /for\s*\(.*;\s+\)/ &&
5481 $line !~ /:\s+\)/) {
5482 if (ERROR("SPACING",
5483 "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
5484 $fix) {
5485 $fixed[$fixlinenr] =~
5486 s/\s+\)/\)/;
5487 }
5488 }
5489
5490# check unnecessary parentheses around addressof/dereference single $Lvals
5491# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
5492
5493 while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
5494 my $var = $1;
5495 if (CHK("UNNECESSARY_PARENTHESES",
5496 "Unnecessary parentheses around $var\n" . $herecurr) &&
5497 $fix) {
5498 $fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;
5499 }
5500 }
5501
5502# check for unnecessary parentheses around function pointer uses
5503# ie: (foo->bar)(); should be foo->bar();
5504# but not "if (foo->bar) (" to avoid some false positives
5505 if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {
5506 my $var = $2;
5507 if (CHK("UNNECESSARY_PARENTHESES",
5508 "Unnecessary parentheses around function pointer $var\n" . $herecurr) &&
5509 $fix) {
5510 my $var2 = deparenthesize($var);
5511 $var2 =~ s/\s//g;
5512 $fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;
5513 }
5514 }
5515
5516# check for unnecessary parentheses around comparisons in if uses
5517# when !drivers/staging or command-line uses --strict
5518 if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&
5519 $perl_version_ok && defined($stat) &&
5520 $stat =~ /(^.\s*if\s*($balanced_parens))/) {
5521 my $if_stat = $1;
5522 my $test = substr($2, 1, -1);
5523 my $herectx;
5524 while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) {
5525 my $match = $1;
5526 # avoid parentheses around potential macro args
5527 next if ($match =~ /^\s*\w+\s*$/);
5528 if (!defined($herectx)) {
5529 $herectx = $here . "\n";
5530 my $cnt = statement_rawlines($if_stat);
5531 for (my $n = 0; $n < $cnt; $n++) {
5532 my $rl = raw_line($linenr, $n);
5533 $herectx .= $rl . "\n";
5534 last if $rl =~ /^[ \+].*\{/;
5535 }
5536 }
5537 CHK("UNNECESSARY_PARENTHESES",
5538 "Unnecessary parentheses around '$match'\n" . $herectx);
5539 }
5540 }
5541
5542# check that goto labels aren't indented (allow a single space indentation)
5543# and ignore bitfield definitions like foo:1
5544# Strictly, labels can have whitespace after the identifier and before the :
5545# but this is not allowed here as many ?: uses would appear to be labels
5546 if ($sline =~ /^.\s+[A-Za-z_][A-Za-z\d_]*:(?!\s*\d+)/ &&
5547 $sline !~ /^. [A-Za-z\d_][A-Za-z\d_]*:/ &&
5548 $sline !~ /^.\s+default:/) {
5549 if (WARN("INDENTED_LABEL",
5550 "labels should not be indented\n" . $herecurr) &&
5551 $fix) {
5552 $fixed[$fixlinenr] =~
5553 s/^(.)\s+/$1/;
5554 }
5555 }
5556
5557# check if a statement with a comma should be two statements like:
5558# foo = bar(), /* comma should be semicolon */
5559# bar = baz();
5560 if (defined($stat) &&
5561 $stat =~ /^\+\s*(?:$Lval\s*$Assignment\s*)?$FuncArg\s*,\s*(?:$Lval\s*$Assignment\s*)?$FuncArg\s*;\s*$/) {
5562 my $cnt = statement_rawlines($stat);
5563 my $herectx = get_stat_here($linenr, $cnt, $here);
5564 WARN("SUSPECT_COMMA_SEMICOLON",
5565 "Possible comma where semicolon could be used\n" . $herectx);
5566 }
5567
5568# return is not a function
5569 if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
5570 my $spacing = $1;
5571 if ($perl_version_ok &&
5572 $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
5573 my $value = $1;
5574 $value = deparenthesize($value);
5575 if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
5576 ERROR("RETURN_PARENTHESES",
5577 "return is not a function, parentheses are not required\n" . $herecurr);
5578 }
5579 } elsif ($spacing !~ /\s+/) {
5580 ERROR("SPACING",
5581 "space required before the open parenthesis '('\n" . $herecurr);
5582 }
5583 }
5584
5585# unnecessary return in a void function
5586# at end-of-function, with the previous line a single leading tab, then return;
5587# and the line before that not a goto label target like "out:"
5588 if ($sline =~ /^[ \+]}\s*$/ &&
5589 $prevline =~ /^\+\treturn\s*;\s*$/ &&
5590 $linenr >= 3 &&
5591 $lines[$linenr - 3] =~ /^[ +]/ &&
5592 $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
5593 WARN("RETURN_VOID",
5594 "void function return statements are not generally useful\n" . $hereprev);
5595 }
5596
5597# if statements using unnecessary parentheses - ie: if ((foo == bar))
5598 if ($perl_version_ok &&
5599 $line =~ /\bif\s*((?:\(\s*){2,})/) {
5600 my $openparens = $1;
5601 my $count = $openparens =~ tr@\(@\(@;
5602 my $msg = "";
5603 if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
5604 my $comp = $4; #Not $1 because of $LvalOrFunc
5605 $msg = " - maybe == should be = ?" if ($comp eq "==");
5606 WARN("UNNECESSARY_PARENTHESES",
5607 "Unnecessary parentheses$msg\n" . $herecurr);
5608 }
5609 }
5610
5611# comparisons with a constant or upper case identifier on the left
5612# avoid cases like "foo + BAR < baz"
5613# only fix matches surrounded by parentheses to avoid incorrect
5614# conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5"
5615 if ($perl_version_ok &&
5616 $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {
5617 my $lead = $1;
5618 my $const = $2;
5619 my $comp = $3;
5620 my $to = $4;
5621 my $newcomp = $comp;
5622 if ($lead !~ /(?:$Operators|\.)\s*$/ &&
5623 $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
5624 WARN("CONSTANT_COMPARISON",
5625 "Comparisons should place the constant on the right side of the test\n" . $herecurr) &&
5626 $fix) {
5627 if ($comp eq "<") {
5628 $newcomp = ">";
5629 } elsif ($comp eq "<=") {
5630 $newcomp = ">=";
5631 } elsif ($comp eq ">") {
5632 $newcomp = "<";
5633 } elsif ($comp eq ">=") {
5634 $newcomp = "<=";
5635 }
5636 $fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/;
5637 }
5638 }
5639
5640# Return of what appears to be an errno should normally be negative
5641 if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
5642 my $name = $1;
5643 if ($name ne 'EOF' && $name ne 'ERROR' && $name !~ /^EPOLL/) {
5644 WARN("USE_NEGATIVE_ERRNO",
5645 "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
5646 }
5647 }
5648
5649# Need a space before open parenthesis after if, while etc
5650 if ($line =~ /\b(if|while|for|switch)\(/) {
5651 if (ERROR("SPACING",
5652 "space required before the open parenthesis '('\n" . $herecurr) &&
5653 $fix) {
5654 $fixed[$fixlinenr] =~
5655 s/\b(if|while|for|switch)\(/$1 \(/;
5656 }
5657 }
5658
5659# Check for illegal assignment in if conditional -- and check for trailing
5660# statements after the conditional.
5661 if ($line =~ /do\s*(?!{)/) {
5662 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
5663 ctx_statement_block($linenr, $realcnt, 0)
5664 if (!defined $stat);
5665 my ($stat_next) = ctx_statement_block($line_nr_next,
5666 $remain_next, $off_next);
5667 $stat_next =~ s/\n./\n /g;
5668 ##print "stat<$stat> stat_next<$stat_next>\n";
5669
5670 if ($stat_next =~ /^\s*while\b/) {
5671 # If the statement carries leading newlines,
5672 # then count those as offsets.
5673 my ($whitespace) =
5674 ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
5675 my $offset =
5676 statement_rawlines($whitespace) - 1;
5677
5678 $suppress_whiletrailers{$line_nr_next +
5679 $offset} = 1;
5680 }
5681 }
5682 if (!defined $suppress_whiletrailers{$linenr} &&
5683 defined($stat) && defined($cond) &&
5684 $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
5685 my ($s, $c) = ($stat, $cond);
5686 my $fixed_assign_in_if = 0;
5687
5688 if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
5689 if (ERROR("ASSIGN_IN_IF",
5690 "do not use assignment in if condition\n" . $herecurr) &&
5691 $fix && $perl_version_ok) {
5692 if ($rawline =~ /^\+(\s+)if\s*\(\s*(\!)?\s*\(\s*(($Lval)\s*=\s*$LvalOrFunc)\s*\)\s*(?:($Compare)\s*($FuncArg))?\s*\)\s*(\{)?\s*$/) {
5693 my $space = $1;
5694 my $not = $2;
5695 my $statement = $3;
5696 my $assigned = $4;
5697 my $test = $8;
5698 my $against = $9;
5699 my $brace = $15;
5700 fix_delete_line($fixlinenr, $rawline);
5701 fix_insert_line($fixlinenr, "$space$statement;");
5702 my $newline = "${space}if (";
5703 $newline .= '!' if defined($not);
5704 $newline .= '(' if (defined $not && defined($test) && defined($against));
5705 $newline .= "$assigned";
5706 $newline .= " $test $against" if (defined($test) && defined($against));
5707 $newline .= ')' if (defined $not && defined($test) && defined($against));
5708 $newline .= ')';
5709 $newline .= " {" if (defined($brace));
5710 fix_insert_line($fixlinenr + 1, $newline);
5711 $fixed_assign_in_if = 1;
5712 }
5713 }
5714 }
5715
5716 # Find out what is on the end of the line after the
5717 # conditional.
5718 substr($s, 0, length($c), '');
5719 $s =~ s/\n.*//g;
5720 $s =~ s/$;//g; # Remove any comments
5721 if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
5722 $c !~ /}\s*while\s*/)
5723 {
5724 # Find out how long the conditional actually is.
5725 my @newlines = ($c =~ /\n/gs);
5726 my $cond_lines = 1 + $#newlines;
5727 my $stat_real = '';
5728
5729 $stat_real = raw_line($linenr, $cond_lines)
5730 . "\n" if ($cond_lines);
5731 if (defined($stat_real) && $cond_lines > 1) {
5732 $stat_real = "[...]\n$stat_real";
5733 }
5734
5735 if (ERROR("TRAILING_STATEMENTS",
5736 "trailing statements should be on next line\n" . $herecurr . $stat_real) &&
5737 !$fixed_assign_in_if &&
5738 $cond_lines == 0 &&
5739 $fix && $perl_version_ok &&
5740 $fixed[$fixlinenr] =~ /^\+(\s*)((?:if|while|for)\s*$balanced_parens)\s*(.*)$/) {
5741 my $indent = $1;
5742 my $test = $2;
5743 my $rest = rtrim($4);
5744 if ($rest =~ /;$/) {
5745 $fixed[$fixlinenr] = "\+$indent$test";
5746 fix_insert_line($fixlinenr + 1, "$indent\t$rest");
5747 }
5748 }
5749 }
5750 }
5751
5752# Check for bitwise tests written as boolean
5753 if ($line =~ /
5754 (?:
5755 (?:\[|\(|\&\&|\|\|)
5756 \s*0[xX][0-9]+\s*
5757 (?:\&\&|\|\|)
5758 |
5759 (?:\&\&|\|\|)
5760 \s*0[xX][0-9]+\s*
5761 (?:\&\&|\|\||\)|\])
5762 )/x)
5763 {
5764 WARN("HEXADECIMAL_BOOLEAN_TEST",
5765 "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
5766 }
5767
5768# if and else should not have general statements after it
5769 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
5770 my $s = $1;
5771 $s =~ s/$;//g; # Remove any comments
5772 if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
5773 ERROR("TRAILING_STATEMENTS",
5774 "trailing statements should be on next line\n" . $herecurr);
5775 }
5776 }
5777# if should not continue a brace
5778 if ($line =~ /}\s*if\b/) {
5779 ERROR("TRAILING_STATEMENTS",
5780 "trailing statements should be on next line (or did you mean 'else if'?)\n" .
5781 $herecurr);
5782 }
5783# case and default should not have general statements after them
5784 if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
5785 $line !~ /\G(?:
5786 (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
5787 \s*return\s+
5788 )/xg)
5789 {
5790 ERROR("TRAILING_STATEMENTS",
5791 "trailing statements should be on next line\n" . $herecurr);
5792 }
5793
5794 # Check for }<nl>else {, these must be at the same
5795 # indent level to be relevant to each other.
5796 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
5797 $previndent == $indent) {
5798 if (ERROR("ELSE_AFTER_BRACE",
5799 "else should follow close brace '}'\n" . $hereprev) &&
5800 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
5801 fix_delete_line($fixlinenr - 1, $prevrawline);
5802 fix_delete_line($fixlinenr, $rawline);
5803 my $fixedline = $prevrawline;
5804 $fixedline =~ s/}\s*$//;
5805 if ($fixedline !~ /^\+\s*$/) {
5806 fix_insert_line($fixlinenr, $fixedline);
5807 }
5808 $fixedline = $rawline;
5809 $fixedline =~ s/^(.\s*)else/$1} else/;
5810 fix_insert_line($fixlinenr, $fixedline);
5811 }
5812 }
5813
5814 if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
5815 $previndent == $indent) {
5816 my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
5817
5818 # Find out what is on the end of the line after the
5819 # conditional.
5820 substr($s, 0, length($c), '');
5821 $s =~ s/\n.*//g;
5822
5823 if ($s =~ /^\s*;/) {
5824 if (ERROR("WHILE_AFTER_BRACE",
5825 "while should follow close brace '}'\n" . $hereprev) &&
5826 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
5827 fix_delete_line($fixlinenr - 1, $prevrawline);
5828 fix_delete_line($fixlinenr, $rawline);
5829 my $fixedline = $prevrawline;
5830 my $trailing = $rawline;
5831 $trailing =~ s/^\+//;
5832 $trailing = trim($trailing);
5833 $fixedline =~ s/}\s*$/} $trailing/;
5834 fix_insert_line($fixlinenr, $fixedline);
5835 }
5836 }
5837 }
5838
5839#Specific variable tests
5840 while ($line =~ m{($Constant|$Lval)}g) {
5841 my $var = $1;
5842
5843#CamelCase
5844 if ($var !~ /^$Constant$/ &&
5845 $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
5846#Ignore some autogenerated defines and enum values
5847 $var !~ /^(?:[A-Z]+_){1,5}[A-Z]{1,3}[a-z]/ &&
5848#Ignore Page<foo> variants
5849 $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
5850#Ignore ETHTOOL_LINK_MODE_<foo> variants
5851 $var !~ /^ETHTOOL_LINK_MODE_/ &&
5852#Ignore SI style variants like nS, mV and dB
5853#(ie: max_uV, regulator_min_uA_show, RANGE_mA_VALUE)
5854 $var !~ /^(?:[a-z0-9_]*|[A-Z0-9_]*)?_?[a-z][A-Z](?:_[a-z0-9_]+|_[A-Z0-9_]+)?$/ &&
5855#Ignore some three character SI units explicitly, like MiB and KHz
5856 $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
5857 while ($var =~ m{\b($Ident)}g) {
5858 my $word = $1;
5859 next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
5860 if ($check) {
5861 seed_camelcase_includes();
5862 if (!$file && !$camelcase_file_seeded) {
5863 seed_camelcase_file($realfile);
5864 $camelcase_file_seeded = 1;
5865 }
5866 }
5867 if (!defined $camelcase{$word}) {
5868 $camelcase{$word} = 1;
5869 CHK("CAMELCASE",
5870 "Avoid CamelCase: <$word>\n" . $herecurr);
5871 }
5872 }
5873 }
5874 }
5875
5876#no spaces allowed after \ in define
5877 if ($line =~ /\#\s*define.*\\\s+$/) {
5878 if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
5879 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
5880 $fix) {
5881 $fixed[$fixlinenr] =~ s/\s+$//;
5882 }
5883 }
5884
5885# warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes
5886# itself <asm/foo.h> (uses RAW line)
5887 if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
5888 my $file = "$1.h";
5889 my $checkfile = "include/linux/$file";
5890 if (-f "$root/$checkfile" &&
5891 $realfile ne $checkfile &&
5892 $1 !~ /$allowed_asm_includes/)
5893 {
5894 my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`;
5895 if ($asminclude > 0) {
5896 if ($realfile =~ m{^arch/}) {
5897 CHK("ARCH_INCLUDE_LINUX",
5898 "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
5899 } else {
5900 WARN("INCLUDE_LINUX",
5901 "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
5902 }
5903 }
5904 }
5905 }
5906
5907# multi-statement macros should be enclosed in a do while loop, grab the
5908# first statement and ensure its the whole macro if its not enclosed
5909# in a known good container
5910 if ($realfile !~ m@/vmlinux.lds.h$@ &&
5911 $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
5912 my $ln = $linenr;
5913 my $cnt = $realcnt;
5914 my ($off, $dstat, $dcond, $rest);
5915 my $ctx = '';
5916 my $has_flow_statement = 0;
5917 my $has_arg_concat = 0;
5918 ($dstat, $dcond, $ln, $cnt, $off) =
5919 ctx_statement_block($linenr, $realcnt, 0);
5920 $ctx = $dstat;
5921 #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
5922 #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
5923
5924 $has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
5925 $has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/);
5926
5927 $dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//;
5928 my $define_args = $1;
5929 my $define_stmt = $dstat;
5930 my @def_args = ();
5931
5932 if (defined $define_args && $define_args ne "") {
5933 $define_args = substr($define_args, 1, length($define_args) - 2);
5934 $define_args =~ s/\s*//g;
5935 $define_args =~ s/\\\+?//g;
5936 @def_args = split(",", $define_args);
5937 }
5938
5939 $dstat =~ s/$;//g;
5940 $dstat =~ s/\\\n.//g;
5941 $dstat =~ s/^\s*//s;
5942 $dstat =~ s/\s*$//s;
5943
5944 # Flatten any parentheses and braces
5945 while ($dstat =~ s/\([^\(\)]*\)/1u/ ||
5946 $dstat =~ s/\{[^\{\}]*\}/1u/ ||
5947 $dstat =~ s/.\[[^\[\]]*\]/1u/)
5948 {
5949 }
5950
5951 # Flatten any obvious string concatenation.
5952 while ($dstat =~ s/($String)\s*$Ident/$1/ ||
5953 $dstat =~ s/$Ident\s*($String)/$1/)
5954 {
5955 }
5956
5957 # Make asm volatile uses seem like a generic function
5958 $dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
5959
5960 my $exceptions = qr{
5961 $Declare|
5962 module_param_named|
5963 MODULE_PARM_DESC|
5964 DECLARE_PER_CPU|
5965 DEFINE_PER_CPU|
5966 __typeof__\(|
5967 union|
5968 struct|
5969 \.$Ident\s*=\s*|
5970 ^\"|\"$|
5971 ^\[
5972 }x;
5973 #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
5974
5975 $ctx =~ s/\n*$//;
5976 my $stmt_cnt = statement_rawlines($ctx);
5977 my $herectx = get_stat_here($linenr, $stmt_cnt, $here);
5978
5979 if ($dstat ne '' &&
5980 $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(),
5981 $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo();
5982 $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
5983 $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ && # character constants
5984 $dstat !~ /$exceptions/ &&
5985 $dstat !~ /^\.$Ident\s*=/ && # .foo =
5986 $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo
5987 $dstat !~ /^case\b/ && # case ...
5988 $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...)
5989 $dstat !~ /^while\s*$Constant\s*$Constant\s*$/ && # while (...) {...}
5990 $dstat !~ /^for\s*$Constant$/ && # for (...)
5991 $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar()
5992 $dstat !~ /^do\s*{/ && # do {...
5993 $dstat !~ /^\(\{/ && # ({...
5994 $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
5995 {
5996 if ($dstat =~ /^\s*if\b/) {
5997 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
5998 "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx");
5999 } elsif ($dstat =~ /;/) {
6000 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
6001 "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
6002 } else {
6003 ERROR("COMPLEX_MACRO",
6004 "Macros with complex values should be enclosed in parentheses\n" . "$herectx");
6005 }
6006
6007 }
6008
6009 # Make $define_stmt single line, comment-free, etc
6010 my @stmt_array = split('\n', $define_stmt);
6011 my $first = 1;
6012 $define_stmt = "";
6013 foreach my $l (@stmt_array) {
6014 $l =~ s/\\$//;
6015 if ($first) {
6016 $define_stmt = $l;
6017 $first = 0;
6018 } elsif ($l =~ /^[\+ ]/) {
6019 $define_stmt .= substr($l, 1);
6020 }
6021 }
6022 $define_stmt =~ s/$;//g;
6023 $define_stmt =~ s/\s+/ /g;
6024 $define_stmt = trim($define_stmt);
6025
6026# check if any macro arguments are reused (ignore '...' and 'type')
6027 foreach my $arg (@def_args) {
6028 next if ($arg =~ /\.\.\./);
6029 next if ($arg =~ /^type$/i);
6030 my $tmp_stmt = $define_stmt;
6031 $tmp_stmt =~ s/\b(__must_be_array|offsetof|sizeof|sizeof_field|__stringify|typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
6032 $tmp_stmt =~ s/\#+\s*$arg\b//g;
6033 $tmp_stmt =~ s/\b$arg\s*\#\#//g;
6034 my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g;
6035 if ($use_cnt > 1) {
6036 CHK("MACRO_ARG_REUSE",
6037 "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");
6038 }
6039# check if any macro arguments may have other precedence issues
6040 if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
6041 ((defined($1) && $1 ne ',') ||
6042 (defined($2) && $2 ne ','))) {
6043 CHK("MACRO_ARG_PRECEDENCE",
6044 "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx");
6045 }
6046
6047# check if this is an unused argument
6048 if ($define_stmt !~ /\b$arg\b/) {
6049 WARN("MACRO_ARG_UNUSED",
6050 "Argument '$arg' is not used in function-like macro\n" . "$herectx");
6051 }
6052 }
6053
6054# check for macros with flow control, but without ## concatenation
6055# ## concatenation is commonly a macro that defines a function so ignore those
6056 if ($has_flow_statement && !$has_arg_concat) {
6057 my $cnt = statement_rawlines($ctx);
6058 my $herectx = get_stat_here($linenr, $cnt, $here);
6059
6060 WARN("MACRO_WITH_FLOW_CONTROL",
6061 "Macros with flow control statements should be avoided\n" . "$herectx");
6062 }
6063
6064# check for line continuations outside of #defines, preprocessor #, and asm
6065
6066 } elsif ($realfile =~ m@/vmlinux.lds.h$@) {
6067 $line =~ s/(\w+)/$maybe_linker_symbol{$1}++/ge;
6068 #print "REAL: $realfile\nln: $line\nkeys:", sort keys %maybe_linker_symbol;
6069 } else {
6070 if ($prevline !~ /^..*\\$/ &&
6071 $line !~ /^\+\s*\#.*\\$/ && # preprocessor
6072 $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm
6073 $line =~ /^\+.*\\$/) {
6074 WARN("LINE_CONTINUATIONS",
6075 "Avoid unnecessary line continuations\n" . $herecurr);
6076 }
6077 }
6078
6079# do {} while (0) macro tests:
6080# single-statement macros do not need to be enclosed in do while (0) loop,
6081# macro should not end with a semicolon
6082 if ($perl_version_ok &&
6083 $realfile !~ m@/vmlinux.lds.h$@ &&
6084 $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
6085 my $ln = $linenr;
6086 my $cnt = $realcnt;
6087 my ($off, $dstat, $dcond, $rest);
6088 my $ctx = '';
6089 ($dstat, $dcond, $ln, $cnt, $off) =
6090 ctx_statement_block($linenr, $realcnt, 0);
6091 $ctx = $dstat;
6092
6093 $dstat =~ s/\\\n.//g;
6094 $dstat =~ s/$;/ /g;
6095
6096 if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
6097 my $stmts = $2;
6098 my $semis = $3;
6099
6100 $ctx =~ s/\n*$//;
6101 my $cnt = statement_rawlines($ctx);
6102 my $herectx = get_stat_here($linenr, $cnt, $here);
6103
6104 if (($stmts =~ tr/;/;/) == 1 &&
6105 $stmts !~ /^\s*(if|while|for|switch)\b/) {
6106 WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
6107 "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
6108 }
6109 if (defined $semis && $semis ne "") {
6110 WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
6111 "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
6112 }
6113 } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
6114 $ctx =~ s/\n*$//;
6115 my $cnt = statement_rawlines($ctx);
6116 my $herectx = get_stat_here($linenr, $cnt, $here);
6117
6118 WARN("TRAILING_SEMICOLON",
6119 "macros should not use a trailing semicolon\n" . "$herectx");
6120 }
6121 }
6122
6123# check for redundant bracing round if etc
6124 if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
6125 my ($level, $endln, @chunks) =
6126 ctx_statement_full($linenr, $realcnt, 1);
6127 #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
6128 #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
6129 if ($#chunks > 0 && $level == 0) {
6130 my @allowed = ();
6131 my $allow = 0;
6132 my $seen = 0;
6133 my $herectx = $here . "\n";
6134 my $ln = $linenr - 1;
6135 for my $chunk (@chunks) {
6136 my ($cond, $block) = @{$chunk};
6137
6138 # If the condition carries leading newlines, then count those as offsets.
6139 my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
6140 my $offset = statement_rawlines($whitespace) - 1;
6141
6142 $allowed[$allow] = 0;
6143 #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
6144
6145 # We have looked at and allowed this specific line.
6146 $suppress_ifbraces{$ln + $offset} = 1;
6147
6148 $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
6149 $ln += statement_rawlines($block) - 1;
6150
6151 substr($block, 0, length($cond), '');
6152
6153 $seen++ if ($block =~ /^\s*{/);
6154
6155 #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
6156 if (statement_lines($cond) > 1) {
6157 #print "APW: ALLOWED: cond<$cond>\n";
6158 $allowed[$allow] = 1;
6159 }
6160 if ($block =~/\b(?:if|for|while)\b/) {
6161 #print "APW: ALLOWED: block<$block>\n";
6162 $allowed[$allow] = 1;
6163 }
6164 if (statement_block_size($block) > 1) {
6165 #print "APW: ALLOWED: lines block<$block>\n";
6166 $allowed[$allow] = 1;
6167 }
6168 $allow++;
6169 }
6170 if ($seen) {
6171 my $sum_allowed = 0;
6172 foreach (@allowed) {
6173 $sum_allowed += $_;
6174 }
6175 if ($sum_allowed == 0) {
6176 WARN("BRACES",
6177 "braces {} are not necessary for any arm of this statement\n" . $herectx);
6178 } elsif ($sum_allowed != $allow &&
6179 $seen != $allow) {
6180 CHK("BRACES",
6181 "braces {} should be used on all arms of this statement\n" . $herectx);
6182 }
6183 }
6184 }
6185 }
6186 if (!defined $suppress_ifbraces{$linenr - 1} &&
6187 $line =~ /\b(if|while|for|else)\b/) {
6188 my $allowed = 0;
6189
6190 # Check the pre-context.
6191 if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
6192 #print "APW: ALLOWED: pre<$1>\n";
6193 $allowed = 1;
6194 }
6195
6196 my ($level, $endln, @chunks) =
6197 ctx_statement_full($linenr, $realcnt, $-[0]);
6198
6199 # Check the condition.
6200 my ($cond, $block) = @{$chunks[0]};
6201 #print "CHECKING<$linenr> cond<$cond> block<$block>\n";
6202 if (defined $cond) {
6203 substr($block, 0, length($cond), '');
6204 }
6205 if (statement_lines($cond) > 1) {
6206 #print "APW: ALLOWED: cond<$cond>\n";
6207 $allowed = 1;
6208 }
6209 if ($block =~/\b(?:if|for|while)\b/) {
6210 #print "APW: ALLOWED: block<$block>\n";
6211 $allowed = 1;
6212 }
6213 if (statement_block_size($block) > 1) {
6214 #print "APW: ALLOWED: lines block<$block>\n";
6215 $allowed = 1;
6216 }
6217 # Check the post-context.
6218 if (defined $chunks[1]) {
6219 my ($cond, $block) = @{$chunks[1]};
6220 if (defined $cond) {
6221 substr($block, 0, length($cond), '');
6222 }
6223 if ($block =~ /^\s*\{/) {
6224 #print "APW: ALLOWED: chunk-1 block<$block>\n";
6225 $allowed = 1;
6226 }
6227 }
6228 if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
6229 my $cnt = statement_rawlines($block);
6230 my $herectx = get_stat_here($linenr, $cnt, $here);
6231
6232 WARN("BRACES",
6233 "braces {} are not necessary for single statement blocks\n" . $herectx);
6234 }
6235 }
6236
6237# check for single line unbalanced braces
6238 if ($sline =~ /^.\s*\}\s*else\s*$/ ||
6239 $sline =~ /^.\s*else\s*\{\s*$/) {
6240 CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr);
6241 }
6242
6243# check for unnecessary blank lines around braces
6244 if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
6245 if (CHK("BRACES",
6246 "Blank lines aren't necessary before a close brace '}'\n" . $hereprev) &&
6247 $fix && $prevrawline =~ /^\+/) {
6248 fix_delete_line($fixlinenr - 1, $prevrawline);
6249 }
6250 }
6251 if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
6252 if (CHK("BRACES",
6253 "Blank lines aren't necessary after an open brace '{'\n" . $hereprev) &&
6254 $fix) {
6255 fix_delete_line($fixlinenr, $rawline);
6256 }
6257 }
6258
6259# no volatiles please
6260 my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
6261 if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
6262 WARN("VOLATILE",
6263 "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr);
6264 }
6265
6266# Check for user-visible strings broken across lines, which breaks the ability
6267# to grep for the string. Make exceptions when the previous string ends in a
6268# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
6269# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
6270 if ($line =~ /^\+\s*$String/ &&
6271 $prevline =~ /"\s*$/ &&
6272 $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
6273 if (WARN("SPLIT_STRING",
6274 "quoted string split across lines\n" . $hereprev) &&
6275 $fix &&
6276 $prevrawline =~ /^\+.*"\s*$/ &&
6277 $last_coalesced_string_linenr != $linenr - 1) {
6278 my $extracted_string = get_quoted_string($line, $rawline);
6279 my $comma_close = "";
6280 if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) {
6281 $comma_close = $1;
6282 }
6283
6284 fix_delete_line($fixlinenr - 1, $prevrawline);
6285 fix_delete_line($fixlinenr, $rawline);
6286 my $fixedline = $prevrawline;
6287 $fixedline =~ s/"\s*$//;
6288 $fixedline .= substr($extracted_string, 1) . trim($comma_close);
6289 fix_insert_line($fixlinenr - 1, $fixedline);
6290 $fixedline = $rawline;
6291 $fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//;
6292 if ($fixedline !~ /\+\s*$/) {
6293 fix_insert_line($fixlinenr, $fixedline);
6294 }
6295 $last_coalesced_string_linenr = $linenr;
6296 }
6297 }
6298
6299# check for missing a space in a string concatenation
6300 if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
6301 WARN('MISSING_SPACE',
6302 "break quoted strings at a space character\n" . $hereprev);
6303 }
6304
6305# check for an embedded function name in a string when the function is known
6306# This does not work very well for -f --file checking as it depends on patch
6307# context providing the function name or a single line form for in-file
6308# function declarations
6309 if ($line =~ /^\+.*$String/ &&
6310 defined($context_function) &&
6311 get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
6312 length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
6313 WARN("EMBEDDED_FUNCTION_NAME",
6314 "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr);
6315 }
6316
6317# check for unnecessary function tracing like uses
6318# This does not use $logFunctions because there are many instances like
6319# 'dprintk(FOO, "%s()\n", __func__);' which do not match $logFunctions
6320 if ($rawline =~ /^\+.*\([^"]*"$tracing_logging_tags{0,3}%s(?:\s*\(\s*\)\s*)?$tracing_logging_tags{0,3}(?:\\n)?"\s*,\s*__func__\s*\)\s*;/) {
6321 if (WARN("TRACING_LOGGING",
6322 "Unnecessary ftrace-like logging - prefer using ftrace\n" . $herecurr) &&
6323 $fix) {
6324 fix_delete_line($fixlinenr, $rawline);
6325 }
6326 }
6327
6328# check for spaces before a quoted newline
6329 if ($rawline =~ /^.*\".*\s\\n/) {
6330 if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
6331 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
6332 $fix) {
6333 $fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
6334 }
6335
6336 }
6337
6338# concatenated string without spaces between elements
6339 if ($line =~ /$String[A-Z_]/ ||
6340 ($line =~ /([A-Za-z0-9_]+)$String/ && $1 !~ /^[Lu]$/)) {
6341 if (CHK("CONCATENATED_STRING",
6342 "Concatenated strings should use spaces between elements\n" . $herecurr) &&
6343 $fix) {
6344 while ($line =~ /($String)/g) {
6345 my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]);
6346 $fixed[$fixlinenr] =~ s/\Q$extracted_string\E([A-Za-z0-9_])/$extracted_string $1/;
6347 $fixed[$fixlinenr] =~ s/([A-Za-z0-9_])\Q$extracted_string\E/$1 $extracted_string/;
6348 }
6349 }
6350 }
6351
6352# uncoalesced string fragments
6353 if ($line =~ /$String\s*[Lu]?"/) {
6354 if (WARN("STRING_FRAGMENTS",
6355 "Consecutive strings are generally better as a single string\n" . $herecurr) &&
6356 $fix) {
6357 while ($line =~ /($String)(?=\s*")/g) {
6358 my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]);
6359 $fixed[$fixlinenr] =~ s/\Q$extracted_string\E\s*"/substr($extracted_string, 0, -1)/e;
6360 }
6361 }
6362 }
6363
6364# check for non-standard and hex prefixed decimal printf formats
6365 my $show_L = 1; #don't show the same defect twice
6366 my $show_Z = 1;
6367 while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
6368 my $string = substr($rawline, $-[1], $+[1] - $-[1]);
6369 $string =~ s/%%/__/g;
6370 # check for %L
6371 if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
6372 WARN("PRINTF_L",
6373 "\%L$1 is non-standard C, use %ll$1\n" . $herecurr);
6374 $show_L = 0;
6375 }
6376 # check for %Z
6377 if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) {
6378 WARN("PRINTF_Z",
6379 "%Z$1 is non-standard C, use %z$1\n" . $herecurr);
6380 $show_Z = 0;
6381 }
6382 # check for 0x<decimal>
6383 if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) {
6384 ERROR("PRINTF_0XDECIMAL",
6385 "Prefixing 0x with decimal output is defective\n" . $herecurr);
6386 }
6387 }
6388
6389# check for line continuations in quoted strings with odd counts of "
6390 if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) {
6391 WARN("LINE_CONTINUATIONS",
6392 "Avoid line continuations in quoted strings\n" . $herecurr);
6393 }
6394
6395# warn about #if 0
6396 if ($line =~ /^.\s*\#\s*if\s+0\b/) {
6397 WARN("IF_0",
6398 "Consider removing the code enclosed by this #if 0 and its #endif\n" . $herecurr);
6399 }
6400
6401# warn about #if 1
6402 if ($line =~ /^.\s*\#\s*if\s+1\b/) {
6403 WARN("IF_1",
6404 "Consider removing the #if 1 and its #endif\n" . $herecurr);
6405 }
6406
6407# check for needless "if (<foo>) fn(<foo>)" uses
6408 if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
6409 my $tested = quotemeta($1);
6410 my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;';
6411 if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) {
6412 my $func = $1;
6413 if (WARN('NEEDLESS_IF',
6414 "$func(NULL) is safe and this check is probably not required\n" . $hereprev) &&
6415 $fix) {
6416 my $do_fix = 1;
6417 my $leading_tabs = "";
6418 my $new_leading_tabs = "";
6419 if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) {
6420 $leading_tabs = $1;
6421 } else {
6422 $do_fix = 0;
6423 }
6424 if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) {
6425 $new_leading_tabs = $1;
6426 if (length($leading_tabs) + 1 ne length($new_leading_tabs)) {
6427 $do_fix = 0;
6428 }
6429 } else {
6430 $do_fix = 0;
6431 }
6432 if ($do_fix) {
6433 fix_delete_line($fixlinenr - 1, $prevrawline);
6434 $fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/;
6435 }
6436 }
6437 }
6438 }
6439
6440# check for unnecessary "Out of Memory" messages
6441 if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
6442 $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
6443 (defined $1 || defined $3) &&
6444 $linenr > 3) {
6445 my $testval = $2;
6446 my $testline = $lines[$linenr - 3];
6447
6448 my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
6449# print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
6450
6451 if ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*$allocFunctions\s*\(/ &&
6452 $s !~ /\b__GFP_NOWARN\b/ ) {
6453 WARN("OOM_MESSAGE",
6454 "Possible unnecessary 'out of memory' message\n" . $hereprev);
6455 }
6456 }
6457
6458# check for logging functions with KERN_<LEVEL>
6459 if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
6460 $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) {
6461 my $level = $1;
6462 if (WARN("UNNECESSARY_KERN_LEVEL",
6463 "Possible unnecessary $level\n" . $herecurr) &&
6464 $fix) {
6465 $fixed[$fixlinenr] =~ s/\s*$level\s*//;
6466 }
6467 }
6468
6469# check for logging continuations
6470 if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) {
6471 WARN("LOGGING_CONTINUATION",
6472 "Avoid logging continuation uses where feasible\n" . $herecurr);
6473 }
6474
6475# check for unnecessary use of %h[xudi] and %hh[xudi] in logging functions
6476 if (defined $stat &&
6477 $line =~ /\b$logFunctions\s*\(/ &&
6478 index($stat, '"') >= 0) {
6479 my $lc = $stat =~ tr@\n@@;
6480 $lc = $lc + $linenr;
6481 my $stat_real = get_stat_real($linenr, $lc);
6482 pos($stat_real) = index($stat_real, '"');
6483 while ($stat_real =~ /[^\"%]*(%[\#\d\.\*\-]*(h+)[idux])/g) {
6484 my $pspec = $1;
6485 my $h = $2;
6486 my $lineoff = substr($stat_real, 0, $-[1]) =~ tr@\n@@;
6487 if (WARN("UNNECESSARY_MODIFIER",
6488 "Integer promotion: Using '$h' in '$pspec' is unnecessary\n" . "$here\n$stat_real\n") &&
6489 $fix && $fixed[$fixlinenr + $lineoff] =~ /^\+/) {
6490 my $nspec = $pspec;
6491 $nspec =~ s/h//g;
6492 $fixed[$fixlinenr + $lineoff] =~ s/\Q$pspec\E/$nspec/;
6493 }
6494 }
6495 }
6496
6497# check for mask then right shift without a parentheses
6498 if ($perl_version_ok &&
6499 $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
6500 $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so
6501 WARN("MASK_THEN_SHIFT",
6502 "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr);
6503 }
6504
6505# check for pointer comparisons to NULL
6506 if ($perl_version_ok) {
6507 while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) {
6508 my $val = $1;
6509 my $equal = "!";
6510 $equal = "" if ($4 eq "!=");
6511 if (CHK("COMPARISON_TO_NULL",
6512 "Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) &&
6513 $fix) {
6514 $fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/;
6515 }
6516 }
6517 }
6518
6519# check for bad placement of section $InitAttribute (e.g.: __initdata)
6520 if ($line =~ /(\b$InitAttribute\b)/) {
6521 my $attr = $1;
6522 if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
6523 my $ptr = $1;
6524 my $var = $2;
6525 if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
6526 ERROR("MISPLACED_INIT",
6527 "$attr should be placed after $var\n" . $herecurr)) ||
6528 ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
6529 WARN("MISPLACED_INIT",
6530 "$attr should be placed after $var\n" . $herecurr))) &&
6531 $fix) {
6532 $fixed[$fixlinenr] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e;
6533 }
6534 }
6535 }
6536
6537# check for $InitAttributeData (ie: __initdata) with const
6538 if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
6539 my $attr = $1;
6540 $attr =~ /($InitAttributePrefix)(.*)/;
6541 my $attr_prefix = $1;
6542 my $attr_type = $2;
6543 if (ERROR("INIT_ATTRIBUTE",
6544 "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
6545 $fix) {
6546 $fixed[$fixlinenr] =~
6547 s/$InitAttributeData/${attr_prefix}initconst/;
6548 }
6549 }
6550
6551# check for $InitAttributeConst (ie: __initconst) without const
6552 if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
6553 my $attr = $1;
6554 if (ERROR("INIT_ATTRIBUTE",
6555 "Use of $attr requires a separate use of const\n" . $herecurr) &&
6556 $fix) {
6557 my $lead = $fixed[$fixlinenr] =~
6558 /(^\+\s*(?:static\s+))/;
6559 $lead = rtrim($1);
6560 $lead = "$lead " if ($lead !~ /^\+$/);
6561 $lead = "${lead}const ";
6562 $fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
6563 }
6564 }
6565
6566# check for __read_mostly with const non-pointer (should just be const)
6567 if ($line =~ /\b__read_mostly\b/ &&
6568 $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) {
6569 if (ERROR("CONST_READ_MOSTLY",
6570 "Invalid use of __read_mostly with const type\n" . $herecurr) &&
6571 $fix) {
6572 $fixed[$fixlinenr] =~ s/\s+__read_mostly\b//;
6573 }
6574 }
6575
6576# don't use __constant_<foo> functions outside of include/uapi/
6577 if ($realfile !~ m@^include/uapi/@ &&
6578 $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
6579 my $constant_func = $1;
6580 my $func = $constant_func;
6581 $func =~ s/^__constant_//;
6582 if (WARN("CONSTANT_CONVERSION",
6583 "$constant_func should be $func\n" . $herecurr) &&
6584 $fix) {
6585 $fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
6586 }
6587 }
6588
6589# prefer usleep_range over udelay
6590 if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
6591 my $delay = $1;
6592 # ignore udelay's < 10, however
6593 if (! ($delay < 10) ) {
6594 CHK("USLEEP_RANGE",
6595 "usleep_range is preferred over udelay; see function description of usleep_range() and udelay().\n" . $herecurr);
6596 }
6597 if ($delay > 2000) {
6598 WARN("LONG_UDELAY",
6599 "long udelay - prefer mdelay; see function description of mdelay().\n" . $herecurr);
6600 }
6601 }
6602
6603# warn about unexpectedly long msleep's
6604 if ($line =~ /\bmsleep\s*\((\d+)\);/) {
6605 if ($1 < 20) {
6606 WARN("MSLEEP",
6607 "msleep < 20ms can sleep for up to 20ms; see function description of msleep().\n" . $herecurr);
6608 }
6609 }
6610
6611# check for comparisons of jiffies
6612 if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
6613 WARN("JIFFIES_COMPARISON",
6614 "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
6615 }
6616
6617# check for comparisons of get_jiffies_64()
6618 if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
6619 WARN("JIFFIES_COMPARISON",
6620 "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
6621 }
6622
6623# warn about #ifdefs in C files
6624# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
6625# print "#ifdef in C files should be avoided\n";
6626# print "$herecurr";
6627# $clean = 0;
6628# }
6629
6630# warn about spacing in #ifdefs
6631 if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
6632 if (ERROR("SPACING",
6633 "exactly one space required after that #$1\n" . $herecurr) &&
6634 $fix) {
6635 $fixed[$fixlinenr] =~
6636 s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
6637 }
6638
6639 }
6640
6641# check for spinlock_t definitions without a comment.
6642 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
6643 $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
6644 my $which = $1;
6645 if (!ctx_has_comment($first_line, $linenr)) {
6646 CHK("UNCOMMENTED_DEFINITION",
6647 "$1 definition without comment\n" . $herecurr);
6648 }
6649 }
6650# check for memory barriers without a comment.
6651
6652 my $barriers = qr{
6653 mb|
6654 rmb|
6655 wmb
6656 }x;
6657 my $barrier_stems = qr{
6658 mb__before_atomic|
6659 mb__after_atomic|
6660 store_release|
6661 load_acquire|
6662 store_mb|
6663 (?:$barriers)
6664 }x;
6665 my $all_barriers = qr{
6666 (?:$barriers)|
6667 smp_(?:$barrier_stems)|
6668 virt_(?:$barrier_stems)
6669 }x;
6670
6671 if ($line =~ /\b(?:$all_barriers)\s*\(/) {
6672 if (!ctx_has_comment($first_line, $linenr)) {
6673 WARN("MEMORY_BARRIER",
6674 "memory barrier without comment\n" . $herecurr);
6675 }
6676 }
6677
6678 my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x;
6679
6680 if ($realfile !~ m@^include/asm-generic/@ &&
6681 $realfile !~ m@/barrier\.h$@ &&
6682 $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ &&
6683 $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) {
6684 WARN("MEMORY_BARRIER",
6685 "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr);
6686 }
6687
6688# check for waitqueue_active without a comment.
6689 if ($line =~ /\bwaitqueue_active\s*\(/) {
6690 if (!ctx_has_comment($first_line, $linenr)) {
6691 WARN("WAITQUEUE_ACTIVE",
6692 "waitqueue_active without comment\n" . $herecurr);
6693 }
6694 }
6695
6696# check for data_race without a comment.
6697 if ($line =~ /\bdata_race\s*\(/) {
6698 if (!ctx_has_comment($first_line, $linenr)) {
6699 WARN("DATA_RACE",
6700 "data_race without comment\n" . $herecurr);
6701 }
6702 }
6703
6704# check of hardware specific defines
6705 if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
6706 CHK("ARCH_DEFINES",
6707 "architecture specific defines should be avoided\n" . $herecurr);
6708 }
6709
6710# check that the storage class is not after a type
6711 if ($line =~ /\b($Type)\s+($Storage)\b/) {
6712 WARN("STORAGE_CLASS",
6713 "storage class '$2' should be located before type '$1'\n" . $herecurr);
6714 }
6715# Check that the storage class is at the beginning of a declaration
6716 if ($line =~ /\b$Storage\b/ &&
6717 $line !~ /^.\s*$Storage/ &&
6718 $line =~ /^.\s*(.+?)\$Storage\s/ &&
6719 $1 !~ /[\,\)]\s*$/) {
6720 WARN("STORAGE_CLASS",
6721 "storage class should be at the beginning of the declaration\n" . $herecurr);
6722 }
6723
6724# check the location of the inline attribute, that it is between
6725# storage class and type.
6726 if ($line =~ /\b$Type\s+$Inline\b/ ||
6727 $line =~ /\b$Inline\s+$Storage\b/) {
6728 ERROR("INLINE_LOCATION",
6729 "inline keyword should sit between storage class and type\n" . $herecurr);
6730 }
6731
6732# Check for __inline__ and __inline, prefer inline
6733 if ($realfile !~ m@\binclude/uapi/@ &&
6734 $line =~ /\b(__inline__|__inline)\b/) {
6735 if (WARN("INLINE",
6736 "plain inline is preferred over $1\n" . $herecurr) &&
6737 $fix) {
6738 $fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
6739
6740 }
6741 }
6742
6743# Check for compiler attributes
6744 if ($realfile !~ m@\binclude/uapi/@ &&
6745 $rawline =~ /\b__attribute__\s*\(\s*($balanced_parens)\s*\)/) {
6746 my $attr = $1;
6747 $attr =~ s/\s*\(\s*(.*)\)\s*/$1/;
6748
6749 my %attr_list = (
6750 "alias" => "__alias",
6751 "aligned" => "__aligned",
6752 "always_inline" => "__always_inline",
6753 "assume_aligned" => "__assume_aligned",
6754 "cold" => "__cold",
6755 "const" => "__attribute_const__",
6756 "copy" => "__copy",
6757 "designated_init" => "__designated_init",
6758 "externally_visible" => "__visible",
6759 "format" => "printf|scanf",
6760 "gnu_inline" => "__gnu_inline",
6761 "malloc" => "__malloc",
6762 "mode" => "__mode",
6763 "no_caller_saved_registers" => "__no_caller_saved_registers",
6764 "noclone" => "__noclone",
6765 "noinline" => "noinline",
6766 "nonstring" => "__nonstring",
6767 "noreturn" => "__noreturn",
6768 "packed" => "__packed",
6769 "pure" => "__pure",
6770 "section" => "__section",
6771 "used" => "__used",
6772 "weak" => "__weak"
6773 );
6774
6775 while ($attr =~ /\s*(\w+)\s*(${balanced_parens})?/g) {
6776 my $orig_attr = $1;
6777 my $params = '';
6778 $params = $2 if defined($2);
6779 my $curr_attr = $orig_attr;
6780 $curr_attr =~ s/^[\s_]+|[\s_]+$//g;
6781 if (exists($attr_list{$curr_attr})) {
6782 my $new = $attr_list{$curr_attr};
6783 if ($curr_attr eq "format" && $params) {
6784 $params =~ /^\s*\(\s*(\w+)\s*,\s*(.*)/;
6785 $new = "__$1\($2";
6786 } else {
6787 $new = "$new$params";
6788 }
6789 if (WARN("PREFER_DEFINED_ATTRIBUTE_MACRO",
6790 "Prefer $new over __attribute__(($orig_attr$params))\n" . $herecurr) &&
6791 $fix) {
6792 my $remove = "\Q$orig_attr\E" . '\s*' . "\Q$params\E" . '(?:\s*,\s*)?';
6793 $fixed[$fixlinenr] =~ s/$remove//;
6794 $fixed[$fixlinenr] =~ s/\b__attribute__/$new __attribute__/;
6795 $fixed[$fixlinenr] =~ s/\}\Q$new\E/} $new/;
6796 $fixed[$fixlinenr] =~ s/ __attribute__\s*\(\s*\(\s*\)\s*\)//;
6797 }
6798 }
6799 }
6800
6801 # Check for __attribute__ unused, prefer __always_unused or __maybe_unused
6802 if ($attr =~ /^_*unused/) {
6803 WARN("PREFER_DEFINED_ATTRIBUTE_MACRO",
6804 "__always_unused or __maybe_unused is preferred over __attribute__((__unused__))\n" . $herecurr);
6805 }
6806 }
6807
6808# Check for __attribute__ weak, or __weak declarations (may have link issues)
6809 if ($perl_version_ok &&
6810 $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ &&
6811 ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ ||
6812 $line =~ /\b__weak\b/)) {
6813 ERROR("WEAK_DECLARATION",
6814 "Using weak declarations can have unintended link defects\n" . $herecurr);
6815 }
6816
6817# check for c99 types like uint8_t used outside of uapi/ and tools/
6818 if ($realfile !~ m@\binclude/uapi/@ &&
6819 $realfile !~ m@\btools/@ &&
6820 $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) {
6821 my $type = $1;
6822 if ($type =~ /\b($typeC99Typedefs)\b/) {
6823 $type = $1;
6824 my $kernel_type = 'u';
6825 $kernel_type = 's' if ($type =~ /^_*[si]/);
6826 $type =~ /(\d+)/;
6827 $kernel_type .= $1;
6828 if (CHK("PREFER_KERNEL_TYPES",
6829 "Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) &&
6830 $fix) {
6831 $fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/;
6832 }
6833 }
6834 }
6835
6836# check for cast of C90 native int or longer types constants
6837 if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) {
6838 my $cast = $1;
6839 my $const = $2;
6840 my $suffix = "";
6841 my $newconst = $const;
6842 $newconst =~ s/${Int_type}$//;
6843 $suffix .= 'U' if ($cast =~ /\bunsigned\b/);
6844 if ($cast =~ /\blong\s+long\b/) {
6845 $suffix .= 'LL';
6846 } elsif ($cast =~ /\blong\b/) {
6847 $suffix .= 'L';
6848 }
6849 if (WARN("TYPECAST_INT_CONSTANT",
6850 "Unnecessary typecast of c90 int constant - '$cast$const' could be '$const$suffix'\n" . $herecurr) &&
6851 $fix) {
6852 $fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/;
6853 }
6854 }
6855
6856# check for sizeof(&)
6857 if ($line =~ /\bsizeof\s*\(\s*\&/) {
6858 WARN("SIZEOF_ADDRESS",
6859 "sizeof(& should be avoided\n" . $herecurr);
6860 }
6861
6862# check for sizeof without parenthesis
6863 if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
6864 if (WARN("SIZEOF_PARENTHESIS",
6865 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
6866 $fix) {
6867 $fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
6868 }
6869 }
6870
6871# check for struct spinlock declarations
6872 if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
6873 WARN("USE_SPINLOCK_T",
6874 "struct spinlock should be spinlock_t\n" . $herecurr);
6875 }
6876
6877# check for seq_printf uses that could be seq_puts
6878 if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
6879 my $fmt = get_quoted_string($line, $rawline);
6880 $fmt =~ s/%%//g;
6881 if ($fmt !~ /%/) {
6882 if (WARN("PREFER_SEQ_PUTS",
6883 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
6884 $fix) {
6885 $fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
6886 }
6887 }
6888 }
6889
6890# check for vsprintf extension %p<foo> misuses
6891 if ($perl_version_ok &&
6892 defined $stat &&
6893 $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
6894 $1 !~ /^_*volatile_*$/) {
6895 my $stat_real;
6896
6897 my $lc = $stat =~ tr@\n@@;
6898 $lc = $lc + $linenr;
6899 for (my $count = $linenr; $count <= $lc; $count++) {
6900 my $specifier;
6901 my $extension;
6902 my $qualifier;
6903 my $bad_specifier = "";
6904 my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
6905 $fmt =~ s/%%//g;
6906
6907 while ($fmt =~ /(\%[\*\d\.]*p(\w)(\w*))/g) {
6908 $specifier = $1;
6909 $extension = $2;
6910 $qualifier = $3;
6911 if ($extension !~ /[4SsBKRraEehMmIiUDdgVCbGNOxtf]/ ||
6912 ($extension eq "f" &&
6913 defined $qualifier && $qualifier !~ /^w/) ||
6914 ($extension eq "4" &&
6915 defined $qualifier && $qualifier !~ /^cc/)) {
6916 $bad_specifier = $specifier;
6917 last;
6918 }
6919 if ($extension eq "x" && !defined($stat_real)) {
6920 if (!defined($stat_real)) {
6921 $stat_real = get_stat_real($linenr, $lc);
6922 }
6923 WARN("VSPRINTF_SPECIFIER_PX",
6924 "Using vsprintf specifier '\%px' potentially exposes the kernel memory layout, if you don't really need the address please consider using '\%p'.\n" . "$here\n$stat_real\n");
6925 }
6926 }
6927 if ($bad_specifier ne "") {
6928 my $stat_real = get_stat_real($linenr, $lc);
6929 my $msg_level = \&WARN;
6930 my $ext_type = "Invalid";
6931 my $use = "";
6932 if ($bad_specifier =~ /p[Ff]/) {
6933 $use = " - use %pS instead";
6934 $use =~ s/pS/ps/ if ($bad_specifier =~ /pf/);
6935 } elsif ($bad_specifier =~ /pA/) {
6936 $use = " - '%pA' is only intended to be used from Rust code";
6937 $msg_level = \&ERROR;
6938 }
6939
6940 &{$msg_level}("VSPRINTF_POINTER_EXTENSION",
6941 "$ext_type vsprintf pointer extension '$bad_specifier'$use\n" . "$here\n$stat_real\n");
6942 }
6943 }
6944 }
6945
6946# Check for misused memsets
6947 if ($perl_version_ok &&
6948 defined $stat &&
6949 $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
6950
6951 my $ms_addr = $2;
6952 my $ms_val = $7;
6953 my $ms_size = $12;
6954
6955 if ($ms_size =~ /^(0x|)0$/i) {
6956 ERROR("MEMSET",
6957 "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
6958 } elsif ($ms_size =~ /^(0x|)1$/i) {
6959 WARN("MEMSET",
6960 "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
6961 }
6962 }
6963
6964# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
6965# if ($perl_version_ok &&
6966# defined $stat &&
6967# $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
6968# if (WARN("PREFER_ETHER_ADDR_COPY",
6969# "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") &&
6970# $fix) {
6971# $fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
6972# }
6973# }
6974
6975# Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
6976# if ($perl_version_ok &&
6977# defined $stat &&
6978# $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
6979# WARN("PREFER_ETHER_ADDR_EQUAL",
6980# "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n")
6981# }
6982
6983# check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr
6984# check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr
6985# if ($perl_version_ok &&
6986# defined $stat &&
6987# $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
6988#
6989# my $ms_val = $7;
6990#
6991# if ($ms_val =~ /^(?:0x|)0+$/i) {
6992# if (WARN("PREFER_ETH_ZERO_ADDR",
6993# "Prefer eth_zero_addr over memset()\n" . "$here\n$stat\n") &&
6994# $fix) {
6995# $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/;
6996# }
6997# } elsif ($ms_val =~ /^(?:0xff|255)$/i) {
6998# if (WARN("PREFER_ETH_BROADCAST_ADDR",
6999# "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") &&
7000# $fix) {
7001# $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/;
7002# }
7003# }
7004# }
7005
7006# strcpy uses that should likely be strscpy
7007 if ($line =~ /\bstrcpy\s*\(/) {
7008 WARN("STRCPY",
7009 "Prefer strscpy over strcpy - see: https://github.com/KSPP/linux/issues/88\n" . $herecurr);
7010 }
7011
7012# strlcpy uses that should likely be strscpy
7013 if ($line =~ /\bstrlcpy\s*\(/) {
7014 WARN("STRLCPY",
7015 "Prefer strscpy over strlcpy - see: https://github.com/KSPP/linux/issues/89\n" . $herecurr);
7016 }
7017
7018# strncpy uses that should likely be strscpy or strscpy_pad
7019 if ($line =~ /\bstrncpy\s*\(/) {
7020 WARN("STRNCPY",
7021 "Prefer strscpy, strscpy_pad, or __nonstring over strncpy - see: https://github.com/KSPP/linux/issues/90\n" . $herecurr);
7022 }
7023
7024# ethtool_sprintf uses that should likely be ethtool_puts
7025 if ($line =~ /\bethtool_sprintf\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
7026 if (WARN("PREFER_ETHTOOL_PUTS",
7027 "Prefer ethtool_puts over ethtool_sprintf with only two arguments\n" . $herecurr) &&
7028 $fix) {
7029 $fixed[$fixlinenr] =~ s/\bethtool_sprintf\s*\(\s*($FuncArg)\s*,\s*($FuncArg)/ethtool_puts($1, $7)/;
7030 }
7031 }
7032
7033 # use $rawline because $line loses %s via sanitization and thus we can't match against it.
7034 if ($rawline =~ /\bethtool_sprintf\s*\(\s*$FuncArg\s*,\s*\"\%s\"\s*,\s*$FuncArg\s*\)/) {
7035 if (WARN("PREFER_ETHTOOL_PUTS",
7036 "Prefer ethtool_puts over ethtool_sprintf with standalone \"%s\" specifier\n" . $herecurr) &&
7037 $fix) {
7038 $fixed[$fixlinenr] =~ s/\bethtool_sprintf\s*\(\s*($FuncArg)\s*,\s*"\%s"\s*,\s*($FuncArg)/ethtool_puts($1, $7)/;
7039 }
7040 }
7041
7042
7043# typecasts on min/max could be min_t/max_t
7044 if ($perl_version_ok &&
7045 defined $stat &&
7046 $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
7047 if (defined $2 || defined $7) {
7048 my $call = $1;
7049 my $cast1 = deparenthesize($2);
7050 my $arg1 = $3;
7051 my $cast2 = deparenthesize($7);
7052 my $arg2 = $8;
7053 my $cast;
7054
7055 if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
7056 $cast = "$cast1 or $cast2";
7057 } elsif ($cast1 ne "") {
7058 $cast = $cast1;
7059 } else {
7060 $cast = $cast2;
7061 }
7062 WARN("MINMAX",
7063 "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
7064 }
7065 }
7066
7067# check usleep_range arguments
7068 if ($perl_version_ok &&
7069 defined $stat &&
7070 $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
7071 my $min = $1;
7072 my $max = $7;
7073 if ($min eq $max) {
7074 WARN("USLEEP_RANGE",
7075 "usleep_range should not use min == max args; see function description of usleep_range().\n" . "$here\n$stat\n");
7076 } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
7077 $min > $max) {
7078 WARN("USLEEP_RANGE",
7079 "usleep_range args reversed, use min then max; see function description of usleep_range().\n" . "$here\n$stat\n");
7080 }
7081 }
7082
7083# check for naked sscanf
7084 if ($perl_version_ok &&
7085 defined $stat &&
7086 $line =~ /\bsscanf\b/ &&
7087 ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
7088 $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
7089 $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
7090 my $lc = $stat =~ tr@\n@@;
7091 $lc = $lc + $linenr;
7092 my $stat_real = get_stat_real($linenr, $lc);
7093 WARN("NAKED_SSCANF",
7094 "unchecked sscanf return value\n" . "$here\n$stat_real\n");
7095 }
7096
7097# check for simple sscanf that should be kstrto<foo>
7098 if ($perl_version_ok &&
7099 defined $stat &&
7100 $line =~ /\bsscanf\b/) {
7101 my $lc = $stat =~ tr@\n@@;
7102 $lc = $lc + $linenr;
7103 my $stat_real = get_stat_real($linenr, $lc);
7104 if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
7105 my $format = $6;
7106 my $count = $format =~ tr@%@%@;
7107 if ($count == 1 &&
7108 $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
7109 WARN("SSCANF_TO_KSTRTO",
7110 "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
7111 }
7112 }
7113 }
7114
7115# check for new externs in .h files.
7116 if ($realfile =~ /\.h$/ &&
7117 $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
7118 if (CHK("AVOID_EXTERNS",
7119 "extern prototypes should be avoided in .h files\n" . $herecurr) &&
7120 $fix) {
7121 $fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
7122 }
7123 }
7124
7125# check for new externs in .c files.
7126 if ($realfile =~ /\.c$/ && defined $stat &&
7127 $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
7128 {
7129 my $function_name = $1;
7130 my $paren_space = $2;
7131
7132 my $s = $stat;
7133 if (defined $cond) {
7134 substr($s, 0, length($cond), '');
7135 }
7136 if ($s =~ /^\s*;/)
7137 {
7138 WARN("AVOID_EXTERNS",
7139 "externs should be avoided in .c files\n" . $herecurr);
7140 }
7141
7142 if ($paren_space =~ /\n/) {
7143 WARN("FUNCTION_ARGUMENTS",
7144 "arguments for function declarations should follow identifier\n" . $herecurr);
7145 }
7146
7147 } elsif ($realfile =~ /\.c$/ && defined $stat &&
7148 $stat =~ /^\+extern struct\s+(\w+)\s+(\w+)\[\];/)
7149 {
7150 my ($st_type, $st_name) = ($1, $2);
7151
7152 for my $s (keys %maybe_linker_symbol) {
7153 #print "Linker symbol? $st_name : $s\n";
7154 goto LIKELY_LINKER_SYMBOL
7155 if $st_name =~ /$s/;
7156 }
7157 WARN("AVOID_EXTERNS",
7158 "found a file-scoped extern type:$st_type name:$st_name in .c file\n"
7159 . "is this a linker symbol ?\n" . $herecurr);
7160 LIKELY_LINKER_SYMBOL:
7161
7162 } elsif ($realfile =~ /\.c$/ && defined $stat &&
7163 $stat =~ /^.\s*extern\s+/)
7164 {
7165 WARN("AVOID_EXTERNS",
7166 "externs should be avoided in .c files\n" . $herecurr);
7167 }
7168
7169# check for function declarations that have arguments without identifier names
7170 if (defined $stat &&
7171 $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
7172 $1 ne "void") {
7173 my $args = trim($1);
7174 while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
7175 my $arg = trim($1);
7176 if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
7177 WARN("FUNCTION_ARGUMENTS",
7178 "function definition argument '$arg' should also have an identifier name\n" . $herecurr);
7179 }
7180 }
7181 }
7182
7183# check for function definitions
7184 if ($perl_version_ok &&
7185 defined $stat &&
7186 $stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) {
7187 $context_function = $1;
7188
7189# check for multiline function definition with misplaced open brace
7190 my $ok = 0;
7191 my $cnt = statement_rawlines($stat);
7192 my $herectx = $here . "\n";
7193 for (my $n = 0; $n < $cnt; $n++) {
7194 my $rl = raw_line($linenr, $n);
7195 $herectx .= $rl . "\n";
7196 $ok = 1 if ($rl =~ /^[ \+]\{/);
7197 $ok = 1 if ($rl =~ /\{/ && $n == 0);
7198 last if $rl =~ /^[ \+].*\{/;
7199 }
7200 if (!$ok) {
7201 ERROR("OPEN_BRACE",
7202 "open brace '{' following function definitions go on the next line\n" . $herectx);
7203 }
7204 }
7205
7206# checks for new __setup's
7207 if ($rawline =~ /\b__setup\("([^"]*)"/) {
7208 my $name = $1;
7209
7210 if (!grep(/$name/, @setup_docs)) {
7211 CHK("UNDOCUMENTED_SETUP",
7212 "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.txt\n" . $herecurr);
7213 }
7214 }
7215
7216# check for pointless casting of alloc functions
7217 if ($line =~ /\*\s*\)\s*$allocFunctions\b/) {
7218 WARN("UNNECESSARY_CASTS",
7219 "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
7220 }
7221
7222# alloc style
7223# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
7224 if ($perl_version_ok &&
7225 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k|v)[mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
7226 CHK("ALLOC_SIZEOF_STRUCT",
7227 "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
7228 }
7229
7230# check for (kv|k)[mz]alloc with multiplies that could be kmalloc_array/kvmalloc_array/kvcalloc/kcalloc
7231 if ($perl_version_ok &&
7232 defined $stat &&
7233 $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k)[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
7234 my $oldfunc = $3;
7235 my $a1 = $4;
7236 my $a2 = $10;
7237 my $newfunc = "kmalloc_array";
7238 $newfunc = "kvmalloc_array" if ($oldfunc eq "kvmalloc");
7239 $newfunc = "kvcalloc" if ($oldfunc eq "kvzalloc");
7240 $newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
7241 my $r1 = $a1;
7242 my $r2 = $a2;
7243 if ($a1 =~ /^sizeof\s*\S/) {
7244 $r1 = $a2;
7245 $r2 = $a1;
7246 }
7247 if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
7248 !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
7249 my $cnt = statement_rawlines($stat);
7250 my $herectx = get_stat_here($linenr, $cnt, $here);
7251
7252 if (WARN("ALLOC_WITH_MULTIPLY",
7253 "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&
7254 $cnt == 1 &&
7255 $fix) {
7256 $fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k)[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
7257 }
7258 }
7259 }
7260
7261# check for krealloc arg reuse
7262 if ($perl_version_ok &&
7263 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*($Lval)\s*,/ &&
7264 $1 eq $3) {
7265 WARN("KREALLOC_ARG_REUSE",
7266 "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
7267 }
7268
7269# check for alloc argument mismatch
7270 if ($line =~ /\b((?:devm_)?((?:k|kv)?(calloc|malloc_array)(?:_node)?))\s*\(\s*sizeof\b/) {
7271 WARN("ALLOC_ARRAY_ARGS",
7272 "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
7273 }
7274
7275# check for multiple semicolons
7276 if ($line =~ /;\s*;\s*$/) {
7277 if (WARN("ONE_SEMICOLON",
7278 "Statements terminations use 1 semicolon\n" . $herecurr) &&
7279 $fix) {
7280 $fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
7281 }
7282 }
7283
7284# check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi
7285 if ($realfile !~ m@^include/uapi/@ &&
7286 $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
7287 my $ull = "";
7288 $ull = "_ULL" if (defined($1) && $1 =~ /ll/i);
7289 if (CHK("BIT_MACRO",
7290 "Prefer using the BIT$ull macro\n" . $herecurr) &&
7291 $fix) {
7292 $fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/;
7293 }
7294 }
7295
7296# check for IS_ENABLED() without CONFIG_<FOO> ($rawline for comments too)
7297 if ($rawline =~ /\bIS_ENABLED\s*\(\s*(\w+)\s*\)/ && $1 !~ /^${CONFIG_}/) {
7298 WARN("IS_ENABLED_CONFIG",
7299 "IS_ENABLED($1) is normally used as IS_ENABLED(${CONFIG_}$1)\n" . $herecurr);
7300 }
7301
7302# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
7303 if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(${CONFIG_}[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
7304 my $config = $1;
7305 if (WARN("PREFER_IS_ENABLED",
7306 "Prefer IS_ENABLED(<FOO>) to ${CONFIG_}<FOO> || ${CONFIG_}<FOO>_MODULE\n" . $herecurr) &&
7307 $fix) {
7308 $fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
7309 }
7310 }
7311
7312# check for /* fallthrough */ like comment, prefer fallthrough;
7313 my @fallthroughs = (
7314 'fallthrough',
7315 '@fallthrough@',
7316 'lint -fallthrough[ \t]*',
7317 'intentional(?:ly)?[ \t]*fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)',
7318 '(?:else,?\s*)?FALL(?:S | |-)?THR(?:OUGH|U|EW)[ \t.!]*(?:-[^\n\r]*)?',
7319 'Fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)[ \t.!]*(?:-[^\n\r]*)?',
7320 'fall(?:s | |-)?thr(?:ough|u|ew)[ \t.!]*(?:-[^\n\r]*)?',
7321 );
7322 if ($raw_comment ne '') {
7323 foreach my $ft (@fallthroughs) {
7324 if ($raw_comment =~ /$ft/) {
7325 my $msg_level = \&WARN;
7326 $msg_level = \&CHK if ($file);
7327 &{$msg_level}("PREFER_FALLTHROUGH",
7328 "Prefer 'fallthrough;' over fallthrough comment\n" . $herecurr);
7329 last;
7330 }
7331 }
7332 }
7333
7334# check for switch/default statements without a break;
7335 if ($perl_version_ok &&
7336 defined $stat &&
7337 $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
7338 my $cnt = statement_rawlines($stat);
7339 my $herectx = get_stat_here($linenr, $cnt, $here);
7340
7341 WARN("DEFAULT_NO_BREAK",
7342 "switch default: should use break\n" . $herectx);
7343 }
7344
7345# check for gcc specific __FUNCTION__
7346 if ($line =~ /\b__FUNCTION__\b/) {
7347 if (WARN("USE_FUNC",
7348 "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) &&
7349 $fix) {
7350 $fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
7351 }
7352 }
7353
7354# check for uses of __DATE__, __TIME__, __TIMESTAMP__
7355 while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) {
7356 ERROR("DATE_TIME",
7357 "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr);
7358 }
7359
7360# check for use of yield()
7361 if ($line =~ /\byield\s*\(\s*\)/) {
7362 WARN("YIELD",
7363 "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr);
7364 }
7365
7366# check for comparisons against true and false
7367 if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
7368 my $lead = $1;
7369 my $arg = $2;
7370 my $test = $3;
7371 my $otype = $4;
7372 my $trail = $5;
7373 my $op = "!";
7374
7375 ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
7376
7377 my $type = lc($otype);
7378 if ($type =~ /^(?:true|false)$/) {
7379 if (("$test" eq "==" && "$type" eq "true") ||
7380 ("$test" eq "!=" && "$type" eq "false")) {
7381 $op = "";
7382 }
7383
7384 CHK("BOOL_COMPARISON",
7385 "Using comparison to $otype is error prone\n" . $herecurr);
7386
7387## maybe suggesting a correct construct would better
7388## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
7389
7390 }
7391 }
7392
7393# check for semaphores initialized locked
7394 if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
7395 WARN("CONSIDER_COMPLETION",
7396 "consider using a completion\n" . $herecurr);
7397 }
7398
7399# recommend kstrto* over simple_strto* and strict_strto*
7400 if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
7401 WARN("CONSIDER_KSTRTO",
7402 "$1 is obsolete, use k$3 instead\n" . $herecurr);
7403 }
7404
7405# check for __initcall(), use device_initcall() explicitly or more appropriate function please
7406 if ($line =~ /^.\s*__initcall\s*\(/) {
7407 WARN("USE_DEVICE_INITCALL",
7408 "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
7409 }
7410
7411# check for spin_is_locked(), suggest lockdep instead
7412 if ($line =~ /\bspin_is_locked\(/) {
7413 WARN("USE_LOCKDEP",
7414 "Where possible, use lockdep_assert_held instead of assertions based on spin_is_locked\n" . $herecurr);
7415 }
7416
7417# check for deprecated apis
7418 if ($line =~ /\b($deprecated_apis_search)\b\s*\(/) {
7419 my $deprecated_api = $1;
7420 my $new_api = $deprecated_apis{$deprecated_api};
7421 WARN("DEPRECATED_API",
7422 "Deprecated use of '$deprecated_api', prefer '$new_api' instead\n" . $herecurr);
7423 }
7424
7425# check for various structs that are normally const (ops, kgdb, device_tree)
7426# and avoid what seem like struct definitions 'struct foo {'
7427 if (defined($const_structs) &&
7428 $line !~ /\bconst\b/ &&
7429 $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
7430 WARN("CONST_STRUCT",
7431 "struct $1 should normally be const\n" . $herecurr);
7432 }
7433
7434# use of NR_CPUS is usually wrong
7435# ignore definitions of NR_CPUS and usage to define arrays as likely right
7436# ignore designated initializers using NR_CPUS
7437 if ($line =~ /\bNR_CPUS\b/ &&
7438 $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
7439 $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
7440 $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
7441 $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
7442 $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/ &&
7443 $line !~ /^.\s*\.\w+\s*=\s*.*\bNR_CPUS\b/)
7444 {
7445 WARN("NR_CPUS",
7446 "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
7447 }
7448
7449# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
7450 if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
7451 ERROR("DEFINE_ARCH_HAS",
7452 "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
7453 }
7454
7455# likely/unlikely comparisons similar to "(likely(foo) > 0)"
7456 if ($perl_version_ok &&
7457 $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
7458 WARN("LIKELY_MISUSE",
7459 "Using $1 should generally have parentheses around the comparison\n" . $herecurr);
7460 }
7461
7462# return sysfs_emit(foo, fmt, ...) fmt without newline
7463 if ($line =~ /\breturn\s+sysfs_emit\s*\(\s*$FuncArg\s*,\s*($String)/ &&
7464 substr($rawline, $-[6], $+[6] - $-[6]) !~ /\\n"$/) {
7465 my $offset = $+[6] - 1;
7466 if (WARN("SYSFS_EMIT",
7467 "return sysfs_emit(...) formats should include a terminating newline\n" . $herecurr) &&
7468 $fix) {
7469 substr($fixed[$fixlinenr], $offset, 0) = '\\n';
7470 }
7471 }
7472
7473# check for array definition/declarations that should use flexible arrays instead
7474 if ($sline =~ /^[\+ ]\s*\}(?:\s*__packed)?\s*;\s*$/ &&
7475 $prevline =~ /^\+\s*(?:\}(?:\s*__packed\s*)?|$Type)\s*$Ident\s*\[\s*(0|1)\s*\]\s*;\s*$/) {
7476 if (ERROR("FLEXIBLE_ARRAY",
7477 "Use C99 flexible arrays - see https://docs.kernel.org/process/deprecated.html#zero-length-and-one-element-arrays\n" . $hereprev) &&
7478 $1 == '0' && $fix) {
7479 $fixed[$fixlinenr - 1] =~ s/\[\s*0\s*\]/[]/;
7480 }
7481 }
7482
7483# nested likely/unlikely calls
7484 if ($line =~ /\b(?:(?:un)?likely)\s*\(\s*!?\s*(IS_ERR(?:_OR_NULL|_VALUE)?|WARN)/) {
7485 WARN("LIKELY_MISUSE",
7486 "nested (un)?likely() calls, $1 already uses unlikely() internally\n" . $herecurr);
7487 }
7488
7489# whine mightly about in_atomic
7490 if ($line =~ /\bin_atomic\s*\(/) {
7491 if ($realfile =~ m@^drivers/@) {
7492 ERROR("IN_ATOMIC",
7493 "do not use in_atomic in drivers\n" . $herecurr);
7494 } elsif ($realfile !~ m@^kernel/@) {
7495 WARN("IN_ATOMIC",
7496 "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
7497 }
7498 }
7499
7500# Complain about RCU Tasks Trace used outside of BPF (and of course, RCU).
7501 our $rcu_trace_funcs = qr{(?x:
7502 rcu_read_lock_trace |
7503 rcu_read_lock_trace_held |
7504 rcu_read_unlock_trace |
7505 call_rcu_tasks_trace |
7506 synchronize_rcu_tasks_trace |
7507 rcu_barrier_tasks_trace |
7508 rcu_request_urgent_qs_task
7509 )};
7510 our $rcu_trace_paths = qr{(?x:
7511 kernel/bpf/ |
7512 include/linux/bpf |
7513 net/bpf/ |
7514 kernel/rcu/ |
7515 include/linux/rcu
7516 )};
7517 if ($line =~ /\b($rcu_trace_funcs)\s*\(/) {
7518 if ($realfile !~ m{^$rcu_trace_paths}) {
7519 WARN("RCU_TASKS_TRACE",
7520 "use of RCU tasks trace is incorrect outside BPF or core RCU code\n" . $herecurr);
7521 }
7522 }
7523
7524# check for lockdep_set_novalidate_class
7525 if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
7526 $line =~ /__lockdep_no_validate__\s*\)/ ) {
7527 if ($realfile !~ m@^kernel/lockdep@ &&
7528 $realfile !~ m@^include/linux/lockdep@ &&
7529 $realfile !~ m@^drivers/base/core@) {
7530 ERROR("LOCKDEP",
7531 "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
7532 }
7533 }
7534
7535 if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ ||
7536 $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) {
7537 WARN("EXPORTED_WORLD_WRITABLE",
7538 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
7539 }
7540
7541# check for DEVICE_ATTR uses that could be DEVICE_ATTR_<FOO>
7542# and whether or not function naming is typical and if
7543# DEVICE_ATTR permissions uses are unusual too
7544 if ($perl_version_ok &&
7545 defined $stat &&
7546 $stat =~ /\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?\s*(\s*(?:${multi_mode_perms_string_search}|0[0-7]{3,3})\s*)\s*\)?\s*,\s*(\w+)\s*,\s*(\w+)\s*\)/) {
7547 my $var = $1;
7548 my $perms = $2;
7549 my $show = $3;
7550 my $store = $4;
7551 my $octal_perms = perms_to_octal($perms);
7552 if ($show =~ /^${var}_show$/ &&
7553 $store =~ /^${var}_store$/ &&
7554 $octal_perms eq "0644") {
7555 if (WARN("DEVICE_ATTR_RW",
7556 "Use DEVICE_ATTR_RW\n" . $herecurr) &&
7557 $fix) {
7558 $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/;
7559 }
7560 } elsif ($show =~ /^${var}_show$/ &&
7561 $store =~ /^NULL$/ &&
7562 $octal_perms eq "0444") {
7563 if (WARN("DEVICE_ATTR_RO",
7564 "Use DEVICE_ATTR_RO\n" . $herecurr) &&
7565 $fix) {
7566 $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/;
7567 }
7568 } elsif ($show =~ /^NULL$/ &&
7569 $store =~ /^${var}_store$/ &&
7570 $octal_perms eq "0200") {
7571 if (WARN("DEVICE_ATTR_WO",
7572 "Use DEVICE_ATTR_WO\n" . $herecurr) &&
7573 $fix) {
7574 $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/;
7575 }
7576 } elsif ($octal_perms eq "0644" ||
7577 $octal_perms eq "0444" ||
7578 $octal_perms eq "0200") {
7579 my $newshow = "$show";
7580 $newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show");
7581 my $newstore = $store;
7582 $newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store");
7583 my $rename = "";
7584 if ($show ne $newshow) {
7585 $rename .= " '$show' to '$newshow'";
7586 }
7587 if ($store ne $newstore) {
7588 $rename .= " '$store' to '$newstore'";
7589 }
7590 WARN("DEVICE_ATTR_FUNCTIONS",
7591 "Consider renaming function(s)$rename\n" . $herecurr);
7592 } else {
7593 WARN("DEVICE_ATTR_PERMS",
7594 "DEVICE_ATTR unusual permissions '$perms' used\n" . $herecurr);
7595 }
7596 }
7597
7598# Mode permission misuses where it seems decimal should be octal
7599# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
7600# o Ignore module_param*(...) uses with a decimal 0 permission as that has a
7601# specific definition of not visible in sysfs.
7602# o Ignore proc_create*(...) uses with a decimal 0 permission as that means
7603# use the default permissions
7604 if ($perl_version_ok &&
7605 defined $stat &&
7606 $line =~ /$mode_perms_search/) {
7607 foreach my $entry (@mode_permission_funcs) {
7608 my $func = $entry->[0];
7609 my $arg_pos = $entry->[1];
7610
7611 my $lc = $stat =~ tr@\n@@;
7612 $lc = $lc + $linenr;
7613 my $stat_real = get_stat_real($linenr, $lc);
7614
7615 my $skip_args = "";
7616 if ($arg_pos > 1) {
7617 $arg_pos--;
7618 $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
7619 }
7620 my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
7621 if ($stat =~ /$test/) {
7622 my $val = $1;
7623 $val = $6 if ($skip_args ne "");
7624 if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") &&
7625 (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
7626 ($val =~ /^$Octal$/ && length($val) ne 4))) {
7627 ERROR("NON_OCTAL_PERMISSIONS",
7628 "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real);
7629 }
7630 if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
7631 ERROR("EXPORTED_WORLD_WRITABLE",
7632 "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real);
7633 }
7634 }
7635 }
7636 }
7637
7638# check for uses of S_<PERMS> that could be octal for readability
7639 while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) {
7640 my $oval = $1;
7641 my $octal = perms_to_octal($oval);
7642 if (WARN("SYMBOLIC_PERMS",
7643 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) &&
7644 $fix) {
7645 $fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/;
7646 }
7647 }
7648
7649# validate content of MODULE_LICENSE against list from include/linux/module.h
7650 if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) {
7651 my $extracted_string = get_quoted_string($line, $rawline);
7652 my $valid_licenses = qr{
7653 GPL|
7654 GPL\ v2|
7655 GPL\ and\ additional\ rights|
7656 Dual\ BSD/GPL|
7657 Dual\ MIT/GPL|
7658 Dual\ MPL/GPL|
7659 Proprietary
7660 }x;
7661 if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) {
7662 WARN("MODULE_LICENSE",
7663 "unknown module license " . $extracted_string . "\n" . $herecurr);
7664 }
7665 if (!$file && $extracted_string eq '"GPL v2"') {
7666 if (WARN("MODULE_LICENSE",
7667 "Prefer \"GPL\" over \"GPL v2\" - see commit bf7fbeeae6db (\"module: Cure the MODULE_LICENSE \"GPL\" vs. \"GPL v2\" bogosity\")\n" . $herecurr) &&
7668 $fix) {
7669 $fixed[$fixlinenr] =~ s/\bMODULE_LICENSE\s*\(\s*"GPL v2"\s*\)/MODULE_LICENSE("GPL")/;
7670 }
7671 }
7672 }
7673
7674# check for sysctl duplicate constants
7675 if ($line =~ /\.extra[12]\s*=\s*&(zero|one|int_max)\b/) {
7676 WARN("DUPLICATED_SYSCTL_CONST",
7677 "duplicated sysctl range checking value '$1', consider using the shared one in include/linux/sysctl.h\n" . $herecurr);
7678 }
7679 }
7680
7681 # If we have no input at all, then there is nothing to report on
7682 # so just keep quiet.
7683 if ($#rawlines == -1) {
7684 exit(0);
7685 }
7686
7687 # In mailback mode only produce a report in the negative, for
7688 # things that appear to be patches.
7689 if ($mailback && ($clean == 1 || !$is_patch)) {
7690 exit(0);
7691 }
7692
7693 # This is not a patch, and we are in 'no-patch' mode so
7694 # just keep quiet.
7695 if (!$chk_patch && !$is_patch) {
7696 exit(0);
7697 }
7698
7699 if (!$is_patch && $filename !~ /cover-letter\.patch$/) {
7700 ERROR("NOT_UNIFIED_DIFF",
7701 "Does not appear to be a unified-diff format patch\n");
7702 }
7703 if ($is_patch && $has_commit_log && $chk_fixes_tag) {
7704 if ($needs_fixes_tag ne "" && !$is_revert && !$fixes_tag) {
7705 WARN("MISSING_FIXES_TAG",
7706 "The commit message has '$needs_fixes_tag', perhaps it also needs a 'Fixes:' tag?\n");
7707 }
7708 }
7709 if ($is_patch && $has_commit_log && $chk_signoff) {
7710 if ($signoff == 0) {
7711 ERROR("MISSING_SIGN_OFF",
7712 "Missing Signed-off-by: line(s)\n");
7713 } elsif ($authorsignoff != 1) {
7714 # authorsignoff values:
7715 # 0 -> missing sign off
7716 # 1 -> sign off identical
7717 # 2 -> names and addresses match, comments mismatch
7718 # 3 -> addresses match, names different
7719 # 4 -> names match, addresses different
7720 # 5 -> names match, addresses excluding subaddress details (refer RFC 5233) match
7721
7722 my $sob_msg = "'From: $author' != 'Signed-off-by: $author_sob'";
7723
7724 if ($authorsignoff == 0) {
7725 ERROR("NO_AUTHOR_SIGN_OFF",
7726 "Missing Signed-off-by: line by nominal patch author '$author'\n");
7727 } elsif ($authorsignoff == 2) {
7728 CHK("FROM_SIGN_OFF_MISMATCH",
7729 "From:/Signed-off-by: email comments mismatch: $sob_msg\n");
7730 } elsif ($authorsignoff == 3) {
7731 WARN("FROM_SIGN_OFF_MISMATCH",
7732 "From:/Signed-off-by: email name mismatch: $sob_msg\n");
7733 } elsif ($authorsignoff == 4) {
7734 WARN("FROM_SIGN_OFF_MISMATCH",
7735 "From:/Signed-off-by: email address mismatch: $sob_msg\n");
7736 } elsif ($authorsignoff == 5) {
7737 WARN("FROM_SIGN_OFF_MISMATCH",
7738 "From:/Signed-off-by: email subaddress mismatch: $sob_msg\n");
7739 }
7740 }
7741 }
7742
7743 print report_dump();
7744 if ($summary && !($clean == 1 && $quiet == 1)) {
7745 print "$filename " if ($summary_file);
7746 print "total: $cnt_error errors, $cnt_warn warnings, " .
7747 (($check)? "$cnt_chk checks, " : "") .
7748 "$cnt_lines lines checked\n";
7749 }
7750
7751 if ($quiet == 0) {
7752 # If there were any defects found and not already fixing them
7753 if (!$clean and !$fix) {
7754 print << "EOM"
7755
7756NOTE: For some of the reported defects, checkpatch may be able to
7757 mechanically convert to the typical style using --fix or --fix-inplace.
7758EOM
7759 }
7760 # If there were whitespace errors which cleanpatch can fix
7761 # then suggest that.
7762 if ($rpt_cleaners) {
7763 $rpt_cleaners = 0;
7764 print << "EOM"
7765
7766NOTE: Whitespace errors detected.
7767 You may wish to use scripts/cleanpatch or scripts/cleanfile
7768EOM
7769 }
7770 }
7771
7772 if ($clean == 0 && $fix &&
7773 ("@rawlines" ne "@fixed" ||
7774 $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
7775 my $newfile = $filename;
7776 $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
7777 my $linecount = 0;
7778 my $f;
7779
7780 @fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
7781
7782 open($f, '>', $newfile)
7783 or die "$P: Can't open $newfile for write\n";
7784 foreach my $fixed_line (@fixed) {
7785 $linecount++;
7786 if ($file) {
7787 if ($linecount > 3) {
7788 $fixed_line =~ s/^\+//;
7789 print $f $fixed_line . "\n";
7790 }
7791 } else {
7792 print $f $fixed_line . "\n";
7793 }
7794 }
7795 close($f);
7796
7797 if (!$quiet) {
7798 print << "EOM";
7799
7800Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
7801
7802Do _NOT_ trust the results written to this file.
7803Do _NOT_ submit these changes without inspecting them for correctness.
7804
7805This EXPERIMENTAL file is simply a convenience to help rewrite patches.
7806No warranties, expressed or implied...
7807EOM
7808 }
7809 }
7810
7811 if ($quiet == 0) {
7812 print "\n";
7813 if ($clean == 1) {
7814 print "$vname has no obvious style problems and is ready for submission.\n";
7815 } else {
7816 print "$vname has style problems, please review.\n";
7817 }
7818 }
7819 return $clean;
7820}