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