]> git.ipfire.org Git - people/ms/u-boot.git/blame - scripts/checkpatch.pl
cmd/bdinfo: extract print_std_bdinfo
[people/ms/u-boot.git] / scripts / checkpatch.pl
CommitLineData
05622191
JH
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;
6b9709d9 9use POSIX;
05622191
JH
10
11my $P = $0;
12$P =~ s@.*/@@g;
13
14my $V = '0.32';
15
16use Getopt::Long qw(:config no_auto_abbrev);
17
18my $quiet = 0;
19my $tree = 1;
20my $chk_signoff = 1;
21my $chk_patch = 1;
22my $tst_only;
23my $emacs = 0;
24my $terse = 0;
25my $file = 0;
26my $check = 0;
27my $summary = 1;
28my $mailback = 0;
29my $summary_file = 0;
30my $show_types = 0;
6b9709d9
TR
31my $fix = 0;
32my $fix_inplace = 0;
05622191
JH
33my $root;
34my %debug;
6b9709d9
TR
35my %camelcase = ();
36my %use_type = ();
37my @use = ();
05622191
JH
38my %ignore_type = ();
39my @ignore = ();
40my $help = 0;
41my $configuration_file = ".checkpatch.conf";
d45a6ae2 42my $max_line_length = 80;
6b9709d9
TR
43my $ignore_perl_version = 0;
44my $minimum_perl_version = 5.10.0;
05622191
JH
45
46sub help {
47 my ($exitcode) = @_;
48
49 print << "EOM";
50Usage: $P [OPTION]... [FILE]...
51Version: $V
52
53Options:
54 -q, --quiet quiet
55 --no-tree run without a kernel tree
56 --no-signoff do not check for 'Signed-off-by' line
57 --patch treat FILE as patchfile (default)
58 --emacs emacs compile window format
59 --terse one line per report
60 -f, --file treat FILE as regular source file
61 --subjective, --strict enable more subjective tests
6b9709d9 62 --types TYPE(,TYPE2...) show only these comma separated message types
05622191 63 --ignore TYPE(,TYPE2...) ignore various comma separated message types
d45a6ae2 64 --max-line-length=n set the maximum line length, if exceeded, warn
05622191
JH
65 --show-types show the message "types" in the output
66 --root=PATH PATH to the kernel tree root
67 --no-summary suppress the per-file summary
68 --mailback only produce a report in case of warnings/errors
69 --summary-file include the filename in summary
70 --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of
71 'values', 'possible', 'type', and 'attr' (default
72 is all off)
73 --test-only=WORD report only warnings/errors containing WORD
74 literally
6b9709d9
TR
75 --fix EXPERIMENTAL - may create horrible results
76 If correctable single-line errors exist, create
77 "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
78 with potential errors corrected to the preferred
79 checkpatch style
80 --fix-inplace EXPERIMENTAL - may create horrible results
81 Is the same as --fix, but overwrites the input
82 file. It's your fault if there's no backup or git
83 --ignore-perl-version override checking of perl version. expect
84 runtime errors.
05622191
JH
85 -h, --help, --version display this help and exit
86
87When FILE is - read standard input.
88EOM
89
90 exit($exitcode);
91}
92
93my $conf = which_conf($configuration_file);
94if (-f $conf) {
95 my @conf_args;
96 open(my $conffile, '<', "$conf")
97 or warn "$P: Can't find a readable $configuration_file file $!\n";
98
99 while (<$conffile>) {
100 my $line = $_;
101
102 $line =~ s/\s*\n?$//g;
103 $line =~ s/^\s*//g;
104 $line =~ s/\s+/ /g;
105
106 next if ($line =~ m/^\s*#/);
107 next if ($line =~ m/^\s*$/);
108
109 my @words = split(" ", $line);
110 foreach my $word (@words) {
111 last if ($word =~ m/^#/);
112 push (@conf_args, $word);
113 }
114 }
115 close($conffile);
116 unshift(@ARGV, @conf_args) if @conf_args;
117}
118
119GetOptions(
120 'q|quiet+' => \$quiet,
121 'tree!' => \$tree,
122 'signoff!' => \$chk_signoff,
123 'patch!' => \$chk_patch,
124 'emacs!' => \$emacs,
125 'terse!' => \$terse,
126 'f|file!' => \$file,
127 'subjective!' => \$check,
128 'strict!' => \$check,
129 'ignore=s' => \@ignore,
6b9709d9 130 'types=s' => \@use,
05622191 131 'show-types!' => \$show_types,
d45a6ae2 132 'max-line-length=i' => \$max_line_length,
05622191
JH
133 'root=s' => \$root,
134 'summary!' => \$summary,
135 'mailback!' => \$mailback,
136 'summary-file!' => \$summary_file,
6b9709d9
TR
137 'fix!' => \$fix,
138 'fix-inplace!' => \$fix_inplace,
139 'ignore-perl-version!' => \$ignore_perl_version,
05622191
JH
140 'debug=s' => \%debug,
141 'test-only=s' => \$tst_only,
142 'h|help' => \$help,
143 'version' => \$help
144) or help(1);
145
146help(0) if ($help);
147
6b9709d9
TR
148$fix = 1 if ($fix_inplace);
149
05622191
JH
150my $exit = 0;
151
6b9709d9
TR
152if ($^V && $^V lt $minimum_perl_version) {
153 printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
154 if (!$ignore_perl_version) {
155 exit(1);
156 }
157}
158
05622191
JH
159if ($#ARGV < 0) {
160 print "$P: no input files\n";
161 exit(1);
162}
163
6b9709d9
TR
164sub hash_save_array_words {
165 my ($hashRef, $arrayRef) = @_;
05622191 166
6b9709d9
TR
167 my @array = split(/,/, join(',', @$arrayRef));
168 foreach my $word (@array) {
169 $word =~ s/\s*\n?$//g;
170 $word =~ s/^\s*//g;
171 $word =~ s/\s+/ /g;
172 $word =~ tr/[a-z]/[A-Z]/;
05622191 173
6b9709d9
TR
174 next if ($word =~ m/^\s*#/);
175 next if ($word =~ m/^\s*$/);
176
177 $hashRef->{$word}++;
178 }
05622191
JH
179}
180
6b9709d9
TR
181sub hash_show_words {
182 my ($hashRef, $prefix) = @_;
183
184 if ($quiet == 0 && keys %$hashRef) {
185 print "NOTE: $prefix message types:";
186 foreach my $word (sort keys %$hashRef) {
187 print " $word";
188 }
189 print "\n\n";
190 }
191}
192
193hash_save_array_words(\%ignore_type, \@ignore);
194hash_save_array_words(\%use_type, \@use);
195
05622191
JH
196my $dbg_values = 0;
197my $dbg_possible = 0;
198my $dbg_type = 0;
199my $dbg_attr = 0;
200for my $key (keys %debug) {
201 ## no critic
202 eval "\${dbg_$key} = '$debug{$key}';";
203 die "$@" if ($@);
204}
205
206my $rpt_cleaners = 0;
207
208if ($terse) {
209 $emacs = 1;
210 $quiet++;
211}
212
213if ($tree) {
214 if (defined $root) {
215 if (!top_of_kernel_tree($root)) {
216 die "$P: $root: --root does not point at a valid tree\n";
217 }
218 } else {
219 if (top_of_kernel_tree('.')) {
220 $root = '.';
221 } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
222 top_of_kernel_tree($1)) {
223 $root = $1;
224 }
225 }
226
227 if (!defined $root) {
228 print "Must be run from the top-level dir. of a kernel tree\n";
229 exit(2);
230 }
231}
232
233my $emitted_corrupt = 0;
234
235our $Ident = qr{
236 [A-Za-z_][A-Za-z\d_]*
237 (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
238 }x;
239our $Storage = qr{extern|static|asmlinkage};
240our $Sparse = qr{
241 __user|
242 __kernel|
243 __force|
244 __iomem|
245 __must_check|
246 __init_refok|
247 __kprobes|
248 __ref|
249 __rcu
250 }x;
6b9709d9
TR
251our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
252our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
253our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
254our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
255our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
05622191
JH
256
257# Notes to $Attribute:
258# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
259our $Attribute = qr{
260 const|
261 __percpu|
262 __nocast|
263 __safe|
264 __bitwise__|
265 __packed__|
266 __packed2__|
267 __naked|
268 __maybe_unused|
269 __always_unused|
270 __noreturn|
271 __used|
272 __cold|
273 __noclone|
274 __deprecated|
275 __read_mostly|
276 __kprobes|
6b9709d9 277 $InitAttribute|
05622191
JH
278 ____cacheline_aligned|
279 ____cacheline_aligned_in_smp|
280 ____cacheline_internodealigned_in_smp|
281 __weak
282 }x;
283our $Modifier;
284our $Inline = qr{inline|__always_inline|noinline};
285our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
286our $Lval = qr{$Ident(?:$Member)*};
287
6b9709d9
TR
288our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u};
289our $Binary = qr{(?i)0b[01]+$Int_type?};
290our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?};
291our $Int = qr{[0-9]+$Int_type?};
d45a6ae2
KP
292our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
293our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
294our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
295our $Float = qr{$Float_hex|$Float_dec|$Float_int};
6b9709d9 296our $Constant = qr{$Float|$Binary|$Hex|$Int};
d45a6ae2 297our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
05622191 298our $Compare = qr{<=|>=|==|!=|<|>};
6b9709d9 299our $Arithmetic = qr{\+|-|\*|\/|%};
05622191
JH
300our $Operators = qr{
301 <=|>=|==|!=|
302 =>|->|<<|>>|<|>|!|~|
6b9709d9 303 &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
05622191
JH
304 }x;
305
306our $NonptrType;
6b9709d9 307our $NonptrTypeWithAttr;
05622191
JH
308our $Type;
309our $Declare;
310
d45a6ae2
KP
311our $NON_ASCII_UTF8 = qr{
312 [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
05622191
JH
313 | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
314 | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
315 | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
316 | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
317 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
318 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
319}x;
320
d45a6ae2
KP
321our $UTF8 = qr{
322 [\x09\x0A\x0D\x20-\x7E] # ASCII
323 | $NON_ASCII_UTF8
324}x;
325
05622191
JH
326our $typeTypedefs = qr{(?x:
327 (?:__)?(?:u|s|be|le)(?:8|16|32|64)|
328 atomic_t
329)};
330
331our $logFunctions = qr{(?x:
332 printk(?:_ratelimited|_once|)|
6b9709d9 333 (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
05622191
JH
334 WARN(?:_RATELIMIT|_ONCE|)|
335 panic|
0cab4211 336 debug|
397bfd46 337 printf|
6b9709d9
TR
338 puts|
339 MODULE_[A-Z_]+|
340 seq_vprintf|seq_printf|seq_puts
05622191
JH
341)};
342
343our $signature_tags = qr{(?xi:
344 Signed-off-by:|
345 Acked-by:|
346 Tested-by:|
347 Reviewed-by:|
348 Reported-by:|
6b9709d9 349 Suggested-by:|
05622191
JH
350 To:|
351 Cc:
352)};
353
354our @typeList = (
355 qr{void},
356 qr{(?:unsigned\s+)?char},
357 qr{(?:unsigned\s+)?short},
358 qr{(?:unsigned\s+)?int},
359 qr{(?:unsigned\s+)?long},
360 qr{(?:unsigned\s+)?long\s+int},
361 qr{(?:unsigned\s+)?long\s+long},
362 qr{(?:unsigned\s+)?long\s+long\s+int},
363 qr{unsigned},
364 qr{float},
365 qr{double},
366 qr{bool},
367 qr{struct\s+$Ident},
368 qr{union\s+$Ident},
369 qr{enum\s+$Ident},
370 qr{${Ident}_t},
371 qr{${Ident}_handler},
372 qr{${Ident}_handler_fn},
373);
6b9709d9
TR
374our @typeListWithAttr = (
375 @typeList,
376 qr{struct\s+$InitAttribute\s+$Ident},
377 qr{union\s+$InitAttribute\s+$Ident},
378);
379
05622191
JH
380our @modifierList = (
381 qr{fastcall},
382);
383
384our $allowed_asm_includes = qr{(?x:
385 irq|
386 memory
387)};
388# memory.h: ARM has a custom one
389
390sub build_types {
391 my $mods = "(?x: \n" . join("|\n ", @modifierList) . "\n)";
392 my $all = "(?x: \n" . join("|\n ", @typeList) . "\n)";
6b9709d9 393 my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)";
05622191
JH
394 $Modifier = qr{(?:$Attribute|$Sparse|$mods)};
395 $NonptrType = qr{
396 (?:$Modifier\s+|const\s+)*
397 (?:
d45a6ae2 398 (?:typeof|__typeof__)\s*\([^\)]*\)|
05622191
JH
399 (?:$typeTypedefs\b)|
400 (?:${all}\b)
401 )
402 (?:\s+$Modifier|\s+const)*
403 }x;
6b9709d9
TR
404 $NonptrTypeWithAttr = qr{
405 (?:$Modifier\s+|const\s+)*
406 (?:
407 (?:typeof|__typeof__)\s*\([^\)]*\)|
408 (?:$typeTypedefs\b)|
409 (?:${allWithAttr}\b)
410 )
411 (?:\s+$Modifier|\s+const)*
412 }x;
05622191
JH
413 $Type = qr{
414 $NonptrType
d45a6ae2 415 (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*|\[\])+|(?:\s*\[\s*\])+)?
05622191
JH
416 (?:\s+$Inline|\s+$Modifier)*
417 }x;
418 $Declare = qr{(?:$Storage\s+)?$Type};
419}
420build_types();
421
05622191 422our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
d45a6ae2
KP
423
424# Using $balanced_parens, $LvalOrFunc, or $FuncArg
425# requires at least perl version v5.10.0
426# Any use must be runtime checked with $^V
427
428our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
429our $LvalOrFunc = qr{($Lval)\s*($balanced_parens{0,1})\s*};
430our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)};
05622191
JH
431
432sub deparenthesize {
433 my ($string) = @_;
434 return "" if (!defined($string));
435 $string =~ s@^\s*\(\s*@@g;
436 $string =~ s@\s*\)\s*$@@g;
437 $string =~ s@\s+@ @g;
438 return $string;
439}
440
6b9709d9
TR
441sub seed_camelcase_file {
442 my ($file) = @_;
443
444 return if (!(-f $file));
445
446 local $/;
447
448 open(my $include_file, '<', "$file")
449 or warn "$P: Can't read '$file' $!\n";
450 my $text = <$include_file>;
451 close($include_file);
452
453 my @lines = split('\n', $text);
454
455 foreach my $line (@lines) {
456 next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
457 if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
458 $camelcase{$1} = 1;
459 } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
460 $camelcase{$1} = 1;
461 } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
462 $camelcase{$1} = 1;
463 }
464 }
465}
466
467my $camelcase_seeded = 0;
468sub seed_camelcase_includes {
469 return if ($camelcase_seeded);
470
471 my $files;
472 my $camelcase_cache = "";
473 my @include_files = ();
474
475 $camelcase_seeded = 1;
476
477 if (-e ".git") {
478 my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
479 chomp $git_last_include_commit;
480 $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
481 } else {
482 my $last_mod_date = 0;
483 $files = `find $root/include -name "*.h"`;
484 @include_files = split('\n', $files);
485 foreach my $file (@include_files) {
486 my $date = POSIX::strftime("%Y%m%d%H%M",
487 localtime((stat $file)[9]));
488 $last_mod_date = $date if ($last_mod_date < $date);
489 }
490 $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
491 }
492
493 if ($camelcase_cache ne "" && -f $camelcase_cache) {
494 open(my $camelcase_file, '<', "$camelcase_cache")
495 or warn "$P: Can't read '$camelcase_cache' $!\n";
496 while (<$camelcase_file>) {
497 chomp;
498 $camelcase{$_} = 1;
499 }
500 close($camelcase_file);
501
502 return;
503 }
504
505 if (-e ".git") {
506 $files = `git ls-files "include/*.h"`;
507 @include_files = split('\n', $files);
508 }
509
510 foreach my $file (@include_files) {
511 seed_camelcase_file($file);
512 }
513
514 if ($camelcase_cache ne "") {
515 unlink glob ".checkpatch-camelcase.*";
516 open(my $camelcase_file, '>', "$camelcase_cache")
517 or warn "$P: Can't write '$camelcase_cache' $!\n";
518 foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
519 print $camelcase_file ("$_\n");
520 }
521 close($camelcase_file);
522 }
523}
524
05622191
JH
525$chk_signoff = 0 if ($file);
526
05622191
JH
527my @rawlines = ();
528my @lines = ();
6b9709d9 529my @fixed = ();
05622191
JH
530my $vname;
531for my $filename (@ARGV) {
532 my $FILE;
533 if ($file) {
534 open($FILE, '-|', "diff -u /dev/null $filename") ||
535 die "$P: $filename: diff failed - $!\n";
536 } elsif ($filename eq '-') {
537 open($FILE, '<&STDIN');
538 } else {
539 open($FILE, '<', "$filename") ||
540 die "$P: $filename: open failed - $!\n";
541 }
542 if ($filename eq '-') {
543 $vname = 'Your patch';
544 } else {
545 $vname = $filename;
546 }
547 while (<$FILE>) {
548 chomp;
549 push(@rawlines, $_);
550 }
551 close($FILE);
552 if (!process($filename)) {
553 $exit = 1;
554 }
555 @rawlines = ();
556 @lines = ();
6b9709d9 557 @fixed = ();
05622191
JH
558}
559
560exit($exit);
561
562sub top_of_kernel_tree {
563 my ($root) = @_;
564
565 my @tree_check = (
6b9709d9 566 "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
05622191
JH
567 "README", "Documentation", "arch", "include", "drivers",
568 "fs", "init", "ipc", "kernel", "lib", "scripts",
569 );
570
571 foreach my $check (@tree_check) {
572 if (! -e $root . '/' . $check) {
573 return 0;
574 }
575 }
576 return 1;
d45a6ae2 577}
05622191
JH
578
579sub parse_email {
580 my ($formatted_email) = @_;
581
582 my $name = "";
583 my $address = "";
584 my $comment = "";
585
586 if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
587 $name = $1;
588 $address = $2;
589 $comment = $3 if defined $3;
590 } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
591 $address = $1;
592 $comment = $2 if defined $2;
593 } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
594 $address = $1;
595 $comment = $2 if defined $2;
596 $formatted_email =~ s/$address.*$//;
597 $name = $formatted_email;
6b9709d9 598 $name = trim($name);
05622191
JH
599 $name =~ s/^\"|\"$//g;
600 # If there's a name left after stripping spaces and
601 # leading quotes, and the address doesn't have both
602 # leading and trailing angle brackets, the address
603 # is invalid. ie:
604 # "joe smith joe@smith.com" bad
605 # "joe smith <joe@smith.com" bad
606 if ($name ne "" && $address !~ /^<[^>]+>$/) {
607 $name = "";
608 $address = "";
609 $comment = "";
610 }
611 }
612
6b9709d9 613 $name = trim($name);
05622191 614 $name =~ s/^\"|\"$//g;
6b9709d9 615 $address = trim($address);
05622191
JH
616 $address =~ s/^\<|\>$//g;
617
618 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
619 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
620 $name = "\"$name\"";
621 }
622
623 return ($name, $address, $comment);
624}
625
626sub format_email {
627 my ($name, $address) = @_;
628
629 my $formatted_email;
630
6b9709d9 631 $name = trim($name);
05622191 632 $name =~ s/^\"|\"$//g;
6b9709d9 633 $address = trim($address);
05622191
JH
634
635 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
636 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
637 $name = "\"$name\"";
638 }
639
640 if ("$name" eq "") {
641 $formatted_email = "$address";
642 } else {
643 $formatted_email = "$name <$address>";
644 }
645
646 return $formatted_email;
647}
648
649sub which_conf {
650 my ($conf) = @_;
651
652 foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
653 if (-e "$path/$conf") {
654 return "$path/$conf";
655 }
656 }
657
658 return "";
659}
660
661sub expand_tabs {
662 my ($str) = @_;
663
664 my $res = '';
665 my $n = 0;
666 for my $c (split(//, $str)) {
667 if ($c eq "\t") {
668 $res .= ' ';
669 $n++;
670 for (; ($n % 8) != 0; $n++) {
671 $res .= ' ';
672 }
673 next;
674 }
675 $res .= $c;
676 $n++;
677 }
678
679 return $res;
680}
681sub copy_spacing {
682 (my $res = shift) =~ tr/\t/ /c;
683 return $res;
684}
685
686sub line_stats {
687 my ($line) = @_;
688
689 # Drop the diff line leader and expand tabs
690 $line =~ s/^.//;
691 $line = expand_tabs($line);
692
693 # Pick the indent from the front of the line.
694 my ($white) = ($line =~ /^(\s*)/);
695
696 return (length($line), length($white));
697}
698
699my $sanitise_quote = '';
700
701sub sanitise_line_reset {
702 my ($in_comment) = @_;
703
704 if ($in_comment) {
705 $sanitise_quote = '*/';
706 } else {
707 $sanitise_quote = '';
708 }
709}
710sub sanitise_line {
711 my ($line) = @_;
712
713 my $res = '';
714 my $l = '';
715
716 my $qlen = 0;
717 my $off = 0;
718 my $c;
719
720 # Always copy over the diff marker.
721 $res = substr($line, 0, 1);
722
723 for ($off = 1; $off < length($line); $off++) {
724 $c = substr($line, $off, 1);
725
726 # Comments we are wacking completly including the begin
727 # and end, all to $;.
728 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
729 $sanitise_quote = '*/';
730
731 substr($res, $off, 2, "$;$;");
732 $off++;
733 next;
734 }
735 if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
736 $sanitise_quote = '';
737 substr($res, $off, 2, "$;$;");
738 $off++;
739 next;
740 }
741 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
742 $sanitise_quote = '//';
743
744 substr($res, $off, 2, $sanitise_quote);
745 $off++;
746 next;
747 }
748
749 # A \ in a string means ignore the next character.
750 if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
751 $c eq "\\") {
752 substr($res, $off, 2, 'XX');
753 $off++;
754 next;
755 }
756 # Regular quotes.
757 if ($c eq "'" || $c eq '"') {
758 if ($sanitise_quote eq '') {
759 $sanitise_quote = $c;
760
761 substr($res, $off, 1, $c);
762 next;
763 } elsif ($sanitise_quote eq $c) {
764 $sanitise_quote = '';
765 }
766 }
767
768 #print "c<$c> SQ<$sanitise_quote>\n";
769 if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
770 substr($res, $off, 1, $;);
771 } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
772 substr($res, $off, 1, $;);
773 } elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
774 substr($res, $off, 1, 'X');
775 } else {
776 substr($res, $off, 1, $c);
777 }
778 }
779
780 if ($sanitise_quote eq '//') {
781 $sanitise_quote = '';
782 }
783
784 # The pathname on a #include may be surrounded by '<' and '>'.
785 if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
786 my $clean = 'X' x length($1);
787 $res =~ s@\<.*\>@<$clean>@;
788
789 # The whole of a #error is a string.
790 } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
791 my $clean = 'X' x length($1);
792 $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
793 }
794
795 return $res;
796}
797
6b9709d9
TR
798sub get_quoted_string {
799 my ($line, $rawline) = @_;
800
801 return "" if ($line !~ m/(\"[X]+\")/g);
802 return substr($rawline, $-[0], $+[0] - $-[0]);
803}
804
05622191
JH
805sub ctx_statement_block {
806 my ($linenr, $remain, $off) = @_;
807 my $line = $linenr - 1;
808 my $blk = '';
809 my $soff = $off;
810 my $coff = $off - 1;
811 my $coff_set = 0;
812
813 my $loff = 0;
814
815 my $type = '';
816 my $level = 0;
817 my @stack = ();
818 my $p;
819 my $c;
820 my $len = 0;
821
822 my $remainder;
823 while (1) {
824 @stack = (['', 0]) if ($#stack == -1);
825
826 #warn "CSB: blk<$blk> remain<$remain>\n";
827 # If we are about to drop off the end, pull in more
828 # context.
829 if ($off >= $len) {
830 for (; $remain > 0; $line++) {
831 last if (!defined $lines[$line]);
832 next if ($lines[$line] =~ /^-/);
833 $remain--;
834 $loff = $len;
835 $blk .= $lines[$line] . "\n";
836 $len = length($blk);
837 $line++;
838 last;
839 }
840 # Bail if there is no further context.
841 #warn "CSB: blk<$blk> off<$off> len<$len>\n";
842 if ($off >= $len) {
843 last;
844 }
d45a6ae2
KP
845 if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
846 $level++;
847 $type = '#';
848 }
05622191
JH
849 }
850 $p = $c;
851 $c = substr($blk, $off, 1);
852 $remainder = substr($blk, $off);
853
854 #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
855
856 # Handle nested #if/#else.
857 if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
858 push(@stack, [ $type, $level ]);
859 } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
860 ($type, $level) = @{$stack[$#stack - 1]};
861 } elsif ($remainder =~ /^#\s*endif\b/) {
862 ($type, $level) = @{pop(@stack)};
863 }
864
865 # Statement ends at the ';' or a close '}' at the
866 # outermost level.
867 if ($level == 0 && $c eq ';') {
868 last;
869 }
870
871 # An else is really a conditional as long as its not else if
872 if ($level == 0 && $coff_set == 0 &&
873 (!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
874 $remainder =~ /^(else)(?:\s|{)/ &&
875 $remainder !~ /^else\s+if\b/) {
876 $coff = $off + length($1) - 1;
877 $coff_set = 1;
878 #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
879 #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
880 }
881
882 if (($type eq '' || $type eq '(') && $c eq '(') {
883 $level++;
884 $type = '(';
885 }
886 if ($type eq '(' && $c eq ')') {
887 $level--;
888 $type = ($level != 0)? '(' : '';
889
890 if ($level == 0 && $coff < $soff) {
891 $coff = $off;
892 $coff_set = 1;
893 #warn "CSB: mark coff<$coff>\n";
894 }
895 }
896 if (($type eq '' || $type eq '{') && $c eq '{') {
897 $level++;
898 $type = '{';
899 }
900 if ($type eq '{' && $c eq '}') {
901 $level--;
902 $type = ($level != 0)? '{' : '';
903
904 if ($level == 0) {
905 if (substr($blk, $off + 1, 1) eq ';') {
906 $off++;
907 }
908 last;
909 }
910 }
d45a6ae2
KP
911 # Preprocessor commands end at the newline unless escaped.
912 if ($type eq '#' && $c eq "\n" && $p ne "\\") {
913 $level--;
914 $type = '';
915 $off++;
916 last;
917 }
05622191
JH
918 $off++;
919 }
920 # We are truly at the end, so shuffle to the next line.
921 if ($off == $len) {
922 $loff = $len + 1;
923 $line++;
924 $remain--;
925 }
926
927 my $statement = substr($blk, $soff, $off - $soff + 1);
928 my $condition = substr($blk, $soff, $coff - $soff + 1);
929
930 #warn "STATEMENT<$statement>\n";
931 #warn "CONDITION<$condition>\n";
932
933 #print "coff<$coff> soff<$off> loff<$loff>\n";
934
935 return ($statement, $condition,
936 $line, $remain + 1, $off - $loff + 1, $level);
937}
938
939sub statement_lines {
940 my ($stmt) = @_;
941
942 # Strip the diff line prefixes and rip blank lines at start and end.
943 $stmt =~ s/(^|\n)./$1/g;
944 $stmt =~ s/^\s*//;
945 $stmt =~ s/\s*$//;
946
947 my @stmt_lines = ($stmt =~ /\n/g);
948
949 return $#stmt_lines + 2;
950}
951
952sub statement_rawlines {
953 my ($stmt) = @_;
954
955 my @stmt_lines = ($stmt =~ /\n/g);
956
957 return $#stmt_lines + 2;
958}
959
960sub statement_block_size {
961 my ($stmt) = @_;
962
963 $stmt =~ s/(^|\n)./$1/g;
964 $stmt =~ s/^\s*{//;
965 $stmt =~ s/}\s*$//;
966 $stmt =~ s/^\s*//;
967 $stmt =~ s/\s*$//;
968
969 my @stmt_lines = ($stmt =~ /\n/g);
970 my @stmt_statements = ($stmt =~ /;/g);
971
972 my $stmt_lines = $#stmt_lines + 2;
973 my $stmt_statements = $#stmt_statements + 1;
974
975 if ($stmt_lines > $stmt_statements) {
976 return $stmt_lines;
977 } else {
978 return $stmt_statements;
979 }
980}
981
982sub ctx_statement_full {
983 my ($linenr, $remain, $off) = @_;
984 my ($statement, $condition, $level);
985
986 my (@chunks);
987
988 # Grab the first conditional/block pair.
989 ($statement, $condition, $linenr, $remain, $off, $level) =
990 ctx_statement_block($linenr, $remain, $off);
991 #print "F: c<$condition> s<$statement> remain<$remain>\n";
992 push(@chunks, [ $condition, $statement ]);
993 if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
994 return ($level, $linenr, @chunks);
995 }
996
997 # Pull in the following conditional/block pairs and see if they
998 # could continue the statement.
999 for (;;) {
1000 ($statement, $condition, $linenr, $remain, $off, $level) =
1001 ctx_statement_block($linenr, $remain, $off);
1002 #print "C: c<$condition> s<$statement> remain<$remain>\n";
1003 last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
1004 #print "C: push\n";
1005 push(@chunks, [ $condition, $statement ]);
1006 }
1007
1008 return ($level, $linenr, @chunks);
1009}
1010
1011sub ctx_block_get {
1012 my ($linenr, $remain, $outer, $open, $close, $off) = @_;
1013 my $line;
1014 my $start = $linenr - 1;
1015 my $blk = '';
1016 my @o;
1017 my @c;
1018 my @res = ();
1019
1020 my $level = 0;
1021 my @stack = ($level);
1022 for ($line = $start; $remain > 0; $line++) {
1023 next if ($rawlines[$line] =~ /^-/);
1024 $remain--;
1025
1026 $blk .= $rawlines[$line];
1027
1028 # Handle nested #if/#else.
1029 if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
1030 push(@stack, $level);
1031 } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
1032 $level = $stack[$#stack - 1];
1033 } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
1034 $level = pop(@stack);
1035 }
1036
1037 foreach my $c (split(//, $lines[$line])) {
1038 ##print "C<$c>L<$level><$open$close>O<$off>\n";
1039 if ($off > 0) {
1040 $off--;
1041 next;
1042 }
1043
1044 if ($c eq $close && $level > 0) {
1045 $level--;
1046 last if ($level == 0);
1047 } elsif ($c eq $open) {
1048 $level++;
1049 }
1050 }
1051
1052 if (!$outer || $level <= 1) {
1053 push(@res, $rawlines[$line]);
1054 }
1055
1056 last if ($level == 0);
1057 }
1058
1059 return ($level, @res);
1060}
1061sub ctx_block_outer {
1062 my ($linenr, $remain) = @_;
1063
1064 my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1065 return @r;
1066}
1067sub ctx_block {
1068 my ($linenr, $remain) = @_;
1069
1070 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1071 return @r;
1072}
1073sub ctx_statement {
1074 my ($linenr, $remain, $off) = @_;
1075
1076 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1077 return @r;
1078}
1079sub ctx_block_level {
1080 my ($linenr, $remain) = @_;
1081
1082 return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1083}
1084sub ctx_statement_level {
1085 my ($linenr, $remain, $off) = @_;
1086
1087 return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1088}
1089
1090sub ctx_locate_comment {
1091 my ($first_line, $end_line) = @_;
1092
1093 # Catch a comment on the end of the line itself.
1094 my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
1095 return $current_comment if (defined $current_comment);
1096
1097 # Look through the context and try and figure out if there is a
1098 # comment.
1099 my $in_comment = 0;
1100 $current_comment = '';
1101 for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
1102 my $line = $rawlines[$linenr - 1];
1103 #warn " $line\n";
1104 if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1105 $in_comment = 1;
1106 }
1107 if ($line =~ m@/\*@) {
1108 $in_comment = 1;
1109 }
1110 if (!$in_comment && $current_comment ne '') {
1111 $current_comment = '';
1112 }
1113 $current_comment .= $line . "\n" if ($in_comment);
1114 if ($line =~ m@\*/@) {
1115 $in_comment = 0;
1116 }
1117 }
1118
1119 chomp($current_comment);
1120 return($current_comment);
1121}
1122sub ctx_has_comment {
1123 my ($first_line, $end_line) = @_;
1124 my $cmt = ctx_locate_comment($first_line, $end_line);
1125
1126 ##print "LINE: $rawlines[$end_line - 1 ]\n";
1127 ##print "CMMT: $cmt\n";
1128
1129 return ($cmt ne '');
1130}
1131
1132sub raw_line {
1133 my ($linenr, $cnt) = @_;
1134
1135 my $offset = $linenr - 1;
1136 $cnt++;
1137
1138 my $line;
1139 while ($cnt) {
1140 $line = $rawlines[$offset++];
1141 next if (defined($line) && $line =~ /^-/);
1142 $cnt--;
1143 }
1144
1145 return $line;
1146}
1147
1148sub cat_vet {
1149 my ($vet) = @_;
1150 my ($res, $coded);
1151
1152 $res = '';
1153 while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
1154 $res .= $1;
1155 if ($2 ne '') {
1156 $coded = sprintf("^%c", unpack('C', $2) + 64);
1157 $res .= $coded;
1158 }
1159 }
1160 $res =~ s/$/\$/;
1161
1162 return $res;
1163}
1164
1165my $av_preprocessor = 0;
1166my $av_pending;
1167my @av_paren_type;
1168my $av_pend_colon;
1169
1170sub annotate_reset {
1171 $av_preprocessor = 0;
1172 $av_pending = '_';
1173 @av_paren_type = ('E');
1174 $av_pend_colon = 'O';
1175}
1176
1177sub annotate_values {
1178 my ($stream, $type) = @_;
1179
1180 my $res;
1181 my $var = '_' x length($stream);
1182 my $cur = $stream;
1183
1184 print "$stream\n" if ($dbg_values > 1);
1185
1186 while (length($cur)) {
1187 @av_paren_type = ('E') if ($#av_paren_type < 0);
1188 print " <" . join('', @av_paren_type) .
1189 "> <$type> <$av_pending>" if ($dbg_values > 1);
1190 if ($cur =~ /^(\s+)/o) {
1191 print "WS($1)\n" if ($dbg_values > 1);
1192 if ($1 =~ /\n/ && $av_preprocessor) {
1193 $type = pop(@av_paren_type);
1194 $av_preprocessor = 0;
1195 }
1196
1197 } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
1198 print "CAST($1)\n" if ($dbg_values > 1);
1199 push(@av_paren_type, $type);
d45a6ae2 1200 $type = 'c';
05622191
JH
1201
1202 } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
1203 print "DECLARE($1)\n" if ($dbg_values > 1);
1204 $type = 'T';
1205
1206 } elsif ($cur =~ /^($Modifier)\s*/) {
1207 print "MODIFIER($1)\n" if ($dbg_values > 1);
1208 $type = 'T';
1209
1210 } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
1211 print "DEFINE($1,$2)\n" if ($dbg_values > 1);
1212 $av_preprocessor = 1;
1213 push(@av_paren_type, $type);
1214 if ($2 ne '') {
1215 $av_pending = 'N';
1216 }
1217 $type = 'E';
1218
1219 } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
1220 print "UNDEF($1)\n" if ($dbg_values > 1);
1221 $av_preprocessor = 1;
1222 push(@av_paren_type, $type);
1223
1224 } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
1225 print "PRE_START($1)\n" if ($dbg_values > 1);
1226 $av_preprocessor = 1;
1227
1228 push(@av_paren_type, $type);
1229 push(@av_paren_type, $type);
1230 $type = 'E';
1231
1232 } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
1233 print "PRE_RESTART($1)\n" if ($dbg_values > 1);
1234 $av_preprocessor = 1;
1235
1236 push(@av_paren_type, $av_paren_type[$#av_paren_type]);
1237
1238 $type = 'E';
1239
1240 } elsif ($cur =~ /^(\#\s*(?:endif))/o) {
1241 print "PRE_END($1)\n" if ($dbg_values > 1);
1242
1243 $av_preprocessor = 1;
1244
1245 # Assume all arms of the conditional end as this
1246 # one does, and continue as if the #endif was not here.
1247 pop(@av_paren_type);
1248 push(@av_paren_type, $type);
1249 $type = 'E';
1250
1251 } elsif ($cur =~ /^(\\\n)/o) {
1252 print "PRECONT($1)\n" if ($dbg_values > 1);
1253
1254 } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
1255 print "ATTR($1)\n" if ($dbg_values > 1);
1256 $av_pending = $type;
1257 $type = 'N';
1258
1259 } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
1260 print "SIZEOF($1)\n" if ($dbg_values > 1);
1261 if (defined $2) {
1262 $av_pending = 'V';
1263 }
1264 $type = 'N';
1265
1266 } elsif ($cur =~ /^(if|while|for)\b/o) {
1267 print "COND($1)\n" if ($dbg_values > 1);
1268 $av_pending = 'E';
1269 $type = 'N';
1270
1271 } elsif ($cur =~/^(case)/o) {
1272 print "CASE($1)\n" if ($dbg_values > 1);
1273 $av_pend_colon = 'C';
1274 $type = 'N';
1275
1276 } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
1277 print "KEYWORD($1)\n" if ($dbg_values > 1);
1278 $type = 'N';
1279
1280 } elsif ($cur =~ /^(\()/o) {
1281 print "PAREN('$1')\n" if ($dbg_values > 1);
1282 push(@av_paren_type, $av_pending);
1283 $av_pending = '_';
1284 $type = 'N';
1285
1286 } elsif ($cur =~ /^(\))/o) {
1287 my $new_type = pop(@av_paren_type);
1288 if ($new_type ne '_') {
1289 $type = $new_type;
1290 print "PAREN('$1') -> $type\n"
1291 if ($dbg_values > 1);
1292 } else {
1293 print "PAREN('$1')\n" if ($dbg_values > 1);
1294 }
1295
1296 } elsif ($cur =~ /^($Ident)\s*\(/o) {
1297 print "FUNC($1)\n" if ($dbg_values > 1);
1298 $type = 'V';
1299 $av_pending = 'V';
1300
1301 } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
1302 if (defined $2 && $type eq 'C' || $type eq 'T') {
1303 $av_pend_colon = 'B';
1304 } elsif ($type eq 'E') {
1305 $av_pend_colon = 'L';
1306 }
1307 print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
1308 $type = 'V';
1309
1310 } elsif ($cur =~ /^($Ident|$Constant)/o) {
1311 print "IDENT($1)\n" if ($dbg_values > 1);
1312 $type = 'V';
1313
1314 } elsif ($cur =~ /^($Assignment)/o) {
1315 print "ASSIGN($1)\n" if ($dbg_values > 1);
1316 $type = 'N';
1317
1318 } elsif ($cur =~/^(;|{|})/) {
1319 print "END($1)\n" if ($dbg_values > 1);
1320 $type = 'E';
1321 $av_pend_colon = 'O';
1322
1323 } elsif ($cur =~/^(,)/) {
1324 print "COMMA($1)\n" if ($dbg_values > 1);
1325 $type = 'C';
1326
1327 } elsif ($cur =~ /^(\?)/o) {
1328 print "QUESTION($1)\n" if ($dbg_values > 1);
1329 $type = 'N';
1330
1331 } elsif ($cur =~ /^(:)/o) {
1332 print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
1333
1334 substr($var, length($res), 1, $av_pend_colon);
1335 if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
1336 $type = 'E';
1337 } else {
1338 $type = 'N';
1339 }
1340 $av_pend_colon = 'O';
1341
1342 } elsif ($cur =~ /^(\[)/o) {
1343 print "CLOSE($1)\n" if ($dbg_values > 1);
1344 $type = 'N';
1345
1346 } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
1347 my $variant;
1348
1349 print "OPV($1)\n" if ($dbg_values > 1);
1350 if ($type eq 'V') {
1351 $variant = 'B';
1352 } else {
1353 $variant = 'U';
1354 }
1355
1356 substr($var, length($res), 1, $variant);
1357 $type = 'N';
1358
1359 } elsif ($cur =~ /^($Operators)/o) {
1360 print "OP($1)\n" if ($dbg_values > 1);
1361 if ($1 ne '++' && $1 ne '--') {
1362 $type = 'N';
1363 }
1364
1365 } elsif ($cur =~ /(^.)/o) {
1366 print "C($1)\n" if ($dbg_values > 1);
1367 }
1368 if (defined $1) {
1369 $cur = substr($cur, length($1));
1370 $res .= $type x length($1);
1371 }
1372 }
1373
1374 return ($res, $var);
1375}
1376
1377sub possible {
1378 my ($possible, $line) = @_;
1379 my $notPermitted = qr{(?:
1380 ^(?:
1381 $Modifier|
1382 $Storage|
1383 $Type|
1384 DEFINE_\S+
1385 )$|
1386 ^(?:
1387 goto|
1388 return|
1389 case|
1390 else|
1391 asm|__asm__|
d45a6ae2
KP
1392 do|
1393 \#|
1394 \#\#|
05622191
JH
1395 )(?:\s|$)|
1396 ^(?:typedef|struct|enum)\b
1397 )}x;
1398 warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1399 if ($possible !~ $notPermitted) {
1400 # Check for modifiers.
1401 $possible =~ s/\s*$Storage\s*//g;
1402 $possible =~ s/\s*$Sparse\s*//g;
1403 if ($possible =~ /^\s*$/) {
1404
1405 } elsif ($possible =~ /\s/) {
1406 $possible =~ s/\s*$Type\s*//g;
1407 for my $modifier (split(' ', $possible)) {
1408 if ($modifier !~ $notPermitted) {
1409 warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
1410 push(@modifierList, $modifier);
1411 }
1412 }
1413
1414 } else {
1415 warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
1416 push(@typeList, $possible);
1417 }
1418 build_types();
1419 } else {
1420 warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
1421 }
1422}
1423
1424my $prefix = '';
1425
1426sub show_type {
6b9709d9
TR
1427 return defined $use_type{$_[0]} if (scalar keys %use_type > 0);
1428
1429 return !defined $ignore_type{$_[0]};
05622191
JH
1430}
1431
1432sub report {
1433 if (!show_type($_[1]) ||
1434 (defined $tst_only && $_[2] !~ /\Q$tst_only\E/)) {
1435 return 0;
1436 }
1437 my $line;
1438 if ($show_types) {
1439 $line = "$prefix$_[0]:$_[1]: $_[2]\n";
1440 } else {
1441 $line = "$prefix$_[0]: $_[2]\n";
1442 }
1443 $line = (split('\n', $line))[0] . "\n" if ($terse);
1444
1445 push(our @report, $line);
1446
1447 return 1;
1448}
1449sub report_dump {
1450 our @report;
1451}
1452
1453sub ERROR {
1454 if (report("ERROR", $_[0], $_[1])) {
1455 our $clean = 0;
1456 our $cnt_error++;
6b9709d9 1457 return 1;
05622191 1458 }
6b9709d9 1459 return 0;
05622191
JH
1460}
1461sub WARN {
1462 if (report("WARNING", $_[0], $_[1])) {
1463 our $clean = 0;
1464 our $cnt_warn++;
6b9709d9 1465 return 1;
05622191 1466 }
6b9709d9 1467 return 0;
05622191
JH
1468}
1469sub CHK {
1470 if ($check && report("CHECK", $_[0], $_[1])) {
1471 our $clean = 0;
1472 our $cnt_chk++;
6b9709d9 1473 return 1;
05622191 1474 }
6b9709d9 1475 return 0;
05622191
JH
1476}
1477
1478sub check_absolute_file {
1479 my ($absolute, $herecurr) = @_;
1480 my $file = $absolute;
1481
1482 ##print "absolute<$absolute>\n";
1483
1484 # See if any suffix of this path is a path within the tree.
1485 while ($file =~ s@^[^/]*/@@) {
1486 if (-f "$root/$file") {
1487 ##print "file<$file>\n";
1488 last;
1489 }
1490 }
1491 if (! -f _) {
1492 return 0;
1493 }
1494
1495 # It is, so see if the prefix is acceptable.
1496 my $prefix = $absolute;
1497 substr($prefix, -length($file)) = '';
1498
1499 ##print "prefix<$prefix>\n";
1500 if ($prefix ne ".../") {
1501 WARN("USE_RELATIVE_PATH",
1502 "use relative pathname instead of absolute in changelog text\n" . $herecurr);
1503 }
1504}
1505
6b9709d9
TR
1506sub trim {
1507 my ($string) = @_;
1508
1509 $string =~ s/^\s+|\s+$//g;
1510
1511 return $string;
1512}
1513
1514sub ltrim {
1515 my ($string) = @_;
1516
1517 $string =~ s/^\s+//;
1518
1519 return $string;
1520}
1521
1522sub rtrim {
1523 my ($string) = @_;
1524
1525 $string =~ s/\s+$//;
1526
1527 return $string;
1528}
1529
1530sub string_find_replace {
1531 my ($string, $find, $replace) = @_;
1532
1533 $string =~ s/$find/$replace/g;
1534
1535 return $string;
1536}
1537
1538sub tabify {
1539 my ($leading) = @_;
1540
1541 my $source_indent = 8;
1542 my $max_spaces_before_tab = $source_indent - 1;
1543 my $spaces_to_tab = " " x $source_indent;
1544
1545 #convert leading spaces to tabs
1546 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
1547 #Remove spaces before a tab
1548 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
1549
1550 return "$leading";
1551}
1552
d45a6ae2
KP
1553sub pos_last_openparen {
1554 my ($line) = @_;
1555
1556 my $pos = 0;
1557
1558 my $opens = $line =~ tr/\(/\(/;
1559 my $closes = $line =~ tr/\)/\)/;
1560
1561 my $last_openparen = 0;
1562
1563 if (($opens == 0) || ($closes >= $opens)) {
1564 return -1;
1565 }
1566
1567 my $len = length($line);
1568
1569 for ($pos = 0; $pos < $len; $pos++) {
1570 my $string = substr($line, $pos);
1571 if ($string =~ /^($FuncArg|$balanced_parens)/) {
1572 $pos += length($1) - 1;
1573 } elsif (substr($line, $pos, 1) eq '(') {
1574 $last_openparen = $pos;
1575 } elsif (index($string, '(') == -1) {
1576 last;
1577 }
1578 }
1579
1580 return $last_openparen + 1;
1581}
1582
05622191
JH
1583sub process {
1584 my $filename = shift;
1585
1586 my $linenr=0;
1587 my $prevline="";
1588 my $prevrawline="";
1589 my $stashline="";
1590 my $stashrawline="";
1591
1592 my $length;
1593 my $indent;
1594 my $previndent=0;
1595 my $stashindent=0;
1596
1597 our $clean = 1;
1598 my $signoff = 0;
1599 my $is_patch = 0;
1600
d45a6ae2
KP
1601 my $in_header_lines = 1;
1602 my $in_commit_log = 0; #Scanning lines before patch
1603
1604 my $non_utf8_charset = 0;
1605
05622191
JH
1606 our @report = ();
1607 our $cnt_lines = 0;
1608 our $cnt_error = 0;
1609 our $cnt_warn = 0;
1610 our $cnt_chk = 0;
1611
1612 # Trace the real file/line as we go.
1613 my $realfile = '';
1614 my $realline = 0;
1615 my $realcnt = 0;
1616 my $here = '';
1617 my $in_comment = 0;
1618 my $comment_edge = 0;
1619 my $first_line = 0;
1620 my $p1_prefix = '';
1621
1622 my $prev_values = 'E';
1623
1624 # suppression flags
1625 my %suppress_ifbraces;
1626 my %suppress_whiletrailers;
1627 my %suppress_export;
d45a6ae2
KP
1628 my $suppress_statement = 0;
1629
6b9709d9 1630 my %signatures = ();
05622191
JH
1631
1632 # Pre-scan the patch sanitizing the lines.
1633 # Pre-scan the patch looking for any __setup documentation.
1634 #
1635 my @setup_docs = ();
1636 my $setup_docs = 0;
1637
6b9709d9
TR
1638 my $camelcase_file_seeded = 0;
1639
05622191
JH
1640 sanitise_line_reset();
1641 my $line;
1642 foreach my $rawline (@rawlines) {
1643 $linenr++;
1644 $line = $rawline;
1645
6b9709d9
TR
1646 push(@fixed, $rawline) if ($fix);
1647
05622191
JH
1648 if ($rawline=~/^\+\+\+\s+(\S+)/) {
1649 $setup_docs = 0;
1650 if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
1651 $setup_docs = 1;
1652 }
1653 #next;
1654 }
1655 if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1656 $realline=$1-1;
1657 if (defined $2) {
1658 $realcnt=$3+1;
1659 } else {
1660 $realcnt=1+1;
1661 }
1662 $in_comment = 0;
1663
1664 # Guestimate if this is a continuing comment. Run
1665 # the context looking for a comment "edge". If this
1666 # edge is a close comment then we must be in a comment
1667 # at context start.
1668 my $edge;
1669 my $cnt = $realcnt;
1670 for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
1671 next if (defined $rawlines[$ln - 1] &&
1672 $rawlines[$ln - 1] =~ /^-/);
1673 $cnt--;
1674 #print "RAW<$rawlines[$ln - 1]>\n";
1675 last if (!defined $rawlines[$ln - 1]);
1676 if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
1677 $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
1678 ($edge) = $1;
1679 last;
1680 }
1681 }
1682 if (defined $edge && $edge eq '*/') {
1683 $in_comment = 1;
1684 }
1685
1686 # Guestimate if this is a continuing comment. If this
1687 # is the start of a diff block and this line starts
1688 # ' *' then it is very likely a comment.
1689 if (!defined $edge &&
1690 $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
1691 {
1692 $in_comment = 1;
1693 }
1694
1695 ##print "COMMENT:$in_comment edge<$edge> $rawline\n";
1696 sanitise_line_reset($in_comment);
1697
1698 } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
1699 # Standardise the strings and chars within the input to
1700 # simplify matching -- only bother with positive lines.
1701 $line = sanitise_line($rawline);
1702 }
1703 push(@lines, $line);
1704
1705 if ($realcnt > 1) {
1706 $realcnt-- if ($line =~ /^(?:\+| |$)/);
1707 } else {
1708 $realcnt = 0;
1709 }
1710
1711 #print "==>$rawline\n";
1712 #print "-->$line\n";
1713
1714 if ($setup_docs && $line =~ /^\+/) {
1715 push(@setup_docs, $line);
1716 }
1717 }
1718
1719 $prefix = '';
1720
1721 $realcnt = 0;
1722 $linenr = 0;
1723 foreach my $line (@lines) {
1724 $linenr++;
6b9709d9
TR
1725 my $sline = $line; #copy of $line
1726 $sline =~ s/$;/ /g; #with comments as spaces
05622191
JH
1727
1728 my $rawline = $rawlines[$linenr - 1];
1729
1730#extract the line range in the file after the patch is applied
1731 if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
1732 $is_patch = 1;
1733 $first_line = $linenr + 1;
1734 $realline=$1-1;
1735 if (defined $2) {
1736 $realcnt=$3+1;
1737 } else {
1738 $realcnt=1+1;
1739 }
1740 annotate_reset();
1741 $prev_values = 'E';
1742
1743 %suppress_ifbraces = ();
1744 %suppress_whiletrailers = ();
1745 %suppress_export = ();
d45a6ae2 1746 $suppress_statement = 0;
05622191
JH
1747 next;
1748
1749# track the line number as we move through the hunk, note that
1750# new versions of GNU diff omit the leading space on completely
1751# blank context lines so we need to count that too.
1752 } elsif ($line =~ /^( |\+|$)/) {
1753 $realline++;
1754 $realcnt-- if ($realcnt != 0);
1755
1756 # Measure the line length and indent.
1757 ($length, $indent) = line_stats($rawline);
1758
1759 # Track the previous line.
1760 ($prevline, $stashline) = ($stashline, $line);
1761 ($previndent, $stashindent) = ($stashindent, $indent);
1762 ($prevrawline, $stashrawline) = ($stashrawline, $rawline);
1763
1764 #warn "line<$line>\n";
1765
1766 } elsif ($realcnt == 1) {
1767 $realcnt--;
1768 }
1769
1770 my $hunk_line = ($realcnt != 0);
1771
1772#make up the handle for any error we report on this line
1773 $prefix = "$filename:$realline: " if ($emacs && $file);
1774 $prefix = "$filename:$linenr: " if ($emacs && !$file);
1775
1776 $here = "#$linenr: " if (!$file);
1777 $here = "#$realline: " if ($file);
1778
1779 # extract the filename as it passes
1780 if ($line =~ /^diff --git.*?(\S+)$/) {
1781 $realfile = $1;
6b9709d9 1782 $realfile =~ s@^([^/]*)/@@ if (!$file);
d45a6ae2 1783 $in_commit_log = 0;
05622191
JH
1784 } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
1785 $realfile = $1;
6b9709d9 1786 $realfile =~ s@^([^/]*)/@@ if (!$file);
d45a6ae2 1787 $in_commit_log = 0;
05622191
JH
1788
1789 $p1_prefix = $1;
1790 if (!$file && $tree && $p1_prefix ne '' &&
1791 -e "$root/$p1_prefix") {
1792 WARN("PATCH_PREFIX",
1793 "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
1794 }
1795
1796 if ($realfile =~ m@^include/asm/@) {
1797 ERROR("MODIFIED_INCLUDE_ASM",
1798 "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
1799 }
1800 next;
1801 }
1802
1803 $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
1804
1805 my $hereline = "$here\n$rawline\n";
1806 my $herecurr = "$here\n$rawline\n";
1807 my $hereprev = "$here\n$prevrawline\n$rawline\n";
1808
1809 $cnt_lines++ if ($realcnt != 0);
1810
1811# Check for incorrect file permissions
1812 if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
1813 my $permhere = $here . "FILE: $realfile\n";
6b9709d9
TR
1814 if ($realfile !~ m@scripts/@ &&
1815 $realfile !~ /\.(py|pl|awk|sh)$/) {
05622191
JH
1816 ERROR("EXECUTE_PERMISSIONS",
1817 "do not set execute permissions for source files\n" . $permhere);
1818 }
1819 }
1820
1821# Check the patch for a signoff:
1822 if ($line =~ /^\s*signed-off-by:/i) {
1823 $signoff++;
d45a6ae2 1824 $in_commit_log = 0;
05622191
JH
1825 }
1826
1827# Check signature styles
d45a6ae2
KP
1828 if (!$in_header_lines &&
1829 $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
05622191
JH
1830 my $space_before = $1;
1831 my $sign_off = $2;
1832 my $space_after = $3;
1833 my $email = $4;
1834 my $ucfirst_sign_off = ucfirst(lc($sign_off));
1835
d45a6ae2
KP
1836 if ($sign_off !~ /$signature_tags/) {
1837 WARN("BAD_SIGN_OFF",
1838 "Non-standard signature: $sign_off\n" . $herecurr);
1839 }
05622191 1840 if (defined $space_before && $space_before ne "") {
6b9709d9
TR
1841 if (WARN("BAD_SIGN_OFF",
1842 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
1843 $fix) {
1844 $fixed[$linenr - 1] =
1845 "$ucfirst_sign_off $email";
1846 }
05622191
JH
1847 }
1848 if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
6b9709d9
TR
1849 if (WARN("BAD_SIGN_OFF",
1850 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
1851 $fix) {
1852 $fixed[$linenr - 1] =
1853 "$ucfirst_sign_off $email";
1854 }
1855
05622191
JH
1856 }
1857 if (!defined $space_after || $space_after ne " ") {
6b9709d9
TR
1858 if (WARN("BAD_SIGN_OFF",
1859 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
1860 $fix) {
1861 $fixed[$linenr - 1] =
1862 "$ucfirst_sign_off $email";
1863 }
05622191
JH
1864 }
1865
1866 my ($email_name, $email_address, $comment) = parse_email($email);
1867 my $suggested_email = format_email(($email_name, $email_address));
1868 if ($suggested_email eq "") {
1869 ERROR("BAD_SIGN_OFF",
1870 "Unrecognized email address: '$email'\n" . $herecurr);
1871 } else {
1872 my $dequoted = $suggested_email;
1873 $dequoted =~ s/^"//;
1874 $dequoted =~ s/" </ </;
1875 # Don't force email to have quotes
1876 # Allow just an angle bracketed address
1877 if ("$dequoted$comment" ne $email &&
1878 "<$email_address>$comment" ne $email &&
1879 "$suggested_email$comment" ne $email) {
1880 WARN("BAD_SIGN_OFF",
1881 "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
1882 }
1883 }
6b9709d9
TR
1884
1885# Check for duplicate signatures
1886 my $sig_nospace = $line;
1887 $sig_nospace =~ s/\s//g;
1888 $sig_nospace = lc($sig_nospace);
1889 if (defined $signatures{$sig_nospace}) {
1890 WARN("BAD_SIGN_OFF",
1891 "Duplicate signature\n" . $herecurr);
1892 } else {
1893 $signatures{$sig_nospace} = 1;
1894 }
05622191
JH
1895 }
1896
1897# Check for wrappage within a valid hunk of the file
1898 if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
1899 ERROR("CORRUPTED_PATCH",
1900 "patch seems to be corrupt (line wrapped?)\n" .
1901 $herecurr) if (!$emitted_corrupt++);
1902 }
1903
1904# Check for absolute kernel paths.
1905 if ($tree) {
1906 while ($line =~ m{(?:^|\s)(/\S*)}g) {
1907 my $file = $1;
1908
1909 if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
1910 check_absolute_file($1, $herecurr)) {
1911 #
1912 } else {
1913 check_absolute_file($file, $herecurr);
1914 }
1915 }
1916 }
1917
1918# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
1919 if (($realfile =~ /^$/ || $line =~ /^\+/) &&
1920 $rawline !~ m/^$UTF8*$/) {
1921 my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
1922
1923 my $blank = copy_spacing($rawline);
1924 my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
1925 my $hereptr = "$hereline$ptr\n";
1926
1927 CHK("INVALID_UTF8",
1928 "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
1929 }
1930
d45a6ae2
KP
1931# Check if it's the start of a commit log
1932# (not a header line and we haven't seen the patch filename)
1933 if ($in_header_lines && $realfile =~ /^$/ &&
1934 $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) {
1935 $in_header_lines = 0;
1936 $in_commit_log = 1;
1937 }
1938
1939# Check if there is UTF-8 in a commit log when a mail header has explicitly
1940# declined it, i.e defined some charset where it is missing.
1941 if ($in_header_lines &&
1942 $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
1943 $1 !~ /utf-8/i) {
1944 $non_utf8_charset = 1;
1945 }
1946
1947 if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
1948 $rawline =~ /$NON_ASCII_UTF8/) {
1949 WARN("UTF8_BEFORE_PATCH",
1950 "8-bit UTF-8 used in possible commit log\n" . $herecurr);
1951 }
1952
05622191
JH
1953# ignore non-hunk lines and lines being removed
1954 next if (!$hunk_line || $line =~ /^-/);
1955
1956#trailing whitespace
1957 if ($line =~ /^\+.*\015/) {
1958 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
6b9709d9
TR
1959 if (ERROR("DOS_LINE_ENDINGS",
1960 "DOS line endings\n" . $herevet) &&
1961 $fix) {
1962 $fixed[$linenr - 1] =~ s/[\s\015]+$//;
1963 }
05622191
JH
1964 } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
1965 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
6b9709d9
TR
1966 if (ERROR("TRAILING_WHITESPACE",
1967 "trailing whitespace\n" . $herevet) &&
1968 $fix) {
1969 $fixed[$linenr - 1] =~ s/\s+$//;
1970 }
1971
05622191
JH
1972 $rpt_cleaners = 1;
1973 }
1974
6b9709d9
TR
1975# Check for FSF mailing addresses.
1976 if ($rawline =~ /\bwrite to the Free/i ||
1977 $rawline =~ /\b59\s+Temple\s+Pl/i ||
1978 $rawline =~ /\b51\s+Franklin\s+St/i) {
1979 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
1980 my $msg_type = \&ERROR;
1981 $msg_type = \&CHK if ($file);
1982 &{$msg_type}("FSF_MAILING_ADDRESS",
1983 "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)
1984 }
1985
05622191
JH
1986# check for Kconfig help text having a real description
1987# Only applies when adding the entry originally, after that we do not have
1988# sufficient context to determine whether it is indeed long enough.
1989 if ($realfile =~ /Kconfig/ &&
d45a6ae2 1990 $line =~ /.\s*config\s+/) {
05622191
JH
1991 my $length = 0;
1992 my $cnt = $realcnt;
1993 my $ln = $linenr + 1;
1994 my $f;
d45a6ae2 1995 my $is_start = 0;
05622191 1996 my $is_end = 0;
d45a6ae2 1997 for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
05622191
JH
1998 $f = $lines[$ln - 1];
1999 $cnt-- if ($lines[$ln - 1] !~ /^-/);
2000 $is_end = $lines[$ln - 1] =~ /^\+/;
05622191
JH
2001
2002 next if ($f =~ /^-/);
d45a6ae2
KP
2003
2004 if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) {
2005 $is_start = 1;
2006 } elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) {
2007 $length = -1;
2008 }
2009
05622191
JH
2010 $f =~ s/^.//;
2011 $f =~ s/#.*//;
2012 $f =~ s/^\s+//;
2013 next if ($f =~ /^$/);
2014 if ($f =~ /^\s*config\s/) {
2015 $is_end = 1;
2016 last;
2017 }
2018 $length++;
2019 }
2020 WARN("CONFIG_DESCRIPTION",
d45a6ae2
KP
2021 "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4);
2022 #print "is_start<$is_start> is_end<$is_end> length<$length>\n";
2023 }
2024
2025# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
2026 if ($realfile =~ /Kconfig/ &&
2027 $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
2028 WARN("CONFIG_EXPERIMENTAL",
2029 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2030 }
2031
2032 if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
2033 ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
2034 my $flag = $1;
2035 my $replacement = {
2036 'EXTRA_AFLAGS' => 'asflags-y',
2037 'EXTRA_CFLAGS' => 'ccflags-y',
2038 'EXTRA_CPPFLAGS' => 'cppflags-y',
2039 'EXTRA_LDFLAGS' => 'ldflags-y',
2040 };
2041
2042 WARN("DEPRECATED_VARIABLE",
2043 "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
05622191
JH
2044 }
2045
6b9709d9
TR
2046# check for DT compatible documentation
2047 if (defined $root && $realfile =~ /\.dts/ &&
2048 $rawline =~ /^\+\s*compatible\s*=/) {
2049 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
2050
2051 foreach my $compat (@compats) {
2052 my $compat2 = $compat;
2053 my $dt_path = $root . "/Documentation/devicetree/bindings/";
2054 $compat2 =~ s/\,[a-z]*\-/\,<\.\*>\-/;
2055 `grep -Erq "$compat|$compat2" $dt_path`;
2056 if ( $? >> 8 ) {
2057 WARN("UNDOCUMENTED_DT_STRING",
2058 "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
2059 }
2060
2061 my $vendor = $compat;
2062 my $vendor_path = $dt_path . "vendor-prefixes.txt";
2063 next if (! -f $vendor_path);
2064 $vendor =~ s/^([a-zA-Z0-9]+)\,.*/$1/;
2065 `grep -Eq "$vendor" $vendor_path`;
2066 if ( $? >> 8 ) {
2067 WARN("UNDOCUMENTED_DT_STRING",
2068 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vendor_path\n" . $herecurr);
2069 }
2070 }
2071 }
2072
05622191
JH
2073# check we are in a valid source file if not then ignore this hunk
2074 next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
2075
d45a6ae2 2076#line length limit
05622191
JH
2077 if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
2078 $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
2079 !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
2080 $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
d45a6ae2 2081 $length > $max_line_length)
05622191
JH
2082 {
2083 WARN("LONG_LINE",
d45a6ae2
KP
2084 "line over $max_line_length characters\n" . $herecurr);
2085 }
2086
2087# Check for user-visible strings broken across lines, which breaks the ability
6b9709d9
TR
2088# to grep for the string. Make exceptions when the previous string ends in a
2089# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
2090# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
d45a6ae2
KP
2091 if ($line =~ /^\+\s*"/ &&
2092 $prevline =~ /"\s*$/ &&
6b9709d9 2093 $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
d45a6ae2
KP
2094 WARN("SPLIT_STRING",
2095 "quoted string split across lines\n" . $hereprev);
05622191
JH
2096 }
2097
2098# check for spaces before a quoted newline
2099 if ($rawline =~ /^.*\".*\s\\n/) {
6b9709d9
TR
2100 if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
2101 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
2102 $fix) {
2103 $fixed[$linenr - 1] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
2104 }
2105
05622191
JH
2106 }
2107
2108# check for adding lines without a newline.
2109 if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
2110 WARN("MISSING_EOF_NEWLINE",
2111 "adding a line without newline at end of file\n" . $herecurr);
2112 }
2113
2114# Blackfin: use hi/lo macros
2115 if ($realfile =~ m@arch/blackfin/.*\.S$@) {
2116 if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
2117 my $herevet = "$here\n" . cat_vet($line) . "\n";
2118 ERROR("LO_MACRO",
2119 "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
2120 }
2121 if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
2122 my $herevet = "$here\n" . cat_vet($line) . "\n";
2123 ERROR("HI_MACRO",
2124 "use the HI() macro, not (... >> 16)\n" . $herevet);
2125 }
2126 }
2127
2128# check we are in a valid source file C or perl if not then ignore this hunk
2129 next if ($realfile !~ /\.(h|c|pl)$/);
2130
2131# at the beginning of a line any tabs must come first and anything
2132# more than 8 must use tabs.
2133 if ($rawline =~ /^\+\s* \t\s*\S/ ||
2134 $rawline =~ /^\+\s* \s*/) {
2135 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
05622191 2136 $rpt_cleaners = 1;
6b9709d9
TR
2137 if (ERROR("CODE_INDENT",
2138 "code indent should use tabs where possible\n" . $herevet) &&
2139 $fix) {
2140 $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
2141 }
05622191
JH
2142 }
2143
2144# check for space before tabs.
2145 if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
2146 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
6b9709d9
TR
2147 if (WARN("SPACE_BEFORE_TAB",
2148 "please, no space before tabs\n" . $herevet) &&
2149 $fix) {
2150 while ($fixed[$linenr - 1] =~
e3a4facd 2151 s/(^\+.*) {8,8}\t/$1\t\t/) {}
6b9709d9
TR
2152 while ($fixed[$linenr - 1] =~
2153 s/(^\+.*) +\t/$1\t/) {}
2154 }
05622191
JH
2155 }
2156
d45a6ae2
KP
2157# check for && or || at the start of a line
2158 if ($rawline =~ /^\+\s*(&&|\|\|)/) {
2159 CHK("LOGICAL_CONTINUATIONS",
2160 "Logical continuations should be on the previous line\n" . $hereprev);
2161 }
2162
2163# check multi-line statement indentation matches previous line
2164 if ($^V && $^V ge 5.10.0 &&
2165 $prevline =~ /^\+(\t*)(if \(|$Ident\().*(\&\&|\|\||,)\s*$/) {
2166 $prevline =~ /^\+(\t*)(.*)$/;
2167 my $oldindent = $1;
2168 my $rest = $2;
2169
2170 my $pos = pos_last_openparen($rest);
2171 if ($pos >= 0) {
2172 $line =~ /^(\+| )([ \t]*)/;
2173 my $newindent = $2;
2174
2175 my $goodtabindent = $oldindent .
2176 "\t" x ($pos / 8) .
2177 " " x ($pos % 8);
2178 my $goodspaceindent = $oldindent . " " x $pos;
2179
2180 if ($newindent ne $goodtabindent &&
2181 $newindent ne $goodspaceindent) {
6b9709d9
TR
2182
2183 if (CHK("PARENTHESIS_ALIGNMENT",
2184 "Alignment should match open parenthesis\n" . $hereprev) &&
2185 $fix && $line =~ /^\+/) {
2186 $fixed[$linenr - 1] =~
2187 s/^\+[ \t]*/\+$goodtabindent/;
2188 }
d45a6ae2
KP
2189 }
2190 }
2191 }
2192
6b9709d9
TR
2193 if ($line =~ /^\+.*\*[ \t]*\)[ \t]+(?!$Assignment|$Arithmetic)/) {
2194 if (CHK("SPACING",
2195 "No space is necessary after a cast\n" . $hereprev) &&
2196 $fix) {
2197 $fixed[$linenr - 1] =~
2198 s/^(\+.*\*[ \t]*\))[ \t]+/$1/;
2199 }
d45a6ae2
KP
2200 }
2201
2202 if ($realfile =~ m@^(drivers/net/|net/)@ &&
6b9709d9
TR
2203 $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
2204 $rawline =~ /^\+[ \t]*\*/) {
d45a6ae2
KP
2205 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2206 "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
2207 }
2208
6b9709d9
TR
2209 if ($realfile =~ m@^(drivers/net/|net/)@ &&
2210 $prevrawline =~ /^\+[ \t]*\/\*/ && #starting /*
2211 $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */
2212 $rawline =~ /^\+/ && #line is new
2213 $rawline !~ /^\+[ \t]*\*/) { #no leading *
2214 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2215 "networking block comments start with * on subsequent lines\n" . $hereprev);
2216 }
2217
d45a6ae2
KP
2218 if ($realfile =~ m@^(drivers/net/|net/)@ &&
2219 $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */
2220 $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/
2221 $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/
2222 $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */
2223 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2224 "networking block comments put the trailing */ on a separate line\n" . $herecurr);
2225 }
2226
05622191
JH
2227# check for spaces at the beginning of a line.
2228# Exceptions:
2229# 1) within comments
2230# 2) indented preprocessor commands
2231# 3) hanging labels
6b9709d9 2232 if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) {
05622191 2233 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
6b9709d9
TR
2234 if (WARN("LEADING_SPACE",
2235 "please, no spaces at the start of a line\n" . $herevet) &&
2236 $fix) {
2237 $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
2238 }
05622191
JH
2239 }
2240
2241# check we are in a valid C source file if not then ignore this hunk
2242 next if ($realfile !~ /\.(h|c)$/);
2243
d45a6ae2
KP
2244# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
2245 if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
2246 WARN("CONFIG_EXPERIMENTAL",
2247 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2248 }
2249
05622191
JH
2250# check for RCS/CVS revision markers
2251 if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
2252 WARN("CVS_KEYWORD",
2253 "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
2254 }
2255
2256# Blackfin: don't use __builtin_bfin_[cs]sync
2257 if ($line =~ /__builtin_bfin_csync/) {
2258 my $herevet = "$here\n" . cat_vet($line) . "\n";
2259 ERROR("CSYNC",
2260 "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
2261 }
2262 if ($line =~ /__builtin_bfin_ssync/) {
2263 my $herevet = "$here\n" . cat_vet($line) . "\n";
2264 ERROR("SSYNC",
2265 "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
2266 }
2267
d45a6ae2
KP
2268# check for old HOTPLUG __dev<foo> section markings
2269 if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
2270 WARN("HOTPLUG_SECTION",
2271 "Using $1 is unnecessary\n" . $herecurr);
2272 }
2273
05622191
JH
2274# Check for potential 'bare' types
2275 my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
2276 $realline_next);
d45a6ae2
KP
2277#print "LINE<$line>\n";
2278 if ($linenr >= $suppress_statement &&
6b9709d9 2279 $realcnt && $sline =~ /.\s*\S/) {
05622191
JH
2280 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
2281 ctx_statement_block($linenr, $realcnt, 0);
2282 $stat =~ s/\n./\n /g;
2283 $cond =~ s/\n./\n /g;
2284
d45a6ae2
KP
2285#print "linenr<$linenr> <$stat>\n";
2286 # If this statement has no statement boundaries within
2287 # it there is no point in retrying a statement scan
2288 # until we hit end of it.
2289 my $frag = $stat; $frag =~ s/;+\s*$//;
2290 if ($frag !~ /(?:{|;)/) {
2291#print "skip<$line_nr_next>\n";
2292 $suppress_statement = $line_nr_next;
2293 }
2294
05622191
JH
2295 # Find the real next line.
2296 $realline_next = $line_nr_next;
2297 if (defined $realline_next &&
2298 (!defined $lines[$realline_next - 1] ||
2299 substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
2300 $realline_next++;
2301 }
2302
2303 my $s = $stat;
2304 $s =~ s/{.*$//s;
2305
2306 # Ignore goto labels.
2307 if ($s =~ /$Ident:\*$/s) {
2308
2309 # Ignore functions being called
2310 } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
2311
2312 } elsif ($s =~ /^.\s*else\b/s) {
2313
2314 # declarations always start with types
2315 } 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) {
2316 my $type = $1;
2317 $type =~ s/\s+/ /g;
2318 possible($type, "A:" . $s);
2319
2320 # definitions in global scope can only start with types
2321 } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
2322 possible($1, "B:" . $s);
2323 }
2324
2325 # any (foo ... *) is a pointer cast, and foo is a type
2326 while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
2327 possible($1, "C:" . $s);
2328 }
2329
2330 # Check for any sort of function declaration.
2331 # int foo(something bar, other baz);
2332 # void (*store_gdt)(x86_descr_ptr *);
2333 if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
2334 my ($name_len) = length($1);
2335
2336 my $ctx = $s;
2337 substr($ctx, 0, $name_len + 1, '');
2338 $ctx =~ s/\)[^\)]*$//;
2339
2340 for my $arg (split(/\s*,\s*/, $ctx)) {
2341 if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
2342
2343 possible($1, "D:" . $s);
2344 }
2345 }
2346 }
2347
2348 }
2349
2350#
2351# Checks which may be anchored in the context.
2352#
2353
2354# Check for switch () and associated case and default
2355# statements should be at the same indent.
2356 if ($line=~/\bswitch\s*\(.*\)/) {
2357 my $err = '';
2358 my $sep = '';
2359 my @ctx = ctx_block_outer($linenr, $realcnt);
2360 shift(@ctx);
2361 for my $ctx (@ctx) {
2362 my ($clen, $cindent) = line_stats($ctx);
2363 if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
2364 $indent != $cindent) {
2365 $err .= "$sep$ctx\n";
2366 $sep = '';
2367 } else {
2368 $sep = "[...]\n";
2369 }
2370 }
2371 if ($err ne '') {
2372 ERROR("SWITCH_CASE_INDENT_LEVEL",
2373 "switch and case should be at the same indent\n$hereline$err");
2374 }
2375 }
2376
2377# if/while/etc brace do not go on next line, unless defining a do while loop,
2378# or if that brace on the next line is for something else
2379 if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
2380 my $pre_ctx = "$1$2";
2381
2382 my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
d45a6ae2
KP
2383
2384 if ($line =~ /^\+\t{6,}/) {
2385 WARN("DEEP_INDENTATION",
2386 "Too many leading tabs - consider code refactoring\n" . $herecurr);
2387 }
2388
05622191
JH
2389 my $ctx_cnt = $realcnt - $#ctx - 1;
2390 my $ctx = join("\n", @ctx);
2391
2392 my $ctx_ln = $linenr;
2393 my $ctx_skip = $realcnt;
2394
2395 while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
2396 defined $lines[$ctx_ln - 1] &&
2397 $lines[$ctx_ln - 1] =~ /^-/)) {
2398 ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
2399 $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
2400 $ctx_ln++;
2401 }
2402
2403 #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
2404 #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
2405
2406 if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
2407 ERROR("OPEN_BRACE",
2408 "that open brace { should be on the previous line\n" .
2409 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
2410 }
2411 if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
2412 $ctx =~ /\)\s*\;\s*$/ &&
2413 defined $lines[$ctx_ln - 1])
2414 {
2415 my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
2416 if ($nindent > $indent) {
2417 WARN("TRAILING_SEMICOLON",
2418 "trailing semicolon indicates no statements, indent implies otherwise\n" .
2419 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
2420 }
2421 }
2422 }
2423
2424# Check relative indent for conditionals and blocks.
2425 if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
d45a6ae2
KP
2426 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
2427 ctx_statement_block($linenr, $realcnt, 0)
2428 if (!defined $stat);
05622191
JH
2429 my ($s, $c) = ($stat, $cond);
2430
2431 substr($s, 0, length($c), '');
2432
2433 # Make sure we remove the line prefixes as we have
2434 # none on the first line, and are going to readd them
2435 # where necessary.
2436 $s =~ s/\n./\n/gs;
2437
2438 # Find out how long the conditional actually is.
2439 my @newlines = ($c =~ /\n/gs);
2440 my $cond_lines = 1 + $#newlines;
2441
2442 # We want to check the first line inside the block
2443 # starting at the end of the conditional, so remove:
2444 # 1) any blank line termination
2445 # 2) any opening brace { on end of the line
2446 # 3) any do (...) {
2447 my $continuation = 0;
2448 my $check = 0;
2449 $s =~ s/^.*\bdo\b//;
2450 $s =~ s/^\s*{//;
2451 if ($s =~ s/^\s*\\//) {
2452 $continuation = 1;
2453 }
2454 if ($s =~ s/^\s*?\n//) {
2455 $check = 1;
2456 $cond_lines++;
2457 }
2458
2459 # Also ignore a loop construct at the end of a
2460 # preprocessor statement.
2461 if (($prevline =~ /^.\s*#\s*define\s/ ||
2462 $prevline =~ /\\\s*$/) && $continuation == 0) {
2463 $check = 0;
2464 }
2465
2466 my $cond_ptr = -1;
2467 $continuation = 0;
2468 while ($cond_ptr != $cond_lines) {
2469 $cond_ptr = $cond_lines;
2470
2471 # If we see an #else/#elif then the code
2472 # is not linear.
2473 if ($s =~ /^\s*\#\s*(?:else|elif)/) {
2474 $check = 0;
2475 }
2476
2477 # Ignore:
2478 # 1) blank lines, they should be at 0,
2479 # 2) preprocessor lines, and
2480 # 3) labels.
2481 if ($continuation ||
2482 $s =~ /^\s*?\n/ ||
2483 $s =~ /^\s*#\s*?/ ||
2484 $s =~ /^\s*$Ident\s*:/) {
2485 $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
2486 if ($s =~ s/^.*?\n//) {
2487 $cond_lines++;
2488 }
2489 }
2490 }
2491
2492 my (undef, $sindent) = line_stats("+" . $s);
2493 my $stat_real = raw_line($linenr, $cond_lines);
2494
2495 # Check if either of these lines are modified, else
2496 # this is not this patch's fault.
2497 if (!defined($stat_real) ||
2498 $stat !~ /^\+/ && $stat_real !~ /^\+/) {
2499 $check = 0;
2500 }
2501 if (defined($stat_real) && $cond_lines > 1) {
2502 $stat_real = "[...]\n$stat_real";
2503 }
2504
2505 #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";
2506
2507 if ($check && (($sindent % 8) != 0 ||
2508 ($sindent <= $indent && $s ne ''))) {
2509 WARN("SUSPECT_CODE_INDENT",
2510 "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
2511 }
2512 }
2513
2514 # Track the 'values' across context and added lines.
2515 my $opline = $line; $opline =~ s/^./ /;
2516 my ($curr_values, $curr_vars) =
2517 annotate_values($opline . "\n", $prev_values);
2518 $curr_values = $prev_values . $curr_values;
2519 if ($dbg_values) {
2520 my $outline = $opline; $outline =~ s/\t/ /g;
2521 print "$linenr > .$outline\n";
2522 print "$linenr > $curr_values\n";
2523 print "$linenr > $curr_vars\n";
2524 }
2525 $prev_values = substr($curr_values, -1);
2526
2527#ignore lines not being added
6b9709d9 2528 next if ($line =~ /^[^\+]/);
05622191
JH
2529
2530# TEST: allow direct testing of the type matcher.
2531 if ($dbg_type) {
2532 if ($line =~ /^.\s*$Declare\s*$/) {
2533 ERROR("TEST_TYPE",
2534 "TEST: is type\n" . $herecurr);
2535 } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
2536 ERROR("TEST_NOT_TYPE",
2537 "TEST: is not type ($1 is)\n". $herecurr);
2538 }
2539 next;
2540 }
2541# TEST: allow direct testing of the attribute matcher.
2542 if ($dbg_attr) {
2543 if ($line =~ /^.\s*$Modifier\s*$/) {
2544 ERROR("TEST_ATTR",
2545 "TEST: is attr\n" . $herecurr);
2546 } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
2547 ERROR("TEST_NOT_ATTR",
2548 "TEST: is not attr ($1 is)\n". $herecurr);
2549 }
2550 next;
2551 }
2552
2553# check for initialisation to aggregates open brace on the next line
2554 if ($line =~ /^.\s*{/ &&
2555 $prevline =~ /(?:^|[^=])=\s*$/) {
2556 ERROR("OPEN_BRACE",
2557 "that open brace { should be on the previous line\n" . $hereprev);
2558 }
2559
2560#
2561# Checks which are anchored on the added line.
2562#
2563
2564# check for malformed paths in #include statements (uses RAW line)
2565 if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
2566 my $path = $1;
2567 if ($path =~ m{//}) {
2568 ERROR("MALFORMED_INCLUDE",
d45a6ae2
KP
2569 "malformed #include filename\n" . $herecurr);
2570 }
2571 if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
2572 ERROR("UAPI_INCLUDE",
2573 "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
05622191
JH
2574 }
2575 }
2576
2577# no C99 // comments
2578 if ($line =~ m{//}) {
6b9709d9
TR
2579 if (ERROR("C99_COMMENTS",
2580 "do not use C99 // comments\n" . $herecurr) &&
2581 $fix) {
2582 my $line = $fixed[$linenr - 1];
2583 if ($line =~ /\/\/(.*)$/) {
2584 my $comment = trim($1);
2585 $fixed[$linenr - 1] =~ s@\/\/(.*)$@/\* $comment \*/@;
2586 }
2587 }
05622191
JH
2588 }
2589 # Remove C99 comments.
2590 $line =~ s@//.*@@;
2591 $opline =~ s@//.*@@;
2592
2593# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
2594# the whole statement.
2595#print "APW <$lines[$realline_next - 1]>\n";
2596 if (defined $realline_next &&
2597 exists $lines[$realline_next - 1] &&
2598 !defined $suppress_export{$realline_next} &&
2599 ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2600 $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2601 # Handle definitions which produce identifiers with
2602 # a prefix:
2603 # XXX(foo);
2604 # EXPORT_SYMBOL(something_foo);
2605 my $name = $1;
d45a6ae2 2606 if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
05622191
JH
2607 $name =~ /^${Ident}_$2/) {
2608#print "FOO C name<$name>\n";
2609 $suppress_export{$realline_next} = 1;
2610
2611 } elsif ($stat !~ /(?:
2612 \n.}\s*$|
2613 ^.DEFINE_$Ident\(\Q$name\E\)|
2614 ^.DECLARE_$Ident\(\Q$name\E\)|
2615 ^.LIST_HEAD\(\Q$name\E\)|
2616 ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
2617 \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
2618 )/x) {
2619#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
2620 $suppress_export{$realline_next} = 2;
2621 } else {
2622 $suppress_export{$realline_next} = 1;
2623 }
2624 }
2625 if (!defined $suppress_export{$linenr} &&
2626 $prevline =~ /^.\s*$/ &&
2627 ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2628 $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2629#print "FOO B <$lines[$linenr - 1]>\n";
2630 $suppress_export{$linenr} = 2;
2631 }
2632 if (defined $suppress_export{$linenr} &&
2633 $suppress_export{$linenr} == 2) {
2634 WARN("EXPORT_SYMBOL",
2635 "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
2636 }
2637
2638# check for global initialisers.
6b9709d9
TR
2639 if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) {
2640 if (ERROR("GLOBAL_INITIALISERS",
2641 "do not initialise globals to 0 or NULL\n" .
2642 $herecurr) &&
2643 $fix) {
2644 $fixed[$linenr - 1] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/;
2645 }
05622191
JH
2646 }
2647# check for static initialisers.
6b9709d9
TR
2648 if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
2649 if (ERROR("INITIALISED_STATIC",
2650 "do not initialise statics to 0 or NULL\n" .
2651 $herecurr) &&
2652 $fix) {
2653 $fixed[$linenr - 1] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/;
2654 }
05622191
JH
2655 }
2656
2657# check for static const char * arrays.
2658 if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
2659 WARN("STATIC_CONST_CHAR_ARRAY",
2660 "static const char * array should probably be static const char * const\n" .
2661 $herecurr);
2662 }
2663
2664# check for static char foo[] = "bar" declarations.
2665 if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
2666 WARN("STATIC_CONST_CHAR_ARRAY",
2667 "static char array declaration should probably be static const char\n" .
2668 $herecurr);
2669 }
2670
6b9709d9
TR
2671# check for function declarations without arguments like "int foo()"
2672 if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
2673 if (ERROR("FUNCTION_WITHOUT_ARGS",
2674 "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
2675 $fix) {
2676 $fixed[$linenr - 1] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
2677 }
2678 }
2679
2680# check for uses of DEFINE_PCI_DEVICE_TABLE
2681 if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) {
2682 if (WARN("DEFINE_PCI_DEVICE_TABLE",
2683 "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) &&
2684 $fix) {
2685 $fixed[$linenr - 1] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /;
2686 }
05622191
JH
2687 }
2688
2689# check for new typedefs, only function parameters and sparse annotations
2690# make sense.
2691 if ($line =~ /\btypedef\s/ &&
2692 $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
2693 $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
2694 $line !~ /\b$typeTypedefs\b/ &&
2695 $line !~ /\b__bitwise(?:__|)\b/) {
2696 WARN("NEW_TYPEDEFS",
2697 "do not add new typedefs\n" . $herecurr);
2698 }
2699
2700# * goes on variable not on type
2701 # (char*[ const])
d45a6ae2
KP
2702 while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
2703 #print "AA<$1>\n";
6b9709d9 2704 my ($ident, $from, $to) = ($1, $2, $2);
05622191
JH
2705
2706 # Should start with a space.
2707 $to =~ s/^(\S)/ $1/;
2708 # Should not end with a space.
2709 $to =~ s/\s+$//;
2710 # '*'s should not have spaces between.
2711 while ($to =~ s/\*\s+\*/\*\*/) {
2712 }
2713
6b9709d9 2714## print "1: from<$from> to<$to> ident<$ident>\n";
05622191 2715 if ($from ne $to) {
6b9709d9
TR
2716 if (ERROR("POINTER_LOCATION",
2717 "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) &&
2718 $fix) {
2719 my $sub_from = $ident;
2720 my $sub_to = $ident;
2721 $sub_to =~ s/\Q$from\E/$to/;
2722 $fixed[$linenr - 1] =~
2723 s@\Q$sub_from\E@$sub_to@;
2724 }
05622191 2725 }
d45a6ae2
KP
2726 }
2727 while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
2728 #print "BB<$1>\n";
6b9709d9 2729 my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
05622191
JH
2730
2731 # Should start with a space.
2732 $to =~ s/^(\S)/ $1/;
2733 # Should not end with a space.
2734 $to =~ s/\s+$//;
2735 # '*'s should not have spaces between.
2736 while ($to =~ s/\*\s+\*/\*\*/) {
2737 }
2738 # Modifiers should have spaces.
2739 $to =~ s/(\b$Modifier$)/$1 /;
2740
6b9709d9 2741## print "2: from<$from> to<$to> ident<$ident>\n";
05622191 2742 if ($from ne $to && $ident !~ /^$Modifier$/) {
6b9709d9
TR
2743 if (ERROR("POINTER_LOCATION",
2744 "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) &&
2745 $fix) {
2746
2747 my $sub_from = $match;
2748 my $sub_to = $match;
2749 $sub_to =~ s/\Q$from\E/$to/;
2750 $fixed[$linenr - 1] =~
2751 s@\Q$sub_from\E@$sub_to@;
2752 }
05622191
JH
2753 }
2754 }
2755
2756# # no BUG() or BUG_ON()
2757# if ($line =~ /\b(BUG|BUG_ON)\b/) {
2758# print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n";
2759# print "$herecurr";
2760# $clean = 0;
2761# }
2762
2763 if ($line =~ /\bLINUX_VERSION_CODE\b/) {
2764 WARN("LINUX_VERSION_CODE",
2765 "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
2766 }
2767
2768# check for uses of printk_ratelimit
2769 if ($line =~ /\bprintk_ratelimit\s*\(/) {
2770 WARN("PRINTK_RATELIMITED",
2771"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
2772 }
2773
2774# printk should use KERN_* levels. Note that follow on printk's on the
2775# same line do not need a level, so we use the current block context
2776# to try and find and validate the current printk. In summary the current
2777# printk includes all preceding printk's which have no newline on the end.
2778# we assume the first bad printk is the one to report.
2779 if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
2780 my $ok = 0;
2781 for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
2782 #print "CHECK<$lines[$ln - 1]\n";
2783 # we have a preceding printk if it ends
2784 # with "\n" ignore it, else it is to blame
2785 if ($lines[$ln - 1] =~ m{\bprintk\(}) {
2786 if ($rawlines[$ln - 1] !~ m{\\n"}) {
2787 $ok = 1;
2788 }
2789 last;
2790 }
2791 }
2792 if ($ok == 0) {
2793 WARN("PRINTK_WITHOUT_KERN_LEVEL",
2794 "printk() should include KERN_ facility level\n" . $herecurr);
2795 }
2796 }
2797
d45a6ae2
KP
2798 if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
2799 my $orig = $1;
2800 my $level = lc($orig);
2801 $level = "warn" if ($level eq "warning");
2802 my $level2 = $level;
2803 $level2 = "dbg" if ($level eq "debug");
2804 WARN("PREFER_PR_LEVEL",
2805 "Prefer netdev_$level2(netdev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr);
2806 }
2807
2808 if ($line =~ /\bpr_warning\s*\(/) {
6b9709d9
TR
2809 if (WARN("PREFER_PR_LEVEL",
2810 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
2811 $fix) {
2812 $fixed[$linenr - 1] =~
2813 s/\bpr_warning\b/pr_warn/;
2814 }
d45a6ae2
KP
2815 }
2816
2817 if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
2818 my $orig = $1;
2819 my $level = lc($orig);
2820 $level = "warn" if ($level eq "warning");
2821 $level = "dbg" if ($level eq "debug");
2822 WARN("PREFER_DEV_LEVEL",
2823 "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
2824 }
2825
05622191
JH
2826# function brace can't be on same line, except for #defines of do while,
2827# or if closed on same line
d8a1a304
HS
2828 if (($line=~/$Type\s*$Ident\(.*\).*\s\{/) and
2829 !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) {
05622191
JH
2830 ERROR("OPEN_BRACE",
2831 "open brace '{' following function declarations go on the next line\n" . $herecurr);
2832 }
2833
2834# open braces for enum, union and struct go on the same line.
2835 if ($line =~ /^.\s*{/ &&
2836 $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
2837 ERROR("OPEN_BRACE",
2838 "open brace '{' following $1 go on the same line\n" . $hereprev);
2839 }
2840
2841# missing space after union, struct or enum definition
6b9709d9
TR
2842 if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
2843 if (WARN("SPACING",
2844 "missing space after $1 definition\n" . $herecurr) &&
2845 $fix) {
2846 $fixed[$linenr - 1] =~
2847 s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
2848 }
2849 }
2850
2851# Function pointer declarations
2852# check spacing between type, funcptr, and args
2853# canonical declaration is "type (*funcptr)(args...)"
2854#
2855# the $Declare variable will capture all spaces after the type
2856# so check it for trailing missing spaces or multiple spaces
2857 if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)$Ident(\s*)\)(\s*)\(/) {
2858 my $declare = $1;
2859 my $pre_pointer_space = $2;
2860 my $post_pointer_space = $3;
2861 my $funcname = $4;
2862 my $post_funcname_space = $5;
2863 my $pre_args_space = $6;
2864
2865 if ($declare !~ /\s$/) {
2866 WARN("SPACING",
2867 "missing space after return type\n" . $herecurr);
2868 }
2869
2870# unnecessary space "type (*funcptr)(args...)"
2871 elsif ($declare =~ /\s{2,}$/) {
2872 WARN("SPACING",
2873 "Multiple spaces after return type\n" . $herecurr);
2874 }
2875
2876# unnecessary space "type ( *funcptr)(args...)"
2877 if (defined $pre_pointer_space &&
2878 $pre_pointer_space =~ /^\s/) {
2879 WARN("SPACING",
2880 "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
2881 }
2882
2883# unnecessary space "type (* funcptr)(args...)"
2884 if (defined $post_pointer_space &&
2885 $post_pointer_space =~ /^\s/) {
2886 WARN("SPACING",
2887 "Unnecessary space before function pointer name\n" . $herecurr);
2888 }
2889
2890# unnecessary space "type (*funcptr )(args...)"
2891 if (defined $post_funcname_space &&
2892 $post_funcname_space =~ /^\s/) {
2893 WARN("SPACING",
2894 "Unnecessary space after function pointer name\n" . $herecurr);
2895 }
2896
2897# unnecessary space "type (*funcptr) (args...)"
2898 if (defined $pre_args_space &&
2899 $pre_args_space =~ /^\s/) {
2900 WARN("SPACING",
2901 "Unnecessary space before function pointer arguments\n" . $herecurr);
2902 }
2903
2904 if (show_type("SPACING") && $fix) {
2905 $fixed[$linenr - 1] =~
2906 s/^(.\s*$Declare)\(\s*\*\s*($Ident)\s*\)\s*\(/rtrim($1) . " " . "\(\*$2\)\("/ex;
2907 }
05622191
JH
2908 }
2909
2910# check for spacing round square brackets; allowed:
2911# 1. with a type on the left -- int [] a;
2912# 2. at the beginning of a line for slice initialisers -- [0...10] = 5,
2913# 3. inside a curly brace -- = { [0...10] = 5 }
2914 while ($line =~ /(.*?\s)\[/g) {
2915 my ($where, $prefix) = ($-[1], $1);
2916 if ($prefix !~ /$Type\s+$/ &&
2917 ($where != 0 || $prefix !~ /^.\s+$/) &&
d45a6ae2 2918 $prefix !~ /[{,]\s+$/) {
6b9709d9
TR
2919 if (ERROR("BRACKET_SPACE",
2920 "space prohibited before open square bracket '['\n" . $herecurr) &&
2921 $fix) {
2922 $fixed[$linenr - 1] =~
2923 s/^(\+.*?)\s+\[/$1\[/;
2924 }
05622191
JH
2925 }
2926 }
2927
2928# check for spaces between functions and their parentheses.
2929 while ($line =~ /($Ident)\s+\(/g) {
2930 my $name = $1;
2931 my $ctx_before = substr($line, 0, $-[1]);
2932 my $ctx = "$ctx_before$name";
2933
2934 # Ignore those directives where spaces _are_ permitted.
2935 if ($name =~ /^(?:
2936 if|for|while|switch|return|case|
2937 volatile|__volatile__|
2938 __attribute__|format|__extension__|
2939 asm|__asm__)$/x)
2940 {
05622191
JH
2941 # cpp #define statements have non-optional spaces, ie
2942 # if there is a space between the name and the open
2943 # parenthesis it is simply not a parameter group.
2944 } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
2945
2946 # cpp #elif statement condition may start with a (
2947 } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
2948
2949 # If this whole things ends with a type its most
2950 # likely a typedef for a function.
2951 } elsif ($ctx =~ /$Type$/) {
2952
2953 } else {
6b9709d9
TR
2954 if (WARN("SPACING",
2955 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
2956 $fix) {
2957 $fixed[$linenr - 1] =~
2958 s/\b$name\s+\(/$name\(/;
2959 }
05622191
JH
2960 }
2961 }
d45a6ae2 2962
05622191
JH
2963# Check operator spacing.
2964 if (!($line=~/\#\s*include/)) {
6b9709d9
TR
2965 my $fixed_line = "";
2966 my $line_fixed = 0;
2967
05622191
JH
2968 my $ops = qr{
2969 <<=|>>=|<=|>=|==|!=|
2970 \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
2971 =>|->|<<|>>|<|>|=|!|~|
2972 &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
6b9709d9 2973 \?:|\?|:
05622191
JH
2974 }x;
2975 my @elements = split(/($ops|;)/, $opline);
6b9709d9
TR
2976
2977## print("element count: <" . $#elements . ">\n");
2978## foreach my $el (@elements) {
2979## print("el: <$el>\n");
2980## }
2981
2982 my @fix_elements = ();
05622191
JH
2983 my $off = 0;
2984
6b9709d9
TR
2985 foreach my $el (@elements) {
2986 push(@fix_elements, substr($rawline, $off, length($el)));
2987 $off += length($el);
2988 }
2989
2990 $off = 0;
2991
05622191 2992 my $blank = copy_spacing($opline);
6b9709d9 2993 my $last_after = -1;
05622191
JH
2994
2995 for (my $n = 0; $n < $#elements; $n += 2) {
6b9709d9
TR
2996
2997 my $good = $fix_elements[$n] . $fix_elements[$n + 1];
2998
2999## print("n: <$n> good: <$good>\n");
3000
05622191
JH
3001 $off += length($elements[$n]);
3002
3003 # Pick up the preceding and succeeding characters.
3004 my $ca = substr($opline, 0, $off);
3005 my $cc = '';
3006 if (length($opline) >= ($off + length($elements[$n + 1]))) {
3007 $cc = substr($opline, $off + length($elements[$n + 1]));
3008 }
3009 my $cb = "$ca$;$cc";
3010
3011 my $a = '';
3012 $a = 'V' if ($elements[$n] ne '');
3013 $a = 'W' if ($elements[$n] =~ /\s$/);
3014 $a = 'C' if ($elements[$n] =~ /$;$/);
3015 $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
3016 $a = 'O' if ($elements[$n] eq '');
3017 $a = 'E' if ($ca =~ /^\s*$/);
3018
3019 my $op = $elements[$n + 1];
3020
3021 my $c = '';
3022 if (defined $elements[$n + 2]) {
3023 $c = 'V' if ($elements[$n + 2] ne '');
3024 $c = 'W' if ($elements[$n + 2] =~ /^\s/);
3025 $c = 'C' if ($elements[$n + 2] =~ /^$;/);
3026 $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
3027 $c = 'O' if ($elements[$n + 2] eq '');
3028 $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
3029 } else {
3030 $c = 'E';
3031 }
3032
3033 my $ctx = "${a}x${c}";
3034
3035 my $at = "(ctx:$ctx)";
3036
3037 my $ptr = substr($blank, 0, $off) . "^";
3038 my $hereptr = "$hereline$ptr\n";
3039
3040 # Pull out the value of this operator.
3041 my $op_type = substr($curr_values, $off + 1, 1);
3042
3043 # Get the full operator variant.
3044 my $opv = $op . substr($curr_vars, $off, 1);
3045
3046 # Ignore operators passed as parameters.
3047 if ($op_type ne 'V' &&
3048 $ca =~ /\s$/ && $cc =~ /^\s*,/) {
3049
3050# # Ignore comments
3051# } elsif ($op =~ /^$;+$/) {
3052
3053 # ; should have either the end of line or a space or \ after it
3054 } elsif ($op eq ';') {
3055 if ($ctx !~ /.x[WEBC]/ &&
3056 $cc !~ /^\\/ && $cc !~ /^;/) {
6b9709d9
TR
3057 if (ERROR("SPACING",
3058 "space required after that '$op' $at\n" . $hereptr)) {
3059 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3060 $line_fixed = 1;
3061 }
05622191
JH
3062 }
3063
3064 # // is a comment
3065 } elsif ($op eq '//') {
3066
3067 # No spaces for:
3068 # ->
3069 # : when part of a bitfield
3070 } elsif ($op eq '->' || $opv eq ':B') {
3071 if ($ctx =~ /Wx.|.xW/) {
6b9709d9
TR
3072 if (ERROR("SPACING",
3073 "spaces prohibited around that '$op' $at\n" . $hereptr)) {
3074 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3075 if (defined $fix_elements[$n + 2]) {
3076 $fix_elements[$n + 2] =~ s/^\s+//;
3077 }
3078 $line_fixed = 1;
3079 }
05622191
JH
3080 }
3081
3082 # , must have a space on the right.
3083 } elsif ($op eq ',') {
3084 if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
6b9709d9
TR
3085 if (ERROR("SPACING",
3086 "space required after that '$op' $at\n" . $hereptr)) {
3087 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3088 $line_fixed = 1;
3089 $last_after = $n;
3090 }
05622191
JH
3091 }
3092
3093 # '*' as part of a type definition -- reported already.
3094 } elsif ($opv eq '*_') {
3095 #warn "'*' is part of type\n";
3096
3097 # unary operators should have a space before and
3098 # none after. May be left adjacent to another
3099 # unary operator, or a cast
3100 } elsif ($op eq '!' || $op eq '~' ||
3101 $opv eq '*U' || $opv eq '-U' ||
3102 $opv eq '&U' || $opv eq '&&U') {
3103 if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
6b9709d9
TR
3104 if (ERROR("SPACING",
3105 "space required before that '$op' $at\n" . $hereptr)) {
3106 if ($n != $last_after + 2) {
3107 $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
3108 $line_fixed = 1;
3109 }
3110 }
05622191
JH
3111 }
3112 if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
3113 # A unary '*' may be const
3114
3115 } elsif ($ctx =~ /.xW/) {
6b9709d9
TR
3116 if (ERROR("SPACING",
3117 "space prohibited after that '$op' $at\n" . $hereptr)) {
3118 $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
3119 if (defined $fix_elements[$n + 2]) {
3120 $fix_elements[$n + 2] =~ s/^\s+//;
3121 }
3122 $line_fixed = 1;
3123 }
05622191
JH
3124 }
3125
3126 # unary ++ and unary -- are allowed no space on one side.
3127 } elsif ($op eq '++' or $op eq '--') {
3128 if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
6b9709d9
TR
3129 if (ERROR("SPACING",
3130 "space required one side of that '$op' $at\n" . $hereptr)) {
3131 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3132 $line_fixed = 1;
3133 }
05622191
JH
3134 }
3135 if ($ctx =~ /Wx[BE]/ ||
3136 ($ctx =~ /Wx./ && $cc =~ /^;/)) {
6b9709d9
TR
3137 if (ERROR("SPACING",
3138 "space prohibited before that '$op' $at\n" . $hereptr)) {
3139 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3140 $line_fixed = 1;
3141 }
05622191
JH
3142 }
3143 if ($ctx =~ /ExW/) {
6b9709d9
TR
3144 if (ERROR("SPACING",
3145 "space prohibited after that '$op' $at\n" . $hereptr)) {
3146 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
3147 if (defined $fix_elements[$n + 2]) {
3148 $fix_elements[$n + 2] =~ s/^\s+//;
3149 }
3150 $line_fixed = 1;
3151 }
05622191
JH
3152 }
3153
05622191
JH
3154 # << and >> may either have or not have spaces both sides
3155 } elsif ($op eq '<<' or $op eq '>>' or
3156 $op eq '&' or $op eq '^' or $op eq '|' or
3157 $op eq '+' or $op eq '-' or
3158 $op eq '*' or $op eq '/' or
3159 $op eq '%')
3160 {
3161 if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
6b9709d9
TR
3162 if (ERROR("SPACING",
3163 "need consistent spacing around '$op' $at\n" . $hereptr)) {
3164 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
3165 if (defined $fix_elements[$n + 2]) {
3166 $fix_elements[$n + 2] =~ s/^\s+//;
3167 }
3168 $line_fixed = 1;
3169 }
05622191
JH
3170 }
3171
3172 # A colon needs no spaces before when it is
3173 # terminating a case value or a label.
3174 } elsif ($opv eq ':C' || $opv eq ':L') {
3175 if ($ctx =~ /Wx./) {
6b9709d9
TR
3176 if (ERROR("SPACING",
3177 "space prohibited before that '$op' $at\n" . $hereptr)) {
3178 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3179 $line_fixed = 1;
3180 }
05622191
JH
3181 }
3182
3183 # All the others need spaces both sides.
3184 } elsif ($ctx !~ /[EWC]x[CWE]/) {
3185 my $ok = 0;
3186
3187 # Ignore email addresses <foo@bar>
3188 if (($op eq '<' &&
3189 $cc =~ /^\S+\@\S+>/) ||
3190 ($op eq '>' &&
3191 $ca =~ /<\S+\@\S+$/))
3192 {
6b9709d9 3193 $ok = 1;
05622191
JH
3194 }
3195
6b9709d9 3196 # messages are ERROR, but ?: are CHK
05622191 3197 if ($ok == 0) {
6b9709d9
TR
3198 my $msg_type = \&ERROR;
3199 $msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
3200
3201 if (&{$msg_type}("SPACING",
3202 "spaces required around that '$op' $at\n" . $hereptr)) {
3203 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
3204 if (defined $fix_elements[$n + 2]) {
3205 $fix_elements[$n + 2] =~ s/^\s+//;
3206 }
3207 $line_fixed = 1;
3208 }
05622191
JH
3209 }
3210 }
3211 $off += length($elements[$n + 1]);
6b9709d9
TR
3212
3213## print("n: <$n> GOOD: <$good>\n");
3214
3215 $fixed_line = $fixed_line . $good;
3216 }
3217
3218 if (($#elements % 2) == 0) {
3219 $fixed_line = $fixed_line . $fix_elements[$#elements];
3220 }
3221
3222 if ($fix && $line_fixed && $fixed_line ne $fixed[$linenr - 1]) {
3223 $fixed[$linenr - 1] = $fixed_line;
3224 }
3225
3226
3227 }
3228
3229# check for whitespace before a non-naked semicolon
3230 if ($line =~ /^\+.*\S\s+;\s*$/) {
3231 if (WARN("SPACING",
3232 "space prohibited before semicolon\n" . $herecurr) &&
3233 $fix) {
3234 1 while $fixed[$linenr - 1] =~
3235 s/^(\+.*\S)\s+;/$1;/;
05622191
JH
3236 }
3237 }
3238
3239# check for multiple assignments
3240 if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
3241 CHK("MULTIPLE_ASSIGNMENTS",
3242 "multiple assignments should be avoided\n" . $herecurr);
3243 }
3244
3245## # check for multiple declarations, allowing for a function declaration
3246## # continuation.
3247## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
3248## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
3249##
3250## # Remove any bracketed sections to ensure we do not
3251## # falsly report the parameters of functions.
3252## my $ln = $line;
3253## while ($ln =~ s/\([^\(\)]*\)//g) {
3254## }
3255## if ($ln =~ /,/) {
3256## WARN("MULTIPLE_DECLARATION",
3257## "declaring multiple variables together should be avoided\n" . $herecurr);
3258## }
3259## }
3260
3261#need space before brace following if, while, etc
d8a1a304
HS
3262 if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\){/) ||
3263 $line =~ /do\{/) {
6b9709d9
TR
3264 if (ERROR("SPACING",
3265 "space required before the open brace '{'\n" . $herecurr) &&
3266 $fix) {
3267 $fixed[$linenr - 1] =~ s/^(\+.*(?:do|\))){/$1 {/;
3268 }
05622191
JH
3269 }
3270
6b9709d9
TR
3271## # check for blank lines before declarations
3272## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
3273## $prevrawline =~ /^.\s*$/) {
3274## WARN("SPACING",
3275## "No blank lines before declarations\n" . $hereprev);
3276## }
3277##
3278
05622191
JH
3279# closing brace should have a space following it when it has anything
3280# on the line
3281 if ($line =~ /}(?!(?:,|;|\)))\S/) {
6b9709d9
TR
3282 if (ERROR("SPACING",
3283 "space required after that close brace '}'\n" . $herecurr) &&
3284 $fix) {
3285 $fixed[$linenr - 1] =~
3286 s/}((?!(?:,|;|\)))\S)/} $1/;
3287 }
05622191
JH
3288 }
3289
3290# check spacing on square brackets
3291 if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
6b9709d9
TR
3292 if (ERROR("SPACING",
3293 "space prohibited after that open square bracket '['\n" . $herecurr) &&
3294 $fix) {
3295 $fixed[$linenr - 1] =~
3296 s/\[\s+/\[/;
3297 }
05622191
JH
3298 }
3299 if ($line =~ /\s\]/) {
6b9709d9
TR
3300 if (ERROR("SPACING",
3301 "space prohibited before that close square bracket ']'\n" . $herecurr) &&
3302 $fix) {
3303 $fixed[$linenr - 1] =~
3304 s/\s+\]/\]/;
3305 }
05622191
JH
3306 }
3307
3308# check spacing on parentheses
3309 if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
3310 $line !~ /for\s*\(\s+;/) {
6b9709d9
TR
3311 if (ERROR("SPACING",
3312 "space prohibited after that open parenthesis '('\n" . $herecurr) &&
3313 $fix) {
3314 $fixed[$linenr - 1] =~
3315 s/\(\s+/\(/;
3316 }
05622191
JH
3317 }
3318 if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
3319 $line !~ /for\s*\(.*;\s+\)/ &&
3320 $line !~ /:\s+\)/) {
6b9709d9
TR
3321 if (ERROR("SPACING",
3322 "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
3323 $fix) {
3324 $fixed[$linenr - 1] =~
3325 s/\s+\)/\)/;
3326 }
05622191
JH
3327 }
3328
3329#goto labels aren't indented, allow a single space however
3330 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
3331 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
6b9709d9
TR
3332 if (WARN("INDENTED_LABEL",
3333 "labels should not be indented\n" . $herecurr) &&
3334 $fix) {
3335 $fixed[$linenr - 1] =~
3336 s/^(.)\s+/$1/;
3337 }
05622191
JH
3338 }
3339
3340# Return is not a function.
6b9709d9 3341 if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
05622191 3342 my $spacing = $1;
6b9709d9
TR
3343 if ($^V && $^V ge 5.10.0 &&
3344 $stat =~ /^.\s*return\s*$balanced_parens\s*;\s*$/) {
05622191
JH
3345 ERROR("RETURN_PARENTHESES",
3346 "return is not a function, parentheses are not required\n" . $herecurr);
3347
3348 } elsif ($spacing !~ /\s+/) {
3349 ERROR("SPACING",
3350 "space required before the open parenthesis '('\n" . $herecurr);
3351 }
3352 }
6b9709d9
TR
3353
3354# if statements using unnecessary parentheses - ie: if ((foo == bar))
3355 if ($^V && $^V ge 5.10.0 &&
3356 $line =~ /\bif\s*((?:\(\s*){2,})/) {
3357 my $openparens = $1;
3358 my $count = $openparens =~ tr@\(@\(@;
3359 my $msg = "";
3360 if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
3361 my $comp = $4; #Not $1 because of $LvalOrFunc
3362 $msg = " - maybe == should be = ?" if ($comp eq "==");
3363 WARN("UNNECESSARY_PARENTHESES",
3364 "Unnecessary parentheses$msg\n" . $herecurr);
3365 }
3366 }
3367
05622191
JH
3368# Return of what appears to be an errno should normally be -'ve
3369 if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
3370 my $name = $1;
3371 if ($name ne 'EOF' && $name ne 'ERROR') {
3372 WARN("USE_NEGATIVE_ERRNO",
3373 "return of an errno should typically be -ve (return -$1)\n" . $herecurr);
3374 }
3375 }
3376
05622191 3377# Need a space before open parenthesis after if, while etc
6b9709d9
TR
3378 if ($line =~ /\b(if|while|for|switch)\(/) {
3379 if (ERROR("SPACING",
3380 "space required before the open parenthesis '('\n" . $herecurr) &&
3381 $fix) {
3382 $fixed[$linenr - 1] =~
3383 s/\b(if|while|for|switch)\(/$1 \(/;
3384 }
05622191
JH
3385 }
3386
3387# Check for illegal assignment in if conditional -- and check for trailing
3388# statements after the conditional.
3389 if ($line =~ /do\s*(?!{)/) {
d45a6ae2
KP
3390 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3391 ctx_statement_block($linenr, $realcnt, 0)
3392 if (!defined $stat);
05622191
JH
3393 my ($stat_next) = ctx_statement_block($line_nr_next,
3394 $remain_next, $off_next);
3395 $stat_next =~ s/\n./\n /g;
3396 ##print "stat<$stat> stat_next<$stat_next>\n";
3397
3398 if ($stat_next =~ /^\s*while\b/) {
3399 # If the statement carries leading newlines,
3400 # then count those as offsets.
3401 my ($whitespace) =
3402 ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
3403 my $offset =
3404 statement_rawlines($whitespace) - 1;
3405
3406 $suppress_whiletrailers{$line_nr_next +
3407 $offset} = 1;
3408 }
3409 }
3410 if (!defined $suppress_whiletrailers{$linenr} &&
6b9709d9 3411 defined($stat) && defined($cond) &&
05622191
JH
3412 $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
3413 my ($s, $c) = ($stat, $cond);
3414
3415 if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
3416 ERROR("ASSIGN_IN_IF",
3417 "do not use assignment in if condition\n" . $herecurr);
3418 }
3419
3420 # Find out what is on the end of the line after the
3421 # conditional.
3422 substr($s, 0, length($c), '');
3423 $s =~ s/\n.*//g;
3424 $s =~ s/$;//g; # Remove any comments
3425 if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
3426 $c !~ /}\s*while\s*/)
3427 {
3428 # Find out how long the conditional actually is.
3429 my @newlines = ($c =~ /\n/gs);
3430 my $cond_lines = 1 + $#newlines;
3431 my $stat_real = '';
3432
3433 $stat_real = raw_line($linenr, $cond_lines)
3434 . "\n" if ($cond_lines);
3435 if (defined($stat_real) && $cond_lines > 1) {
3436 $stat_real = "[...]\n$stat_real";
3437 }
3438
3439 ERROR("TRAILING_STATEMENTS",
3440 "trailing statements should be on next line\n" . $herecurr . $stat_real);
3441 }
3442 }
3443
3444# Check for bitwise tests written as boolean
3445 if ($line =~ /
3446 (?:
3447 (?:\[|\(|\&\&|\|\|)
3448 \s*0[xX][0-9]+\s*
3449 (?:\&\&|\|\|)
3450 |
3451 (?:\&\&|\|\|)
3452 \s*0[xX][0-9]+\s*
3453 (?:\&\&|\|\||\)|\])
3454 )/x)
3455 {
3456 WARN("HEXADECIMAL_BOOLEAN_TEST",
3457 "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
3458 }
3459
3460# if and else should not have general statements after it
3461 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
3462 my $s = $1;
3463 $s =~ s/$;//g; # Remove any comments
3464 if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
3465 ERROR("TRAILING_STATEMENTS",
3466 "trailing statements should be on next line\n" . $herecurr);
3467 }
3468 }
3469# if should not continue a brace
3470 if ($line =~ /}\s*if\b/) {
3471 ERROR("TRAILING_STATEMENTS",
3472 "trailing statements should be on next line\n" .
3473 $herecurr);
3474 }
3475# case and default should not have general statements after them
3476 if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
3477 $line !~ /\G(?:
3478 (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
3479 \s*return\s+
3480 )/xg)
3481 {
3482 ERROR("TRAILING_STATEMENTS",
3483 "trailing statements should be on next line\n" . $herecurr);
3484 }
3485
3486 # Check for }<nl>else {, these must be at the same
3487 # indent level to be relevant to each other.
3488 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
3489 $previndent == $indent) {
3490 ERROR("ELSE_AFTER_BRACE",
3491 "else should follow close brace '}'\n" . $hereprev);
3492 }
3493
3494 if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
3495 $previndent == $indent) {
3496 my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
3497
3498 # Find out what is on the end of the line after the
3499 # conditional.
3500 substr($s, 0, length($c), '');
3501 $s =~ s/\n.*//g;
3502
3503 if ($s =~ /^\s*;/) {
3504 ERROR("WHILE_AFTER_BRACE",
3505 "while should follow close brace '}'\n" . $hereprev);
3506 }
3507 }
3508
6b9709d9 3509#Specific variable tests
d45a6ae2
KP
3510 while ($line =~ m{($Constant|$Lval)}g) {
3511 my $var = $1;
6b9709d9
TR
3512
3513#gcc binary extension
3514 if ($var =~ /^$Binary$/) {
3515 if (WARN("GCC_BINARY_CONSTANT",
3516 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
3517 $fix) {
3518 my $hexval = sprintf("0x%x", oct($var));
3519 $fixed[$linenr - 1] =~
3520 s/\b$var\b/$hexval/;
3521 }
3522 }
3523
3524#CamelCase
3525 if ($var !~ /^$Constant$/ &&
3526 $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
3527#Ignore Page<foo> variants
3528 $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
3529#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
3530 $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) {
3531 while ($var =~ m{($Ident)}g) {
3532 my $word = $1;
3533 next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
3534 if ($check) {
3535 seed_camelcase_includes();
3536 if (!$file && !$camelcase_file_seeded) {
3537 seed_camelcase_file($realfile);
3538 $camelcase_file_seeded = 1;
3539 }
3540 }
3541 if (!defined $camelcase{$word}) {
3542 $camelcase{$word} = 1;
3543 CHK("CAMELCASE",
3544 "Avoid CamelCase: <$word>\n" . $herecurr);
3545 }
3546 }
d45a6ae2
KP
3547 }
3548 }
05622191
JH
3549
3550#no spaces allowed after \ in define
6b9709d9
TR
3551 if ($line =~ /\#\s*define.*\\\s+$/) {
3552 if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
3553 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
3554 $fix) {
3555 $fixed[$linenr - 1] =~ s/\s+$//;
3556 }
05622191
JH
3557 }
3558
3559#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
3560 if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
3561 my $file = "$1.h";
3562 my $checkfile = "include/linux/$file";
3563 if (-f "$root/$checkfile" &&
3564 $realfile ne $checkfile &&
3565 $1 !~ /$allowed_asm_includes/)
3566 {
3567 if ($realfile =~ m{^arch/}) {
3568 CHK("ARCH_INCLUDE_LINUX",
3569 "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
3570 } else {
3571 WARN("INCLUDE_LINUX",
3572 "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
3573 }
3574 }
3575 }
3576
3577# multi-statement macros should be enclosed in a do while loop, grab the
3578# first statement and ensure its the whole macro if its not enclosed
3579# in a known good container
3580 if ($realfile !~ m@/vmlinux.lds.h$@ &&
3581 $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
3582 my $ln = $linenr;
3583 my $cnt = $realcnt;
3584 my ($off, $dstat, $dcond, $rest);
3585 my $ctx = '';
05622191 3586 ($dstat, $dcond, $ln, $cnt, $off) =
d45a6ae2
KP
3587 ctx_statement_block($linenr, $realcnt, 0);
3588 $ctx = $dstat;
05622191
JH
3589 #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
3590 #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
3591
d45a6ae2 3592 $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
05622191
JH
3593 $dstat =~ s/$;//g;
3594 $dstat =~ s/\\\n.//g;
3595 $dstat =~ s/^\s*//s;
3596 $dstat =~ s/\s*$//s;
3597
3598 # Flatten any parentheses and braces
3599 while ($dstat =~ s/\([^\(\)]*\)/1/ ||
3600 $dstat =~ s/\{[^\{\}]*\}/1/ ||
d45a6ae2
KP
3601 $dstat =~ s/\[[^\[\]]*\]/1/)
3602 {
3603 }
3604
3605 # Flatten any obvious string concatentation.
3606 while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
3607 $dstat =~ s/$Ident\s*("X*")/$1/)
05622191
JH
3608 {
3609 }
3610
3611 my $exceptions = qr{
3612 $Declare|
3613 module_param_named|
d45a6ae2 3614 MODULE_PARM_DESC|
05622191
JH
3615 DECLARE_PER_CPU|
3616 DEFINE_PER_CPU|
3617 __typeof__\(|
3618 union|
3619 struct|
3620 \.$Ident\s*=\s*|
3621 ^\"|\"$
3622 }x;
3623 #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
d45a6ae2
KP
3624 if ($dstat ne '' &&
3625 $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(),
3626 $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo();
6b9709d9 3627 $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
d45a6ae2
KP
3628 $dstat !~ /^'X'$/ && # character constants
3629 $dstat !~ /$exceptions/ &&
3630 $dstat !~ /^\.$Ident\s*=/ && # .foo =
6b9709d9 3631 $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo
d45a6ae2
KP
3632 $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...)
3633 $dstat !~ /^for\s*$Constant$/ && # for (...)
3634 $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar()
3635 $dstat !~ /^do\s*{/ && # do {...
d8a1a304 3636 $dstat !~ /^\(\{/ && # ({...
6b9709d9 3637 $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
d45a6ae2
KP
3638 {
3639 $ctx =~ s/\n*$//;
3640 my $herectx = $here . "\n";
3641 my $cnt = statement_rawlines($ctx);
3642
3643 for (my $n = 0; $n < $cnt; $n++) {
3644 $herectx .= raw_line($linenr, $n) . "\n";
05622191
JH
3645 }
3646
d45a6ae2
KP
3647 if ($dstat =~ /;/) {
3648 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
3649 "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
3650 } else {
05622191 3651 ERROR("COMPLEX_MACRO",
d45a6ae2
KP
3652 "Macros with complex values should be enclosed in parenthesis\n" . "$herectx");
3653 }
3654 }
3655
3656# check for line continuations outside of #defines, preprocessor #, and asm
3657
3658 } else {
3659 if ($prevline !~ /^..*\\$/ &&
3660 $line !~ /^\+\s*\#.*\\$/ && # preprocessor
3661 $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm
3662 $line =~ /^\+.*\\$/) {
3663 WARN("LINE_CONTINUATIONS",
3664 "Avoid unnecessary line continuations\n" . $herecurr);
3665 }
3666 }
3667
3668# do {} while (0) macro tests:
3669# single-statement macros do not need to be enclosed in do while (0) loop,
3670# macro should not end with a semicolon
3671 if ($^V && $^V ge 5.10.0 &&
3672 $realfile !~ m@/vmlinux.lds.h$@ &&
3673 $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
3674 my $ln = $linenr;
3675 my $cnt = $realcnt;
3676 my ($off, $dstat, $dcond, $rest);
3677 my $ctx = '';
3678 ($dstat, $dcond, $ln, $cnt, $off) =
3679 ctx_statement_block($linenr, $realcnt, 0);
3680 $ctx = $dstat;
3681
3682 $dstat =~ s/\\\n.//g;
3683
3684 if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
3685 my $stmts = $2;
3686 my $semis = $3;
3687
3688 $ctx =~ s/\n*$//;
3689 my $cnt = statement_rawlines($ctx);
3690 my $herectx = $here . "\n";
3691
3692 for (my $n = 0; $n < $cnt; $n++) {
3693 $herectx .= raw_line($linenr, $n) . "\n";
3694 }
3695
3696 if (($stmts =~ tr/;/;/) == 1 &&
3697 $stmts !~ /^\s*(if|while|for|switch)\b/) {
3698 WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
3699 "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
3700 }
3701 if (defined $semis && $semis ne "") {
3702 WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
3703 "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
05622191
JH
3704 }
3705 }
3706 }
3707
3708# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
3709# all assignments may have only one of the following with an assignment:
3710# .
3711# ALIGN(...)
3712# VMLINUX_SYMBOL(...)
3713 if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
3714 WARN("MISSING_VMLINUX_SYMBOL",
3715 "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
3716 }
3717
3718# check for redundant bracing round if etc
3719 if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
3720 my ($level, $endln, @chunks) =
3721 ctx_statement_full($linenr, $realcnt, 1);
3722 #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
3723 #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
3724 if ($#chunks > 0 && $level == 0) {
d45a6ae2
KP
3725 my @allowed = ();
3726 my $allow = 0;
05622191
JH
3727 my $seen = 0;
3728 my $herectx = $here . "\n";
3729 my $ln = $linenr - 1;
3730 for my $chunk (@chunks) {
3731 my ($cond, $block) = @{$chunk};
3732
3733 # If the condition carries leading newlines, then count those as offsets.
3734 my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
3735 my $offset = statement_rawlines($whitespace) - 1;
3736
d45a6ae2 3737 $allowed[$allow] = 0;
05622191
JH
3738 #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
3739
3740 # We have looked at and allowed this specific line.
3741 $suppress_ifbraces{$ln + $offset} = 1;
3742
3743 $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
3744 $ln += statement_rawlines($block) - 1;
3745
3746 substr($block, 0, length($cond), '');
3747
3748 $seen++ if ($block =~ /^\s*{/);
3749
d45a6ae2 3750 #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
05622191
JH
3751 if (statement_lines($cond) > 1) {
3752 #print "APW: ALLOWED: cond<$cond>\n";
d45a6ae2 3753 $allowed[$allow] = 1;
05622191
JH
3754 }
3755 if ($block =~/\b(?:if|for|while)\b/) {
3756 #print "APW: ALLOWED: block<$block>\n";
d45a6ae2 3757 $allowed[$allow] = 1;
05622191
JH
3758 }
3759 if (statement_block_size($block) > 1) {
3760 #print "APW: ALLOWED: lines block<$block>\n";
d45a6ae2 3761 $allowed[$allow] = 1;
05622191 3762 }
d45a6ae2 3763 $allow++;
05622191 3764 }
d45a6ae2
KP
3765 if ($seen) {
3766 my $sum_allowed = 0;
3767 foreach (@allowed) {
3768 $sum_allowed += $_;
3769 }
3770 if ($sum_allowed == 0) {
3771 WARN("BRACES",
3772 "braces {} are not necessary for any arm of this statement\n" . $herectx);
3773 } elsif ($sum_allowed != $allow &&
3774 $seen != $allow) {
3775 CHK("BRACES",
3776 "braces {} should be used on all arms of this statement\n" . $herectx);
3777 }
05622191
JH
3778 }
3779 }
3780 }
3781 if (!defined $suppress_ifbraces{$linenr - 1} &&
3782 $line =~ /\b(if|while|for|else)\b/) {
3783 my $allowed = 0;
3784
3785 # Check the pre-context.
3786 if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
3787 #print "APW: ALLOWED: pre<$1>\n";
3788 $allowed = 1;
3789 }
3790
3791 my ($level, $endln, @chunks) =
3792 ctx_statement_full($linenr, $realcnt, $-[0]);
3793
3794 # Check the condition.
3795 my ($cond, $block) = @{$chunks[0]};
3796 #print "CHECKING<$linenr> cond<$cond> block<$block>\n";
3797 if (defined $cond) {
3798 substr($block, 0, length($cond), '');
3799 }
3800 if (statement_lines($cond) > 1) {
3801 #print "APW: ALLOWED: cond<$cond>\n";
3802 $allowed = 1;
3803 }
3804 if ($block =~/\b(?:if|for|while)\b/) {
3805 #print "APW: ALLOWED: block<$block>\n";
3806 $allowed = 1;
3807 }
3808 if (statement_block_size($block) > 1) {
3809 #print "APW: ALLOWED: lines block<$block>\n";
3810 $allowed = 1;
3811 }
3812 # Check the post-context.
3813 if (defined $chunks[1]) {
3814 my ($cond, $block) = @{$chunks[1]};
3815 if (defined $cond) {
3816 substr($block, 0, length($cond), '');
3817 }
3818 if ($block =~ /^\s*\{/) {
3819 #print "APW: ALLOWED: chunk-1 block<$block>\n";
3820 $allowed = 1;
3821 }
3822 }
3823 if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
d45a6ae2 3824 my $herectx = $here . "\n";
05622191
JH
3825 my $cnt = statement_rawlines($block);
3826
3827 for (my $n = 0; $n < $cnt; $n++) {
d45a6ae2 3828 $herectx .= raw_line($linenr, $n) . "\n";
05622191
JH
3829 }
3830
3831 WARN("BRACES",
3832 "braces {} are not necessary for single statement blocks\n" . $herectx);
3833 }
3834 }
3835
d45a6ae2 3836# check for unnecessary blank lines around braces
6b9709d9 3837 if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
d45a6ae2
KP
3838 CHK("BRACES",
3839 "Blank lines aren't necessary before a close brace '}'\n" . $hereprev);
05622191 3840 }
6b9709d9 3841 if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
d45a6ae2
KP
3842 CHK("BRACES",
3843 "Blank lines aren't necessary after an open brace '{'\n" . $hereprev);
05622191
JH
3844 }
3845
3846# no volatiles please
3847 my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
3848 if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
3849 WARN("VOLATILE",
3850 "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
3851 }
3852
3853# warn about #if 0
3854 if ($line =~ /^.\s*\#\s*if\s+0\b/) {
3855 CHK("REDUNDANT_CODE",
3856 "if this code is redundant consider removing it\n" .
3857 $herecurr);
3858 }
3859
d45a6ae2
KP
3860# check for needless "if (<foo>) fn(<foo>)" uses
3861 if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
3862 my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
3863 if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
3864 WARN('NEEDLESS_IF',
3865 "$1(NULL) is safe this check is probably not required\n" . $hereprev);
05622191
JH
3866 }
3867 }
3868
6b9709d9
TR
3869# check for bad placement of section $InitAttribute (e.g.: __initdata)
3870 if ($line =~ /(\b$InitAttribute\b)/) {
3871 my $attr = $1;
3872 if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
3873 my $ptr = $1;
3874 my $var = $2;
3875 if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
3876 ERROR("MISPLACED_INIT",
3877 "$attr should be placed after $var\n" . $herecurr)) ||
3878 ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
3879 WARN("MISPLACED_INIT",
3880 "$attr should be placed after $var\n" . $herecurr))) &&
3881 $fix) {
3882 $fixed[$linenr - 1] =~ 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;
3883 }
3884 }
3885 }
3886
3887# check for $InitAttributeData (ie: __initdata) with const
3888 if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
3889 my $attr = $1;
3890 $attr =~ /($InitAttributePrefix)(.*)/;
3891 my $attr_prefix = $1;
3892 my $attr_type = $2;
3893 if (ERROR("INIT_ATTRIBUTE",
3894 "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
3895 $fix) {
3896 $fixed[$linenr - 1] =~
3897 s/$InitAttributeData/${attr_prefix}initconst/;
3898 }
3899 }
3900
3901# check for $InitAttributeConst (ie: __initconst) without const
3902 if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
3903 my $attr = $1;
3904 if (ERROR("INIT_ATTRIBUTE",
3905 "Use of $attr requires a separate use of const\n" . $herecurr) &&
3906 $fix) {
3907 my $lead = $fixed[$linenr - 1] =~
3908 /(^\+\s*(?:static\s+))/;
3909 $lead = rtrim($1);
3910 $lead = "$lead " if ($lead !~ /^\+$/);
3911 $lead = "${lead}const ";
3912 $fixed[$linenr - 1] =~ s/(^\+\s*(?:static\s+))/$lead/;
3913 }
3914 }
3915
05622191 3916# prefer usleep_range over udelay
d45a6ae2 3917 if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
05622191 3918 # ignore udelay's < 10, however
d45a6ae2 3919 if (! ($1 < 10) ) {
05622191
JH
3920 CHK("USLEEP_RANGE",
3921 "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $line);
3922 }
3923 }
3924
3925# warn about unexpectedly long msleep's
3926 if ($line =~ /\bmsleep\s*\((\d+)\);/) {
3927 if ($1 < 20) {
3928 WARN("MSLEEP",
3929 "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $line);
3930 }
3931 }
3932
6b9709d9
TR
3933# check for comparisons of jiffies
3934 if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
3935 WARN("JIFFIES_COMPARISON",
3936 "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
3937 }
3938
3939# check for comparisons of get_jiffies_64()
3940 if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
3941 WARN("JIFFIES_COMPARISON",
3942 "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
3943 }
3944
05622191
JH
3945# warn about #ifdefs in C files
3946# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
3947# print "#ifdef in C files should be avoided\n";
3948# print "$herecurr";
3949# $clean = 0;
3950# }
3951
3952# warn about spacing in #ifdefs
3953 if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
6b9709d9
TR
3954 if (ERROR("SPACING",
3955 "exactly one space required after that #$1\n" . $herecurr) &&
3956 $fix) {
3957 $fixed[$linenr - 1] =~
3958 s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
3959 }
3960
05622191
JH
3961 }
3962
3963# check for spinlock_t definitions without a comment.
3964 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
3965 $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
3966 my $which = $1;
3967 if (!ctx_has_comment($first_line, $linenr)) {
3968 CHK("UNCOMMENTED_DEFINITION",
3969 "$1 definition without comment\n" . $herecurr);
3970 }
3971 }
3972# check for memory barriers without a comment.
3973 if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
3974 if (!ctx_has_comment($first_line, $linenr)) {
6b9709d9
TR
3975 WARN("MEMORY_BARRIER",
3976 "memory barrier without comment\n" . $herecurr);
05622191
JH
3977 }
3978 }
3979# check of hardware specific defines
3980 if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
3981 CHK("ARCH_DEFINES",
3982 "architecture specific defines should be avoided\n" . $herecurr);
3983 }
3984
3985# Check that the storage class is at the beginning of a declaration
3986 if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
3987 WARN("STORAGE_CLASS",
3988 "storage class should be at the beginning of the declaration\n" . $herecurr)
3989 }
3990
3991# check the location of the inline attribute, that it is between
3992# storage class and type.
3993 if ($line =~ /\b$Type\s+$Inline\b/ ||
3994 $line =~ /\b$Inline\s+$Storage\b/) {
3995 ERROR("INLINE_LOCATION",
3996 "inline keyword should sit between storage class and type\n" . $herecurr);
3997 }
3998
3999# Check for __inline__ and __inline, prefer inline
6b9709d9
TR
4000 if ($realfile !~ m@\binclude/uapi/@ &&
4001 $line =~ /\b(__inline__|__inline)\b/) {
4002 if (WARN("INLINE",
4003 "plain inline is preferred over $1\n" . $herecurr) &&
4004 $fix) {
4005 $fixed[$linenr - 1] =~ s/\b(__inline__|__inline)\b/inline/;
4006
4007 }
05622191
JH
4008 }
4009
4010# Check for __attribute__ packed, prefer __packed
6b9709d9
TR
4011 if ($realfile !~ m@\binclude/uapi/@ &&
4012 $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
05622191
JH
4013 WARN("PREFER_PACKED",
4014 "__packed is preferred over __attribute__((packed))\n" . $herecurr);
4015 }
f503cc49
TR
4016# Check for new packed members, warn to use care
4017 if ($line =~ /\b(__attribute__\s*\(\s*\(.*\bpacked|__packed)\b/) {
4018 WARN("NEW_PACKED",
4019 "Adding new packed members is to be done with care\n" . $herecurr);
4020 }
05622191
JH
4021
4022# Check for __attribute__ aligned, prefer __aligned
6b9709d9
TR
4023 if ($realfile !~ m@\binclude/uapi/@ &&
4024 $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
05622191
JH
4025 WARN("PREFER_ALIGNED",
4026 "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
4027 }
4028
d45a6ae2 4029# Check for __attribute__ format(printf, prefer __printf
6b9709d9
TR
4030 if ($realfile !~ m@\binclude/uapi/@ &&
4031 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
4032 if (WARN("PREFER_PRINTF",
4033 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
4034 $fix) {
4035 $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
4036
4037 }
d45a6ae2
KP
4038 }
4039
4040# Check for __attribute__ format(scanf, prefer __scanf
6b9709d9
TR
4041 if ($realfile !~ m@\binclude/uapi/@ &&
4042 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
4043 if (WARN("PREFER_SCANF",
4044 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
4045 $fix) {
4046 $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
4047 }
d45a6ae2
KP
4048 }
4049
05622191
JH
4050# check for sizeof(&)
4051 if ($line =~ /\bsizeof\s*\(\s*\&/) {
4052 WARN("SIZEOF_ADDRESS",
4053 "sizeof(& should be avoided\n" . $herecurr);
4054 }
4055
d45a6ae2
KP
4056# check for sizeof without parenthesis
4057 if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
6b9709d9
TR
4058 if (WARN("SIZEOF_PARENTHESIS",
4059 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
4060 $fix) {
4061 $fixed[$linenr - 1] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
4062 }
d45a6ae2
KP
4063 }
4064
05622191
JH
4065# check for line continuations in quoted strings with odd counts of "
4066 if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
4067 WARN("LINE_CONTINUATIONS",
4068 "Avoid line continuations in quoted strings\n" . $herecurr);
4069 }
4070
d45a6ae2
KP
4071# check for struct spinlock declarations
4072 if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
4073 WARN("USE_SPINLOCK_T",
4074 "struct spinlock should be spinlock_t\n" . $herecurr);
4075 }
4076
6b9709d9
TR
4077# check for seq_printf uses that could be seq_puts
4078 if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
4079 my $fmt = get_quoted_string($line, $rawline);
4080 if ($fmt ne "" && $fmt !~ /[^\\]\%/) {
4081 if (WARN("PREFER_SEQ_PUTS",
4082 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
4083 $fix) {
4084 $fixed[$linenr - 1] =~ s/\bseq_printf\b/seq_puts/;
4085 }
4086 }
4087 }
4088
d45a6ae2
KP
4089# Check for misused memsets
4090 if ($^V && $^V ge 5.10.0 &&
4091 defined $stat &&
4092 $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
4093
4094 my $ms_addr = $2;
4095 my $ms_val = $7;
4096 my $ms_size = $12;
4097
4098 if ($ms_size =~ /^(0x|)0$/i) {
4099 ERROR("MEMSET",
4100 "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
4101 } elsif ($ms_size =~ /^(0x|)1$/i) {
4102 WARN("MEMSET",
4103 "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
4104 }
4105 }
4106
6b9709d9
TR
4107# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
4108 if ($^V && $^V ge 5.10.0 &&
4109 $line =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/s) {
4110 if (WARN("PREFER_ETHER_ADDR_COPY",
4111 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . $herecurr) &&
4112 $fix) {
4113 $fixed[$linenr - 1] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
4114 }
4115 }
4116
d45a6ae2
KP
4117# typecasts on min/max could be min_t/max_t
4118 if ($^V && $^V ge 5.10.0 &&
4119 defined $stat &&
4120 $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
4121 if (defined $2 || defined $7) {
4122 my $call = $1;
4123 my $cast1 = deparenthesize($2);
4124 my $arg1 = $3;
4125 my $cast2 = deparenthesize($7);
4126 my $arg2 = $8;
4127 my $cast;
4128
4129 if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
4130 $cast = "$cast1 or $cast2";
4131 } elsif ($cast1 ne "") {
4132 $cast = $cast1;
4133 } else {
4134 $cast = $cast2;
4135 }
4136 WARN("MINMAX",
4137 "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
4138 }
4139 }
4140
4141# check usleep_range arguments
4142 if ($^V && $^V ge 5.10.0 &&
4143 defined $stat &&
4144 $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
4145 my $min = $1;
4146 my $max = $7;
4147 if ($min eq $max) {
4148 WARN("USLEEP_RANGE",
4149 "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4150 } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
4151 $min > $max) {
4152 WARN("USLEEP_RANGE",
4153 "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4154 }
4155 }
4156
6b9709d9
TR
4157# check for naked sscanf
4158 if ($^V && $^V ge 5.10.0 &&
4159 defined $stat &&
4160 $stat =~ /\bsscanf\b/ &&
4161 ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
4162 $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
4163 $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
4164 my $lc = $stat =~ tr@\n@@;
4165 $lc = $lc + $linenr;
4166 my $stat_real = raw_line($linenr, 0);
4167 for (my $count = $linenr + 1; $count <= $lc; $count++) {
4168 $stat_real = $stat_real . "\n" . raw_line($count, 0);
4169 }
4170 WARN("NAKED_SSCANF",
4171 "unchecked sscanf return value\n" . "$here\n$stat_real\n");
4172 }
4173
4174# check for new externs in .h files.
4175 if ($realfile =~ /\.h$/ &&
4176 $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
4177 if (CHK("AVOID_EXTERNS",
4178 "extern prototypes should be avoided in .h files\n" . $herecurr) &&
4179 $fix) {
4180 $fixed[$linenr - 1] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
4181 }
4182 }
4183
05622191
JH
4184# check for new externs in .c files.
4185 if ($realfile =~ /\.c$/ && defined $stat &&
4186 $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
4187 {
4188 my $function_name = $1;
4189 my $paren_space = $2;
4190
4191 my $s = $stat;
4192 if (defined $cond) {
4193 substr($s, 0, length($cond), '');
4194 }
4195 if ($s =~ /^\s*;/ &&
4196 $function_name ne 'uninitialized_var')
4197 {
4198 WARN("AVOID_EXTERNS",
4199 "externs should be avoided in .c files\n" . $herecurr);
4200 }
4201
4202 if ($paren_space =~ /\n/) {
4203 WARN("FUNCTION_ARGUMENTS",
4204 "arguments for function declarations should follow identifier\n" . $herecurr);
4205 }
4206
4207 } elsif ($realfile =~ /\.c$/ && defined $stat &&
4208 $stat =~ /^.\s*extern\s+/)
4209 {
4210 WARN("AVOID_EXTERNS",
4211 "externs should be avoided in .c files\n" . $herecurr);
4212 }
4213
4214# checks for new __setup's
4215 if ($rawline =~ /\b__setup\("([^"]*)"/) {
4216 my $name = $1;
4217
4218 if (!grep(/$name/, @setup_docs)) {
4219 CHK("UNDOCUMENTED_SETUP",
4220 "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
4221 }
4222 }
4223
4224# check for pointless casting of kmalloc return
4225 if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
4226 WARN("UNNECESSARY_CASTS",
4227 "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
4228 }
4229
6b9709d9
TR
4230# alloc style
4231# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
4232 if ($^V && $^V ge 5.10.0 &&
4233 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
4234 CHK("ALLOC_SIZEOF_STRUCT",
4235 "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
4236 }
4237
4238# check for krealloc arg reuse
4239 if ($^V && $^V ge 5.10.0 &&
4240 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
4241 WARN("KREALLOC_ARG_REUSE",
4242 "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
4243 }
4244
d45a6ae2
KP
4245# check for alloc argument mismatch
4246 if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
4247 WARN("ALLOC_ARRAY_ARGS",
4248 "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
4249 }
4250
6b9709d9
TR
4251# check for GFP_NOWAIT use
4252 if ($line =~ /\b__GFP_NOFAIL\b/) {
4253 WARN("__GFP_NOFAIL",
4254 "Use of __GFP_NOFAIL is deprecated, no new users should be added\n" . $herecurr);
4255 }
4256
05622191
JH
4257# check for multiple semicolons
4258 if ($line =~ /;\s*;\s*$/) {
6b9709d9
TR
4259 if (WARN("ONE_SEMICOLON",
4260 "Statements terminations use 1 semicolon\n" . $herecurr) &&
4261 $fix) {
4262 $fixed[$linenr - 1] =~ s/(\s*;\s*){2,}$/;/g;
4263 }
4264 }
4265
4266# check for case / default statements not preceeded by break/fallthrough/switch
4267 if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
4268 my $has_break = 0;
4269 my $has_statement = 0;
4270 my $count = 0;
4271 my $prevline = $linenr;
4272 while ($prevline > 1 && $count < 3 && !$has_break) {
4273 $prevline--;
4274 my $rline = $rawlines[$prevline - 1];
4275 my $fline = $lines[$prevline - 1];
4276 last if ($fline =~ /^\@\@/);
4277 next if ($fline =~ /^\-/);
4278 next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
4279 $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
4280 next if ($fline =~ /^.[\s$;]*$/);
4281 $has_statement = 1;
4282 $count++;
4283 $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);
4284 }
4285 if (!$has_break && $has_statement) {
4286 WARN("MISSING_BREAK",
4287 "Possible switch case/default not preceeded by break or fallthrough comment\n" . $herecurr);
4288 }
05622191
JH
4289 }
4290
d45a6ae2
KP
4291# check for switch/default statements without a break;
4292 if ($^V && $^V ge 5.10.0 &&
4293 defined $stat &&
4294 $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
4295 my $ctx = '';
4296 my $herectx = $here . "\n";
4297 my $cnt = statement_rawlines($stat);
4298 for (my $n = 0; $n < $cnt; $n++) {
4299 $herectx .= raw_line($linenr, $n) . "\n";
4300 }
4301 WARN("DEFAULT_NO_BREAK",
4302 "switch default: should use break\n" . $herectx);
172a3a82
EN
4303 }
4304
05622191 4305# check for gcc specific __FUNCTION__
6b9709d9
TR
4306 if ($line =~ /\b__FUNCTION__\b/) {
4307 if (WARN("USE_FUNC",
4308 "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) &&
4309 $fix) {
4310 $fixed[$linenr - 1] =~ s/\b__FUNCTION__\b/__func__/g;
4311 }
05622191
JH
4312 }
4313
d45a6ae2
KP
4314# check for use of yield()
4315 if ($line =~ /\byield\s*\(\s*\)/) {
4316 WARN("YIELD",
4317 "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr);
4318 }
4319
6b9709d9
TR
4320# check for comparisons against true and false
4321 if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
4322 my $lead = $1;
4323 my $arg = $2;
4324 my $test = $3;
4325 my $otype = $4;
4326 my $trail = $5;
4327 my $op = "!";
4328
4329 ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
4330
4331 my $type = lc($otype);
4332 if ($type =~ /^(?:true|false)$/) {
4333 if (("$test" eq "==" && "$type" eq "true") ||
4334 ("$test" eq "!=" && "$type" eq "false")) {
4335 $op = "";
4336 }
4337
4338 CHK("BOOL_COMPARISON",
4339 "Using comparison to $otype is error prone\n" . $herecurr);
4340
4341## maybe suggesting a correct construct would better
4342## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
4343
4344 }
4345 }
4346
05622191
JH
4347# check for semaphores initialized locked
4348 if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
4349 WARN("CONSIDER_COMPLETION",
4350 "consider using a completion\n" . $herecurr);
05622191 4351 }
d45a6ae2
KP
4352
4353# recommend kstrto* over simple_strto* and strict_strto*
4354 if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
05622191 4355 WARN("CONSIDER_KSTRTO",
d45a6ae2 4356 "$1 is obsolete, use k$3 instead\n" . $herecurr);
05622191 4357 }
d45a6ae2 4358
05622191
JH
4359# check for __initcall(), use device_initcall() explicitly please
4360 if ($line =~ /^.\s*__initcall\s*\(/) {
4361 WARN("USE_DEVICE_INITCALL",
4362 "please use device_initcall() instead of __initcall()\n" . $herecurr);
4363 }
d45a6ae2 4364
05622191
JH
4365# check for various ops structs, ensure they are const.
4366 my $struct_ops = qr{acpi_dock_ops|
4367 address_space_operations|
4368 backlight_ops|
4369 block_device_operations|
4370 dentry_operations|
4371 dev_pm_ops|
4372 dma_map_ops|
4373 extent_io_ops|
4374 file_lock_operations|
4375 file_operations|
4376 hv_ops|
4377 ide_dma_ops|
4378 intel_dvo_dev_ops|
4379 item_operations|
4380 iwl_ops|
4381 kgdb_arch|
4382 kgdb_io|
4383 kset_uevent_ops|
4384 lock_manager_operations|
4385 microcode_ops|
4386 mtrr_ops|
4387 neigh_ops|
4388 nlmsvc_binding|
4389 pci_raw_ops|
4390 pipe_buf_operations|
4391 platform_hibernation_ops|
4392 platform_suspend_ops|
4393 proto_ops|
4394 rpc_pipe_ops|
4395 seq_operations|
4396 snd_ac97_build_ops|
4397 soc_pcmcia_socket_ops|
4398 stacktrace_ops|
4399 sysfs_ops|
4400 tty_operations|
4401 usb_mon_operations|
4402 wd_ops}x;
4403 if ($line !~ /\bconst\b/ &&
4404 $line =~ /\bstruct\s+($struct_ops)\b/) {
4405 WARN("CONST_STRUCT",
4406 "struct $1 should normally be const\n" .
4407 $herecurr);
4408 }
4409
4410# use of NR_CPUS is usually wrong
4411# ignore definitions of NR_CPUS and usage to define arrays as likely right
4412 if ($line =~ /\bNR_CPUS\b/ &&
4413 $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
4414 $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
4415 $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
4416 $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
4417 $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
4418 {
4419 WARN("NR_CPUS",
4420 "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
4421 }
4422
6b9709d9
TR
4423# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
4424 if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
4425 ERROR("DEFINE_ARCH_HAS",
4426 "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
4427 }
4428
05622191
JH
4429# check for %L{u,d,i} in strings
4430 my $string;
4431 while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
4432 $string = substr($rawline, $-[1], $+[1] - $-[1]);
4433 $string =~ s/%%/__/g;
4434 if ($string =~ /(?<!%)%L[udi]/) {
4435 WARN("PRINTF_L",
4436 "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
4437 last;
4438 }
4439 }
4440
4441# whine mightly about in_atomic
4442 if ($line =~ /\bin_atomic\s*\(/) {
4443 if ($realfile =~ m@^drivers/@) {
4444 ERROR("IN_ATOMIC",
4445 "do not use in_atomic in drivers\n" . $herecurr);
4446 } elsif ($realfile !~ m@^kernel/@) {
4447 WARN("IN_ATOMIC",
4448 "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
4449 }
4450 }
4451
4452# check for lockdep_set_novalidate_class
4453 if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
4454 $line =~ /__lockdep_no_validate__\s*\)/ ) {
4455 if ($realfile !~ m@^kernel/lockdep@ &&
4456 $realfile !~ m@^include/linux/lockdep@ &&
4457 $realfile !~ m@^drivers/base/core@) {
4458 ERROR("LOCKDEP",
4459 "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
4460 }
4461 }
4462
4463 if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
4464 $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
4465 WARN("EXPORTED_WORLD_WRITABLE",
4466 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
4467 }
05622191
JH
4468 }
4469
4470 # If we have no input at all, then there is nothing to report on
4471 # so just keep quiet.
4472 if ($#rawlines == -1) {
4473 exit(0);
4474 }
4475
4476 # In mailback mode only produce a report in the negative, for
4477 # things that appear to be patches.
4478 if ($mailback && ($clean == 1 || !$is_patch)) {
4479 exit(0);
4480 }
4481
4482 # This is not a patch, and we are are in 'no-patch' mode so
4483 # just keep quiet.
4484 if (!$chk_patch && !$is_patch) {
4485 exit(0);
4486 }
4487
4488 if (!$is_patch) {
4489 ERROR("NOT_UNIFIED_DIFF",
4490 "Does not appear to be a unified-diff format patch\n");
4491 }
4492 if ($is_patch && $chk_signoff && $signoff == 0) {
4493 ERROR("MISSING_SIGN_OFF",
4494 "Missing Signed-off-by: line(s)\n");
4495 }
4496
4497 print report_dump();
4498 if ($summary && !($clean == 1 && $quiet == 1)) {
4499 print "$filename " if ($summary_file);
4500 print "total: $cnt_error errors, $cnt_warn warnings, " .
4501 (($check)? "$cnt_chk checks, " : "") .
4502 "$cnt_lines lines checked\n";
4503 print "\n" if ($quiet == 0);
4504 }
4505
4506 if ($quiet == 0) {
d45a6ae2
KP
4507
4508 if ($^V lt 5.10.0) {
4509 print("NOTE: perl $^V is not modern enough to detect all possible issues.\n");
4510 print("An upgrade to at least perl v5.10.0 is suggested.\n\n");
4511 }
4512
05622191
JH
4513 # If there were whitespace errors which cleanpatch can fix
4514 # then suggest that.
4515 if ($rpt_cleaners) {
4516 print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";
4517 print " scripts/cleanfile\n\n";
4518 $rpt_cleaners = 0;
4519 }
4520 }
4521
6b9709d9
TR
4522 hash_show_words(\%use_type, "Used");
4523 hash_show_words(\%ignore_type, "Ignored");
4524
4525 if ($clean == 0 && $fix && "@rawlines" ne "@fixed") {
4526 my $newfile = $filename;
4527 $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
4528 my $linecount = 0;
4529 my $f;
4530
4531 open($f, '>', $newfile)
4532 or die "$P: Can't open $newfile for write\n";
4533 foreach my $fixed_line (@fixed) {
4534 $linecount++;
4535 if ($file) {
4536 if ($linecount > 3) {
4537 $fixed_line =~ s/^\+//;
4538 print $f $fixed_line. "\n";
4539 }
4540 } else {
4541 print $f $fixed_line . "\n";
4542 }
4543 }
4544 close($f);
4545
4546 if (!$quiet) {
4547 print << "EOM";
4548Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
4549
4550Do _NOT_ trust the results written to this file.
4551Do _NOT_ submit these changes without inspecting them for correctness.
4552
4553This EXPERIMENTAL file is simply a convenience to help rewrite patches.
4554No warranties, expressed or implied...
4555
4556EOM
4557 }
05622191
JH
4558 }
4559
4560 if ($clean == 1 && $quiet == 0) {
4561 print "$vname has no obvious style problems and is ready for submission.\n"
4562 }
4563 if ($clean == 0 && $quiet == 0) {
4564 print << "EOM";
4565$vname has style problems, please review.
4566
4567If any of these errors are false positives, please report
6b9709d9 4568them to the maintainer, see CHECKPATCH in MAINTAINERS.
05622191
JH
4569EOM
4570 }
4571
4572 return $clean;
4573}