checkpatch: ignore email headers better
[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
29ee1b0c 1640 my $in_header_lines = $file ? 0 : 1;
15662b3e
JP
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 =~ /^$/ &&
29ee1b0c
JP
1996 !($rawline =~ /^\s+\S/ ||
1997 $rawline =~ /^(commit\b|from\b|[\w-]+:).*$/i)) {
15662b3e
JP
1998 $in_header_lines = 0;
1999 $in_commit_log = 1;
2000 }
2001
fa64205d
PS
2002# Check if there is UTF-8 in a commit log when a mail header has explicitly
2003# declined it, i.e defined some charset where it is missing.
2004 if ($in_header_lines &&
2005 $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
2006 $1 !~ /utf-8/i) {
2007 $non_utf8_charset = 1;
2008 }
2009
2010 if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
15662b3e 2011 $rawline =~ /$NON_ASCII_UTF8/) {
fa64205d 2012 WARN("UTF8_BEFORE_PATCH",
15662b3e
JP
2013 "8-bit UTF-8 used in possible commit log\n" . $herecurr);
2014 }
2015
30670854
AW
2016# ignore non-hunk lines and lines being removed
2017 next if (!$hunk_line || $line =~ /^-/);
0a920b5b 2018
0a920b5b 2019#trailing whitespace
9c0ca6f9 2020 if ($line =~ /^\+.*\015/) {
c2fdda0d 2021 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
d5e616fc
JP
2022 if (ERROR("DOS_LINE_ENDINGS",
2023 "DOS line endings\n" . $herevet) &&
2024 $fix) {
2025 $fixed[$linenr - 1] =~ s/[\s\015]+$//;
2026 }
c2fdda0d
AW
2027 } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
2028 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3705ce5b
JP
2029 if (ERROR("TRAILING_WHITESPACE",
2030 "trailing whitespace\n" . $herevet) &&
2031 $fix) {
d5e616fc 2032 $fixed[$linenr - 1] =~ s/\s+$//;
3705ce5b
JP
2033 }
2034
d2c0a235 2035 $rpt_cleaners = 1;
0a920b5b 2036 }
5368df20 2037
4783f894 2038# Check for FSF mailing addresses.
109d8cb2 2039 if ($rawline =~ /\bwrite to the Free/i ||
3e2232f2
JP
2040 $rawline =~ /\b59\s+Temple\s+Pl/i ||
2041 $rawline =~ /\b51\s+Franklin\s+St/i) {
4783f894
JT
2042 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2043 my $msg_type = \&ERROR;
2044 $msg_type = \&CHK if ($file);
2045 &{$msg_type}("FSF_MAILING_ADDRESS",
3e2232f2 2046 "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
2047 }
2048
3354957a 2049# check for Kconfig help text having a real description
9fe287d7
AW
2050# Only applies when adding the entry originally, after that we do not have
2051# sufficient context to determine whether it is indeed long enough.
3354957a 2052 if ($realfile =~ /Kconfig/ &&
a1385803 2053 $line =~ /.\s*config\s+/) {
3354957a 2054 my $length = 0;
9fe287d7
AW
2055 my $cnt = $realcnt;
2056 my $ln = $linenr + 1;
2057 my $f;
a1385803 2058 my $is_start = 0;
9fe287d7 2059 my $is_end = 0;
a1385803 2060 for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
9fe287d7
AW
2061 $f = $lines[$ln - 1];
2062 $cnt-- if ($lines[$ln - 1] !~ /^-/);
2063 $is_end = $lines[$ln - 1] =~ /^\+/;
9fe287d7
AW
2064
2065 next if ($f =~ /^-/);
a1385803
AW
2066
2067 if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) {
2068 $is_start = 1;
2069 } elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) {
2070 $length = -1;
2071 }
2072
9fe287d7 2073 $f =~ s/^.//;
3354957a
AK
2074 $f =~ s/#.*//;
2075 $f =~ s/^\s+//;
2076 next if ($f =~ /^$/);
9fe287d7
AW
2077 if ($f =~ /^\s*config\s/) {
2078 $is_end = 1;
2079 last;
2080 }
3354957a
AK
2081 $length++;
2082 }
000d1cc1 2083 WARN("CONFIG_DESCRIPTION",
a1385803
AW
2084 "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4);
2085 #print "is_start<$is_start> is_end<$is_end> length<$length>\n";
3354957a
AK
2086 }
2087
1ba8dfd1
KC
2088# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
2089 if ($realfile =~ /Kconfig/ &&
2090 $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
2091 WARN("CONFIG_EXPERIMENTAL",
2092 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2093 }
2094
c68e5878
AL
2095 if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
2096 ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
2097 my $flag = $1;
2098 my $replacement = {
2099 'EXTRA_AFLAGS' => 'asflags-y',
2100 'EXTRA_CFLAGS' => 'ccflags-y',
2101 'EXTRA_CPPFLAGS' => 'cppflags-y',
2102 'EXTRA_LDFLAGS' => 'ldflags-y',
2103 };
2104
2105 WARN("DEPRECATED_VARIABLE",
2106 "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
2107 }
2108
bff5da43 2109# check for DT compatible documentation
7dd05b38
FV
2110 if (defined $root &&
2111 (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
2112 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
2113
bff5da43
RH
2114 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
2115
cc93319b
FV
2116 my $dt_path = $root . "/Documentation/devicetree/bindings/";
2117 my $vp_file = $dt_path . "vendor-prefixes.txt";
2118
bff5da43
RH
2119 foreach my $compat (@compats) {
2120 my $compat2 = $compat;
185d566b
RH
2121 $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
2122 my $compat3 = $compat;
2123 $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
2124 `grep -Erq "$compat|$compat2|$compat3" $dt_path`;
bff5da43
RH
2125 if ( $? >> 8 ) {
2126 WARN("UNDOCUMENTED_DT_STRING",
2127 "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
2128 }
2129
4fbf32a6
FV
2130 next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
2131 my $vendor = $1;
cc93319b 2132 `grep -Eq "^$vendor\\b" $vp_file`;
bff5da43
RH
2133 if ( $? >> 8 ) {
2134 WARN("UNDOCUMENTED_DT_STRING",
cc93319b 2135 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
bff5da43
RH
2136 }
2137 }
2138 }
2139
5368df20
AW
2140# check we are in a valid source file if not then ignore this hunk
2141 next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
2142
6cd7f386 2143#line length limit
c45dcabd 2144 if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
f4c014c0 2145 $rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
0fccc622 2146 !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
8bbea968 2147 $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
6cd7f386 2148 $length > $max_line_length)
c45dcabd 2149 {
000d1cc1 2150 WARN("LONG_LINE",
6cd7f386 2151 "line over $max_line_length characters\n" . $herecurr);
0a920b5b
AW
2152 }
2153
ca56dc09 2154# Check for user-visible strings broken across lines, which breaks the ability
8c5fcd24
JP
2155# to grep for the string. Make exceptions when the previous string ends in a
2156# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
2157# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
ca56dc09
JT
2158 if ($line =~ /^\+\s*"/ &&
2159 $prevline =~ /"\s*$/ &&
8c5fcd24 2160 $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
ca56dc09
JT
2161 WARN("SPLIT_STRING",
2162 "quoted string split across lines\n" . $hereprev);
2163 }
2164
5e79d96e
JP
2165# check for spaces before a quoted newline
2166 if ($rawline =~ /^.*\".*\s\\n/) {
3705ce5b
JP
2167 if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
2168 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
2169 $fix) {
2170 $fixed[$linenr - 1] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
2171 }
2172
5e79d96e
JP
2173 }
2174
8905a67c
AW
2175# check for adding lines without a newline.
2176 if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
000d1cc1
JP
2177 WARN("MISSING_EOF_NEWLINE",
2178 "adding a line without newline at end of file\n" . $herecurr);
8905a67c
AW
2179 }
2180
42e41c54
MF
2181# Blackfin: use hi/lo macros
2182 if ($realfile =~ m@arch/blackfin/.*\.S$@) {
2183 if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
2184 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
2185 ERROR("LO_MACRO",
2186 "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
42e41c54
MF
2187 }
2188 if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
2189 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
2190 ERROR("HI_MACRO",
2191 "use the HI() macro, not (... >> 16)\n" . $herevet);
42e41c54
MF
2192 }
2193 }
2194
b9ea10d6
AW
2195# check we are in a valid source file C or perl if not then ignore this hunk
2196 next if ($realfile !~ /\.(h|c|pl)$/);
0a920b5b
AW
2197
2198# at the beginning of a line any tabs must come first and anything
2199# more than 8 must use tabs.
c2fdda0d
AW
2200 if ($rawline =~ /^\+\s* \t\s*\S/ ||
2201 $rawline =~ /^\+\s* \s*/) {
2202 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
d2c0a235 2203 $rpt_cleaners = 1;
3705ce5b
JP
2204 if (ERROR("CODE_INDENT",
2205 "code indent should use tabs where possible\n" . $herevet) &&
2206 $fix) {
2207 $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
2208 }
0a920b5b
AW
2209 }
2210
08e44365
AP
2211# check for space before tabs.
2212 if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
2213 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3705ce5b
JP
2214 if (WARN("SPACE_BEFORE_TAB",
2215 "please, no space before tabs\n" . $herevet) &&
2216 $fix) {
c76f4cb3
JP
2217 while ($fixed[$linenr - 1] =~
2218 s/(^\+.*) {8,8}+\t/$1\t\t/) {}
2219 while ($fixed[$linenr - 1] =~
2220 s/(^\+.*) +\t/$1\t/) {}
3705ce5b 2221 }
08e44365
AP
2222 }
2223
d1fe9c09
JP
2224# check for && or || at the start of a line
2225 if ($rawline =~ /^\+\s*(&&|\|\|)/) {
2226 CHK("LOGICAL_CONTINUATIONS",
2227 "Logical continuations should be on the previous line\n" . $hereprev);
2228 }
2229
2230# check multi-line statement indentation matches previous line
2231 if ($^V && $^V ge 5.10.0 &&
91cb5195 2232 $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|$Ident\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
d1fe9c09
JP
2233 $prevline =~ /^\+(\t*)(.*)$/;
2234 my $oldindent = $1;
2235 my $rest = $2;
2236
2237 my $pos = pos_last_openparen($rest);
2238 if ($pos >= 0) {
b34a26f3
JP
2239 $line =~ /^(\+| )([ \t]*)/;
2240 my $newindent = $2;
d1fe9c09
JP
2241
2242 my $goodtabindent = $oldindent .
2243 "\t" x ($pos / 8) .
2244 " " x ($pos % 8);
2245 my $goodspaceindent = $oldindent . " " x $pos;
2246
2247 if ($newindent ne $goodtabindent &&
2248 $newindent ne $goodspaceindent) {
3705ce5b
JP
2249
2250 if (CHK("PARENTHESIS_ALIGNMENT",
2251 "Alignment should match open parenthesis\n" . $hereprev) &&
2252 $fix && $line =~ /^\+/) {
2253 $fixed[$linenr - 1] =~
2254 s/^\+[ \t]*/\+$goodtabindent/;
2255 }
d1fe9c09
JP
2256 }
2257 }
2258 }
2259
23f780c9 2260 if ($line =~ /^\+.*\*[ \t]*\)[ \t]+(?!$Assignment|$Arithmetic)/) {
3705ce5b
JP
2261 if (CHK("SPACING",
2262 "No space is necessary after a cast\n" . $hereprev) &&
2263 $fix) {
2264 $fixed[$linenr - 1] =~
2265 s/^(\+.*\*[ \t]*\))[ \t]+/$1/;
2266 }
aad4f614
JP
2267 }
2268
05880600 2269 if ($realfile =~ m@^(drivers/net/|net/)@ &&
fdb4bcd6 2270 $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
85ad978c
JP
2271 $rawline =~ /^\+[ \t]*\*/ &&
2272 $realline > 2) {
05880600
JP
2273 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2274 "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
2275 }
2276
2277 if ($realfile =~ m@^(drivers/net/|net/)@ &&
a605e32e
JP
2278 $prevrawline =~ /^\+[ \t]*\/\*/ && #starting /*
2279 $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */
61135e96 2280 $rawline =~ /^\+/ && #line is new
a605e32e
JP
2281 $rawline !~ /^\+[ \t]*\*/) { #no leading *
2282 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2283 "networking block comments start with * on subsequent lines\n" . $hereprev);
2284 }
2285
2286 if ($realfile =~ m@^(drivers/net/|net/)@ &&
c24f9f19
JP
2287 $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */
2288 $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/
2289 $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/
2290 $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */
05880600
JP
2291 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2292 "networking block comments put the trailing */ on a separate line\n" . $herecurr);
2293 }
2294
3b617e3b 2295# check for missing blank lines after declarations
3f7bac03
JP
2296 if ($sline =~ /^\+\s+\S/ && #Not at char 1
2297 # actual declarations
2298 ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd3
JP
2299 # function pointer declarations
2300 $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac03
JP
2301 # foo bar; where foo is some local typedef or #define
2302 $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
2303 # known declaration macros
2304 $prevline =~ /^\+\s+$declaration_macros/) &&
2305 # for "else if" which can look like "$Ident $Ident"
2306 !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
2307 # other possible extensions of declaration lines
2308 $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
2309 # not starting a section or a macro "\" extended line
2310 $prevline =~ /(?:\{\s*|\\)$/) &&
2311 # looks like a declaration
2312 !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd3
JP
2313 # function pointer declarations
2314 $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac03
JP
2315 # foo bar; where foo is some local typedef or #define
2316 $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
2317 # known declaration macros
2318 $sline =~ /^\+\s+$declaration_macros/ ||
2319 # start of struct or union or enum
3b617e3b 2320 $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||
3f7bac03
JP
2321 # start or end of block or continuation of declaration
2322 $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
2323 # bitfield continuation
2324 $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
2325 # other possible extensions of declaration lines
2326 $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
2327 # indentation of previous and current line are the same
2328 (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
3b617e3b 2329 WARN("SPACING",
3f7bac03 2330 "Missing a blank line after declarations\n" . $hereprev);
3b617e3b
JP
2331 }
2332
5f7ddae6 2333# check for spaces at the beginning of a line.
6b4c5beb
AW
2334# Exceptions:
2335# 1) within comments
2336# 2) indented preprocessor commands
2337# 3) hanging labels
3705ce5b 2338 if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) {
5f7ddae6 2339 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3705ce5b
JP
2340 if (WARN("LEADING_SPACE",
2341 "please, no spaces at the start of a line\n" . $herevet) &&
2342 $fix) {
2343 $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
2344 }
5f7ddae6
RR
2345 }
2346
b9ea10d6
AW
2347# check we are in a valid C source file if not then ignore this hunk
2348 next if ($realfile !~ /\.(h|c)$/);
2349
032a4c0f
JP
2350# check indentation of any line with a bare else
2351# if the previous line is a break or return and is indented 1 tab more...
2352 if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
2353 my $tabs = length($1) + 1;
2354 if ($prevline =~ /^\+\t{$tabs,$tabs}(?:break|return)\b/) {
2355 WARN("UNNECESSARY_ELSE",
2356 "else is not generally useful after a break or return\n" . $hereprev);
2357 }
2358 }
2359
1ba8dfd1
KC
2360# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
2361 if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
2362 WARN("CONFIG_EXPERIMENTAL",
2363 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2364 }
2365
c2fdda0d 2366# check for RCS/CVS revision markers
cf655043 2367 if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
000d1cc1
JP
2368 WARN("CVS_KEYWORD",
2369 "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
c2fdda0d 2370 }
22f2a2ef 2371
42e41c54
MF
2372# Blackfin: don't use __builtin_bfin_[cs]sync
2373 if ($line =~ /__builtin_bfin_csync/) {
2374 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
2375 ERROR("CSYNC",
2376 "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
42e41c54
MF
2377 }
2378 if ($line =~ /__builtin_bfin_ssync/) {
2379 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
2380 ERROR("SSYNC",
2381 "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
42e41c54
MF
2382 }
2383
56e77d70
JP
2384# check for old HOTPLUG __dev<foo> section markings
2385 if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
2386 WARN("HOTPLUG_SECTION",
2387 "Using $1 is unnecessary\n" . $herecurr);
2388 }
2389
9c0ca6f9 2390# Check for potential 'bare' types
2b474a1a
AW
2391 my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
2392 $realline_next);
3e469cdc
AW
2393#print "LINE<$line>\n";
2394 if ($linenr >= $suppress_statement &&
1b5539b1 2395 $realcnt && $sline =~ /.\s*\S/) {
170d3a22 2396 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd 2397 ctx_statement_block($linenr, $realcnt, 0);
171ae1a4
AW
2398 $stat =~ s/\n./\n /g;
2399 $cond =~ s/\n./\n /g;
2400
3e469cdc
AW
2401#print "linenr<$linenr> <$stat>\n";
2402 # If this statement has no statement boundaries within
2403 # it there is no point in retrying a statement scan
2404 # until we hit end of it.
2405 my $frag = $stat; $frag =~ s/;+\s*$//;
2406 if ($frag !~ /(?:{|;)/) {
2407#print "skip<$line_nr_next>\n";
2408 $suppress_statement = $line_nr_next;
2409 }
f74bd194 2410
2b474a1a
AW
2411 # Find the real next line.
2412 $realline_next = $line_nr_next;
2413 if (defined $realline_next &&
2414 (!defined $lines[$realline_next - 1] ||
2415 substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
2416 $realline_next++;
2417 }
2418
171ae1a4
AW
2419 my $s = $stat;
2420 $s =~ s/{.*$//s;
cf655043 2421
c2fdda0d 2422 # Ignore goto labels.
171ae1a4 2423 if ($s =~ /$Ident:\*$/s) {
c2fdda0d
AW
2424
2425 # Ignore functions being called
171ae1a4 2426 } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0d 2427
463f2864
AW
2428 } elsif ($s =~ /^.\s*else\b/s) {
2429
c45dcabd 2430 # declarations always start with types
d2506586 2431 } 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
2432 my $type = $1;
2433 $type =~ s/\s+/ /g;
2434 possible($type, "A:" . $s);
2435
8905a67c 2436 # definitions in global scope can only start with types
a6a84062 2437 } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd 2438 possible($1, "B:" . $s);
c2fdda0d 2439 }
8905a67c
AW
2440
2441 # any (foo ... *) is a pointer cast, and foo is a type
65863862 2442 while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd 2443 possible($1, "C:" . $s);
8905a67c
AW
2444 }
2445
2446 # Check for any sort of function declaration.
2447 # int foo(something bar, other baz);
2448 # void (*store_gdt)(x86_descr_ptr *);
171ae1a4 2449 if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
8905a67c 2450 my ($name_len) = length($1);
8905a67c 2451
cf655043 2452 my $ctx = $s;
773647a0 2453 substr($ctx, 0, $name_len + 1, '');
8905a67c 2454 $ctx =~ s/\)[^\)]*$//;
cf655043 2455
8905a67c 2456 for my $arg (split(/\s*,\s*/, $ctx)) {
c45dcabd 2457 if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
8905a67c 2458
c45dcabd 2459 possible($1, "D:" . $s);
8905a67c
AW
2460 }
2461 }
9c0ca6f9 2462 }
8905a67c 2463
9c0ca6f9
AW
2464 }
2465
653d4876
AW
2466#
2467# Checks which may be anchored in the context.
2468#
00df344f 2469
653d4876
AW
2470# Check for switch () and associated case and default
2471# statements should be at the same indent.
00df344f
AW
2472 if ($line=~/\bswitch\s*\(.*\)/) {
2473 my $err = '';
2474 my $sep = '';
2475 my @ctx = ctx_block_outer($linenr, $realcnt);
2476 shift(@ctx);
2477 for my $ctx (@ctx) {
2478 my ($clen, $cindent) = line_stats($ctx);
2479 if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
2480 $indent != $cindent) {
2481 $err .= "$sep$ctx\n";
2482 $sep = '';
2483 } else {
2484 $sep = "[...]\n";
2485 }
2486 }
2487 if ($err ne '') {
000d1cc1
JP
2488 ERROR("SWITCH_CASE_INDENT_LEVEL",
2489 "switch and case should be at the same indent\n$hereline$err");
de7d4f0e
AW
2490 }
2491 }
2492
2493# if/while/etc brace do not go on next line, unless defining a do while loop,
2494# or if that brace on the next line is for something else
c45dcabd 2495 if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
773647a0
AW
2496 my $pre_ctx = "$1$2";
2497
9c0ca6f9 2498 my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
8eef05dd
JP
2499
2500 if ($line =~ /^\+\t{6,}/) {
2501 WARN("DEEP_INDENTATION",
2502 "Too many leading tabs - consider code refactoring\n" . $herecurr);
2503 }
2504
de7d4f0e
AW
2505 my $ctx_cnt = $realcnt - $#ctx - 1;
2506 my $ctx = join("\n", @ctx);
2507
548596d5
AW
2508 my $ctx_ln = $linenr;
2509 my $ctx_skip = $realcnt;
773647a0 2510
548596d5
AW
2511 while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
2512 defined $lines[$ctx_ln - 1] &&
2513 $lines[$ctx_ln - 1] =~ /^-/)) {
2514 ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
2515 $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
de7d4f0e 2516 $ctx_ln++;
de7d4f0e 2517 }
548596d5 2518
53210168
AW
2519 #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
2520 #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
de7d4f0e 2521
773647a0 2522 if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
000d1cc1
JP
2523 ERROR("OPEN_BRACE",
2524 "that open brace { should be on the previous line\n" .
01464f30 2525 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
00df344f 2526 }
773647a0
AW
2527 if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
2528 $ctx =~ /\)\s*\;\s*$/ &&
2529 defined $lines[$ctx_ln - 1])
2530 {
9c0ca6f9
AW
2531 my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
2532 if ($nindent > $indent) {
000d1cc1
JP
2533 WARN("TRAILING_SEMICOLON",
2534 "trailing semicolon indicates no statements, indent implies otherwise\n" .
01464f30 2535 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
9c0ca6f9
AW
2536 }
2537 }
00df344f
AW
2538 }
2539
4d001e4d
AW
2540# Check relative indent for conditionals and blocks.
2541 if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
3e469cdc
AW
2542 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
2543 ctx_statement_block($linenr, $realcnt, 0)
2544 if (!defined $stat);
4d001e4d
AW
2545 my ($s, $c) = ($stat, $cond);
2546
2547 substr($s, 0, length($c), '');
2548
2549 # Make sure we remove the line prefixes as we have
2550 # none on the first line, and are going to readd them
2551 # where necessary.
2552 $s =~ s/\n./\n/gs;
2553
2554 # Find out how long the conditional actually is.
6f779c18
AW
2555 my @newlines = ($c =~ /\n/gs);
2556 my $cond_lines = 1 + $#newlines;
4d001e4d
AW
2557
2558 # We want to check the first line inside the block
2559 # starting at the end of the conditional, so remove:
2560 # 1) any blank line termination
2561 # 2) any opening brace { on end of the line
2562 # 3) any do (...) {
2563 my $continuation = 0;
2564 my $check = 0;
2565 $s =~ s/^.*\bdo\b//;
2566 $s =~ s/^\s*{//;
2567 if ($s =~ s/^\s*\\//) {
2568 $continuation = 1;
2569 }
9bd49efe 2570 if ($s =~ s/^\s*?\n//) {
4d001e4d
AW
2571 $check = 1;
2572 $cond_lines++;
2573 }
2574
2575 # Also ignore a loop construct at the end of a
2576 # preprocessor statement.
2577 if (($prevline =~ /^.\s*#\s*define\s/ ||
2578 $prevline =~ /\\\s*$/) && $continuation == 0) {
2579 $check = 0;
2580 }
2581
9bd49efe 2582 my $cond_ptr = -1;
740504c6 2583 $continuation = 0;
9bd49efe
AW
2584 while ($cond_ptr != $cond_lines) {
2585 $cond_ptr = $cond_lines;
2586
f16fa28f
AW
2587 # If we see an #else/#elif then the code
2588 # is not linear.
2589 if ($s =~ /^\s*\#\s*(?:else|elif)/) {
2590 $check = 0;
2591 }
2592
9bd49efe
AW
2593 # Ignore:
2594 # 1) blank lines, they should be at 0,
2595 # 2) preprocessor lines, and
2596 # 3) labels.
740504c6
AW
2597 if ($continuation ||
2598 $s =~ /^\s*?\n/ ||
9bd49efe
AW
2599 $s =~ /^\s*#\s*?/ ||
2600 $s =~ /^\s*$Ident\s*:/) {
740504c6 2601 $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
30dad6eb
AW
2602 if ($s =~ s/^.*?\n//) {
2603 $cond_lines++;
2604 }
9bd49efe 2605 }
4d001e4d
AW
2606 }
2607
2608 my (undef, $sindent) = line_stats("+" . $s);
2609 my $stat_real = raw_line($linenr, $cond_lines);
2610
2611 # Check if either of these lines are modified, else
2612 # this is not this patch's fault.
2613 if (!defined($stat_real) ||
2614 $stat !~ /^\+/ && $stat_real !~ /^\+/) {
2615 $check = 0;
2616 }
2617 if (defined($stat_real) && $cond_lines > 1) {
2618 $stat_real = "[...]\n$stat_real";
2619 }
2620
9bd49efe 2621 #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
2622
2623 if ($check && (($sindent % 8) != 0 ||
2624 ($sindent <= $indent && $s ne ''))) {
000d1cc1
JP
2625 WARN("SUSPECT_CODE_INDENT",
2626 "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
4d001e4d
AW
2627 }
2628 }
2629
6c72ffaa
AW
2630 # Track the 'values' across context and added lines.
2631 my $opline = $line; $opline =~ s/^./ /;
1f65f947
AW
2632 my ($curr_values, $curr_vars) =
2633 annotate_values($opline . "\n", $prev_values);
6c72ffaa 2634 $curr_values = $prev_values . $curr_values;
c2fdda0d
AW
2635 if ($dbg_values) {
2636 my $outline = $opline; $outline =~ s/\t/ /g;
cf655043
AW
2637 print "$linenr > .$outline\n";
2638 print "$linenr > $curr_values\n";
1f65f947 2639 print "$linenr > $curr_vars\n";
c2fdda0d 2640 }
6c72ffaa
AW
2641 $prev_values = substr($curr_values, -1);
2642
00df344f 2643#ignore lines not being added
3705ce5b 2644 next if ($line =~ /^[^\+]/);
00df344f 2645
653d4876 2646# TEST: allow direct testing of the type matcher.
7429c690
AW
2647 if ($dbg_type) {
2648 if ($line =~ /^.\s*$Declare\s*$/) {
000d1cc1
JP
2649 ERROR("TEST_TYPE",
2650 "TEST: is type\n" . $herecurr);
7429c690 2651 } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
000d1cc1
JP
2652 ERROR("TEST_NOT_TYPE",
2653 "TEST: is not type ($1 is)\n". $herecurr);
7429c690 2654 }
653d4876
AW
2655 next;
2656 }
a1ef277e
AW
2657# TEST: allow direct testing of the attribute matcher.
2658 if ($dbg_attr) {
9360b0e5 2659 if ($line =~ /^.\s*$Modifier\s*$/) {
000d1cc1
JP
2660 ERROR("TEST_ATTR",
2661 "TEST: is attr\n" . $herecurr);
9360b0e5 2662 } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
000d1cc1
JP
2663 ERROR("TEST_NOT_ATTR",
2664 "TEST: is not attr ($1 is)\n". $herecurr);
a1ef277e
AW
2665 }
2666 next;
2667 }
653d4876 2668
f0a594c1 2669# check for initialisation to aggregates open brace on the next line
99423c20
AW
2670 if ($line =~ /^.\s*{/ &&
2671 $prevline =~ /(?:^|[^=])=\s*$/) {
000d1cc1
JP
2672 ERROR("OPEN_BRACE",
2673 "that open brace { should be on the previous line\n" . $hereprev);
f0a594c1
AW
2674 }
2675
653d4876
AW
2676#
2677# Checks which are anchored on the added line.
2678#
2679
2680# check for malformed paths in #include statements (uses RAW line)
c45dcabd 2681 if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876
AW
2682 my $path = $1;
2683 if ($path =~ m{//}) {
000d1cc1 2684 ERROR("MALFORMED_INCLUDE",
495e9d84
JP
2685 "malformed #include filename\n" . $herecurr);
2686 }
2687 if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
2688 ERROR("UAPI_INCLUDE",
2689 "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
653d4876 2690 }
653d4876 2691 }
00df344f 2692
0a920b5b 2693# no C99 // comments
00df344f 2694 if ($line =~ m{//}) {
3705ce5b
JP
2695 if (ERROR("C99_COMMENTS",
2696 "do not use C99 // comments\n" . $herecurr) &&
2697 $fix) {
2698 my $line = $fixed[$linenr - 1];
2699 if ($line =~ /\/\/(.*)$/) {
2700 my $comment = trim($1);
2701 $fixed[$linenr - 1] =~ s@\/\/(.*)$@/\* $comment \*/@;
2702 }
2703 }
0a920b5b 2704 }
00df344f 2705 # Remove C99 comments.
0a920b5b 2706 $line =~ s@//.*@@;
6c72ffaa 2707 $opline =~ s@//.*@@;
0a920b5b 2708
2b474a1a
AW
2709# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
2710# the whole statement.
2711#print "APW <$lines[$realline_next - 1]>\n";
2712 if (defined $realline_next &&
2713 exists $lines[$realline_next - 1] &&
2714 !defined $suppress_export{$realline_next} &&
2715 ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2716 $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3cbf62df
AW
2717 # Handle definitions which produce identifiers with
2718 # a prefix:
2719 # XXX(foo);
2720 # EXPORT_SYMBOL(something_foo);
653d4876 2721 my $name = $1;
87a53877 2722 if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3cbf62df
AW
2723 $name =~ /^${Ident}_$2/) {
2724#print "FOO C name<$name>\n";
2725 $suppress_export{$realline_next} = 1;
2726
2727 } elsif ($stat !~ /(?:
2b474a1a 2728 \n.}\s*$|
48012058
AW
2729 ^.DEFINE_$Ident\(\Q$name\E\)|
2730 ^.DECLARE_$Ident\(\Q$name\E\)|
2731 ^.LIST_HEAD\(\Q$name\E\)|
2b474a1a
AW
2732 ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
2733 \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
48012058 2734 )/x) {
2b474a1a
AW
2735#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
2736 $suppress_export{$realline_next} = 2;
2737 } else {
2738 $suppress_export{$realline_next} = 1;
0a920b5b
AW
2739 }
2740 }
2b474a1a
AW
2741 if (!defined $suppress_export{$linenr} &&
2742 $prevline =~ /^.\s*$/ &&
2743 ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
2744 $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
2745#print "FOO B <$lines[$linenr - 1]>\n";
2746 $suppress_export{$linenr} = 2;
2747 }
2748 if (defined $suppress_export{$linenr} &&
2749 $suppress_export{$linenr} == 2) {
000d1cc1
JP
2750 WARN("EXPORT_SYMBOL",
2751 "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
2b474a1a 2752 }
0a920b5b 2753
5150bda4 2754# check for global initialisers.
d5e616fc
JP
2755 if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) {
2756 if (ERROR("GLOBAL_INITIALISERS",
2757 "do not initialise globals to 0 or NULL\n" .
2758 $herecurr) &&
2759 $fix) {
2760 $fixed[$linenr - 1] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/;
2761 }
f0a594c1 2762 }
653d4876 2763# check for static initialisers.
d5e616fc
JP
2764 if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) {
2765 if (ERROR("INITIALISED_STATIC",
2766 "do not initialise statics to 0 or NULL\n" .
2767 $herecurr) &&
2768 $fix) {
2769 $fixed[$linenr - 1] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/;
2770 }
0a920b5b
AW
2771 }
2772
cb710eca
JP
2773# check for static const char * arrays.
2774 if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
000d1cc1
JP
2775 WARN("STATIC_CONST_CHAR_ARRAY",
2776 "static const char * array should probably be static const char * const\n" .
cb710eca
JP
2777 $herecurr);
2778 }
2779
2780# check for static char foo[] = "bar" declarations.
2781 if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
000d1cc1
JP
2782 WARN("STATIC_CONST_CHAR_ARRAY",
2783 "static char array declaration should probably be static const char\n" .
cb710eca
JP
2784 $herecurr);
2785 }
2786
9b0fa60d
JP
2787# check for non-global char *foo[] = {"bar", ...} declarations.
2788 if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
2789 WARN("STATIC_CONST_CHAR_ARRAY",
2790 "char * array declaration might be better as static const\n" .
2791 $herecurr);
2792 }
2793
b36190c5
JP
2794# check for function declarations without arguments like "int foo()"
2795 if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
2796 if (ERROR("FUNCTION_WITHOUT_ARGS",
2797 "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
2798 $fix) {
2799 $fixed[$linenr - 1] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
2800 }
2801 }
2802
92e112fd
JP
2803# check for uses of DEFINE_PCI_DEVICE_TABLE
2804 if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) {
2805 if (WARN("DEFINE_PCI_DEVICE_TABLE",
2806 "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) &&
2807 $fix) {
2808 $fixed[$linenr - 1] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /;
2809 }
93ed0e2d
JP
2810 }
2811
653d4876
AW
2812# check for new typedefs, only function parameters and sparse annotations
2813# make sense.
2814 if ($line =~ /\btypedef\s/ &&
8054576d 2815 $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd 2816 $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad 2817 $line !~ /\b$typeTypedefs\b/ &&
653d4876 2818 $line !~ /\b__bitwise(?:__|)\b/) {
000d1cc1
JP
2819 WARN("NEW_TYPEDEFS",
2820 "do not add new typedefs\n" . $herecurr);
0a920b5b
AW
2821 }
2822
2823# * goes on variable not on type
65863862 2824 # (char*[ const])
bfcb2cc7
AW
2825 while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
2826 #print "AA<$1>\n";
3705ce5b 2827 my ($ident, $from, $to) = ($1, $2, $2);
65863862
AW
2828
2829 # Should start with a space.
2830 $to =~ s/^(\S)/ $1/;
2831 # Should not end with a space.
2832 $to =~ s/\s+$//;
2833 # '*'s should not have spaces between.
f9a0b3d1 2834 while ($to =~ s/\*\s+\*/\*\*/) {
65863862 2835 }
d8aaf121 2836
3705ce5b 2837## print "1: from<$from> to<$to> ident<$ident>\n";
65863862 2838 if ($from ne $to) {
3705ce5b
JP
2839 if (ERROR("POINTER_LOCATION",
2840 "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) &&
2841 $fix) {
2842 my $sub_from = $ident;
2843 my $sub_to = $ident;
2844 $sub_to =~ s/\Q$from\E/$to/;
2845 $fixed[$linenr - 1] =~
2846 s@\Q$sub_from\E@$sub_to@;
2847 }
65863862 2848 }
bfcb2cc7
AW
2849 }
2850 while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
2851 #print "BB<$1>\n";
3705ce5b 2852 my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
65863862
AW
2853
2854 # Should start with a space.
2855 $to =~ s/^(\S)/ $1/;
2856 # Should not end with a space.
2857 $to =~ s/\s+$//;
2858 # '*'s should not have spaces between.
f9a0b3d1 2859 while ($to =~ s/\*\s+\*/\*\*/) {
65863862
AW
2860 }
2861 # Modifiers should have spaces.
2862 $to =~ s/(\b$Modifier$)/$1 /;
d8aaf121 2863
3705ce5b 2864## print "2: from<$from> to<$to> ident<$ident>\n";
667026e7 2865 if ($from ne $to && $ident !~ /^$Modifier$/) {
3705ce5b
JP
2866 if (ERROR("POINTER_LOCATION",
2867 "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) &&
2868 $fix) {
2869
2870 my $sub_from = $match;
2871 my $sub_to = $match;
2872 $sub_to =~ s/\Q$from\E/$to/;
2873 $fixed[$linenr - 1] =~
2874 s@\Q$sub_from\E@$sub_to@;
2875 }
65863862 2876 }
0a920b5b
AW
2877 }
2878
2879# # no BUG() or BUG_ON()
2880# if ($line =~ /\b(BUG|BUG_ON)\b/) {
2881# print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n";
2882# print "$herecurr";
2883# $clean = 0;
2884# }
2885
8905a67c 2886 if ($line =~ /\bLINUX_VERSION_CODE\b/) {
000d1cc1
JP
2887 WARN("LINUX_VERSION_CODE",
2888 "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
8905a67c
AW
2889 }
2890
17441227
JP
2891# check for uses of printk_ratelimit
2892 if ($line =~ /\bprintk_ratelimit\s*\(/) {
000d1cc1
JP
2893 WARN("PRINTK_RATELIMITED",
2894"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
17441227
JP
2895 }
2896
00df344f
AW
2897# printk should use KERN_* levels. Note that follow on printk's on the
2898# same line do not need a level, so we use the current block context
2899# to try and find and validate the current printk. In summary the current
25985edc 2900# printk includes all preceding printk's which have no newline on the end.
00df344f 2901# we assume the first bad printk is the one to report.
f0a594c1 2902 if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344f
AW
2903 my $ok = 0;
2904 for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
2905 #print "CHECK<$lines[$ln - 1]\n";
25985edc 2906 # we have a preceding printk if it ends
00df344f
AW
2907 # with "\n" ignore it, else it is to blame
2908 if ($lines[$ln - 1] =~ m{\bprintk\(}) {
2909 if ($rawlines[$ln - 1] !~ m{\\n"}) {
2910 $ok = 1;
2911 }
2912 last;
2913 }
2914 }
2915 if ($ok == 0) {
000d1cc1
JP
2916 WARN("PRINTK_WITHOUT_KERN_LEVEL",
2917 "printk() should include KERN_ facility level\n" . $herecurr);
00df344f 2918 }
0a920b5b
AW
2919 }
2920
243f3803
JP
2921 if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
2922 my $orig = $1;
2923 my $level = lc($orig);
2924 $level = "warn" if ($level eq "warning");
8f26b837
JP
2925 my $level2 = $level;
2926 $level2 = "dbg" if ($level eq "debug");
243f3803 2927 WARN("PREFER_PR_LEVEL",
daa8b059 2928 "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr);
243f3803
JP
2929 }
2930
2931 if ($line =~ /\bpr_warning\s*\(/) {
d5e616fc
JP
2932 if (WARN("PREFER_PR_LEVEL",
2933 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
2934 $fix) {
2935 $fixed[$linenr - 1] =~
2936 s/\bpr_warning\b/pr_warn/;
2937 }
243f3803
JP
2938 }
2939
dc139313
JP
2940 if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
2941 my $orig = $1;
2942 my $level = lc($orig);
2943 $level = "warn" if ($level eq "warning");
2944 $level = "dbg" if ($level eq "debug");
2945 WARN("PREFER_DEV_LEVEL",
2946 "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
2947 }
2948
653d4876
AW
2949# function brace can't be on same line, except for #defines of do while,
2950# or if closed on same line
c45dcabd
AW
2951 if (($line=~/$Type\s*$Ident\(.*\).*\s{/) and
2952 !($line=~/\#\s*define.*do\s{/) and !($line=~/}/)) {
000d1cc1
JP
2953 ERROR("OPEN_BRACE",
2954 "open brace '{' following function declarations go on the next line\n" . $herecurr);
0a920b5b 2955 }
653d4876 2956
8905a67c
AW
2957# open braces for enum, union and struct go on the same line.
2958 if ($line =~ /^.\s*{/ &&
2959 $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
000d1cc1
JP
2960 ERROR("OPEN_BRACE",
2961 "open brace '{' following $1 go on the same line\n" . $hereprev);
8905a67c
AW
2962 }
2963
0c73b4eb 2964# missing space after union, struct or enum definition
3705ce5b
JP
2965 if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
2966 if (WARN("SPACING",
2967 "missing space after $1 definition\n" . $herecurr) &&
2968 $fix) {
2969 $fixed[$linenr - 1] =~
2970 s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
2971 }
0c73b4eb
AW
2972 }
2973
31070b5d
JP
2974# Function pointer declarations
2975# check spacing between type, funcptr, and args
2976# canonical declaration is "type (*funcptr)(args...)"
91f72e9c 2977 if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
31070b5d
JP
2978 my $declare = $1;
2979 my $pre_pointer_space = $2;
2980 my $post_pointer_space = $3;
2981 my $funcname = $4;
2982 my $post_funcname_space = $5;
2983 my $pre_args_space = $6;
2984
91f72e9c
JP
2985# the $Declare variable will capture all spaces after the type
2986# so check it for a missing trailing missing space but pointer return types
2987# don't need a space so don't warn for those.
2988 my $post_declare_space = "";
2989 if ($declare =~ /(\s+)$/) {
2990 $post_declare_space = $1;
2991 $declare = rtrim($declare);
2992 }
2993 if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
31070b5d
JP
2994 WARN("SPACING",
2995 "missing space after return type\n" . $herecurr);
91f72e9c 2996 $post_declare_space = " ";
31070b5d
JP
2997 }
2998
2999# unnecessary space "type (*funcptr)(args...)"
91f72e9c
JP
3000# This test is not currently implemented because these declarations are
3001# equivalent to
3002# int foo(int bar, ...)
3003# and this is form shouldn't/doesn't generate a checkpatch warning.
3004#
3005# elsif ($declare =~ /\s{2,}$/) {
3006# WARN("SPACING",
3007# "Multiple spaces after return type\n" . $herecurr);
3008# }
31070b5d
JP
3009
3010# unnecessary space "type ( *funcptr)(args...)"
3011 if (defined $pre_pointer_space &&
3012 $pre_pointer_space =~ /^\s/) {
3013 WARN("SPACING",
3014 "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
3015 }
3016
3017# unnecessary space "type (* funcptr)(args...)"
3018 if (defined $post_pointer_space &&
3019 $post_pointer_space =~ /^\s/) {
3020 WARN("SPACING",
3021 "Unnecessary space before function pointer name\n" . $herecurr);
3022 }
3023
3024# unnecessary space "type (*funcptr )(args...)"
3025 if (defined $post_funcname_space &&
3026 $post_funcname_space =~ /^\s/) {
3027 WARN("SPACING",
3028 "Unnecessary space after function pointer name\n" . $herecurr);
3029 }
3030
3031# unnecessary space "type (*funcptr) (args...)"
3032 if (defined $pre_args_space &&
3033 $pre_args_space =~ /^\s/) {
3034 WARN("SPACING",
3035 "Unnecessary space before function pointer arguments\n" . $herecurr);
3036 }
3037
3038 if (show_type("SPACING") && $fix) {
3039 $fixed[$linenr - 1] =~
91f72e9c 3040 s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
31070b5d
JP
3041 }
3042 }
3043
8d31cfce
AW
3044# check for spacing round square brackets; allowed:
3045# 1. with a type on the left -- int [] a;
fe2a7dbc
AW
3046# 2. at the beginning of a line for slice initialisers -- [0...10] = 5,
3047# 3. inside a curly brace -- = { [0...10] = 5 }
8d31cfce
AW
3048 while ($line =~ /(.*?\s)\[/g) {
3049 my ($where, $prefix) = ($-[1], $1);
3050 if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc 3051 ($where != 0 || $prefix !~ /^.\s+$/) &&
daebc534 3052 $prefix !~ /[{,]\s+$/) {
3705ce5b
JP
3053 if (ERROR("BRACKET_SPACE",
3054 "space prohibited before open square bracket '['\n" . $herecurr) &&
3055 $fix) {
3056 $fixed[$linenr - 1] =~
3057 s/^(\+.*?)\s+\[/$1\[/;
3058 }
8d31cfce
AW
3059 }
3060 }
3061
f0a594c1 3062# check for spaces between functions and their parentheses.
6c72ffaa 3063 while ($line =~ /($Ident)\s+\(/g) {
c2fdda0d 3064 my $name = $1;
773647a0
AW
3065 my $ctx_before = substr($line, 0, $-[1]);
3066 my $ctx = "$ctx_before$name";
c2fdda0d
AW
3067
3068 # Ignore those directives where spaces _are_ permitted.
773647a0
AW
3069 if ($name =~ /^(?:
3070 if|for|while|switch|return|case|
3071 volatile|__volatile__|
3072 __attribute__|format|__extension__|
3073 asm|__asm__)$/x)
3074 {
c2fdda0d
AW
3075 # cpp #define statements have non-optional spaces, ie
3076 # if there is a space between the name and the open
3077 # parenthesis it is simply not a parameter group.
c45dcabd 3078 } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a0
AW
3079
3080 # cpp #elif statement condition may start with a (
c45dcabd 3081 } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0d
AW
3082
3083 # If this whole things ends with a type its most
3084 # likely a typedef for a function.
773647a0 3085 } elsif ($ctx =~ /$Type$/) {
c2fdda0d
AW
3086
3087 } else {
3705ce5b
JP
3088 if (WARN("SPACING",
3089 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
3090 $fix) {
3091 $fixed[$linenr - 1] =~
3092 s/\b$name\s+\(/$name\(/;
3093 }
6c72ffaa 3094 }
f0a594c1 3095 }
9a4cad4e 3096
653d4876 3097# Check operator spacing.
0a920b5b 3098 if (!($line=~/\#\s*include/)) {
3705ce5b
JP
3099 my $fixed_line = "";
3100 my $line_fixed = 0;
3101
9c0ca6f9
AW
3102 my $ops = qr{
3103 <<=|>>=|<=|>=|==|!=|
3104 \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
3105 =>|->|<<|>>|<|>|=|!|~|
1f65f947 3106 &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
84731623 3107 \?:|\?|:
9c0ca6f9 3108 }x;
cf655043 3109 my @elements = split(/($ops|;)/, $opline);
3705ce5b
JP
3110
3111## print("element count: <" . $#elements . ">\n");
3112## foreach my $el (@elements) {
3113## print("el: <$el>\n");
3114## }
3115
3116 my @fix_elements = ();
00df344f 3117 my $off = 0;
6c72ffaa 3118
3705ce5b
JP
3119 foreach my $el (@elements) {
3120 push(@fix_elements, substr($rawline, $off, length($el)));
3121 $off += length($el);
3122 }
3123
3124 $off = 0;
3125
6c72ffaa 3126 my $blank = copy_spacing($opline);
b34c648b 3127 my $last_after = -1;
6c72ffaa 3128
0a920b5b 3129 for (my $n = 0; $n < $#elements; $n += 2) {
3705ce5b
JP
3130
3131 my $good = $fix_elements[$n] . $fix_elements[$n + 1];
3132
3133## print("n: <$n> good: <$good>\n");
3134
4a0df2ef
AW
3135 $off += length($elements[$n]);
3136
25985edc 3137 # Pick up the preceding and succeeding characters.
773647a0
AW
3138 my $ca = substr($opline, 0, $off);
3139 my $cc = '';
3140 if (length($opline) >= ($off + length($elements[$n + 1]))) {
3141 $cc = substr($opline, $off + length($elements[$n + 1]));
3142 }
3143 my $cb = "$ca$;$cc";
3144
4a0df2ef
AW
3145 my $a = '';
3146 $a = 'V' if ($elements[$n] ne '');
3147 $a = 'W' if ($elements[$n] =~ /\s$/);
cf655043 3148 $a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef
AW
3149 $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
3150 $a = 'O' if ($elements[$n] eq '');
773647a0 3151 $a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef 3152
0a920b5b 3153 my $op = $elements[$n + 1];
4a0df2ef
AW
3154
3155 my $c = '';
0a920b5b 3156 if (defined $elements[$n + 2]) {
4a0df2ef
AW
3157 $c = 'V' if ($elements[$n + 2] ne '');
3158 $c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043 3159 $c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef
AW
3160 $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
3161 $c = 'O' if ($elements[$n + 2] eq '');
8b1b3378 3162 $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef
AW
3163 } else {
3164 $c = 'E';
0a920b5b
AW
3165 }
3166
4a0df2ef
AW
3167 my $ctx = "${a}x${c}";
3168
3169 my $at = "(ctx:$ctx)";
3170
6c72ffaa 3171 my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e 3172 my $hereptr = "$hereline$ptr\n";
0a920b5b 3173
74048ed8 3174 # Pull out the value of this operator.
6c72ffaa 3175 my $op_type = substr($curr_values, $off + 1, 1);
0a920b5b 3176
1f65f947
AW
3177 # Get the full operator variant.
3178 my $opv = $op . substr($curr_vars, $off, 1);
3179
13214adf
AW
3180 # Ignore operators passed as parameters.
3181 if ($op_type ne 'V' &&
3182 $ca =~ /\s$/ && $cc =~ /^\s*,/) {
3183
cf655043
AW
3184# # Ignore comments
3185# } elsif ($op =~ /^$;+$/) {
13214adf 3186
d8aaf121 3187 # ; should have either the end of line or a space or \ after it
13214adf 3188 } elsif ($op eq ';') {
cf655043
AW
3189 if ($ctx !~ /.x[WEBC]/ &&
3190 $cc !~ /^\\/ && $cc !~ /^;/) {
3705ce5b
JP
3191 if (ERROR("SPACING",
3192 "space required after that '$op' $at\n" . $hereptr)) {
b34c648b 3193 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5b
JP
3194 $line_fixed = 1;
3195 }
d8aaf121
AW
3196 }
3197
3198 # // is a comment
3199 } elsif ($op eq '//') {
0a920b5b 3200
b00e4814
JP
3201 # : when part of a bitfield
3202 } elsif ($opv eq ':B') {
3203 # skip the bitfield test for now
3204
1f65f947
AW
3205 # No spaces for:
3206 # ->
b00e4814 3207 } elsif ($op eq '->') {
4a0df2ef 3208 if ($ctx =~ /Wx.|.xW/) {
3705ce5b
JP
3209 if (ERROR("SPACING",
3210 "spaces prohibited around that '$op' $at\n" . $hereptr)) {
b34c648b 3211 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5b
JP
3212 if (defined $fix_elements[$n + 2]) {
3213 $fix_elements[$n + 2] =~ s/^\s+//;
3214 }
b34c648b 3215 $line_fixed = 1;
3705ce5b 3216 }
0a920b5b
AW
3217 }
3218
3219 # , must have a space on the right.
3220 } elsif ($op eq ',') {
cf655043 3221 if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
3705ce5b
JP
3222 if (ERROR("SPACING",
3223 "space required after that '$op' $at\n" . $hereptr)) {
b34c648b 3224 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5b 3225 $line_fixed = 1;
b34c648b 3226 $last_after = $n;
3705ce5b 3227 }
0a920b5b
AW
3228 }
3229
9c0ca6f9 3230 # '*' as part of a type definition -- reported already.
74048ed8 3231 } elsif ($opv eq '*_') {
9c0ca6f9
AW
3232 #warn "'*' is part of type\n";
3233
3234 # unary operators should have a space before and
3235 # none after. May be left adjacent to another
3236 # unary operator, or a cast
3237 } elsif ($op eq '!' || $op eq '~' ||
74048ed8 3238 $opv eq '*U' || $opv eq '-U' ||
0d413866 3239 $opv eq '&U' || $opv eq '&&U') {
cf655043 3240 if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
3705ce5b
JP
3241 if (ERROR("SPACING",
3242 "space required before that '$op' $at\n" . $hereptr)) {
b34c648b
JP
3243 if ($n != $last_after + 2) {
3244 $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
3245 $line_fixed = 1;
3246 }
3705ce5b 3247 }
0a920b5b 3248 }
a3340b35 3249 if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a4
AW
3250 # A unary '*' may be const
3251
3252 } elsif ($ctx =~ /.xW/) {
3705ce5b
JP
3253 if (ERROR("SPACING",
3254 "space prohibited after that '$op' $at\n" . $hereptr)) {
b34c648b 3255 $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
3705ce5b
JP
3256 if (defined $fix_elements[$n + 2]) {
3257 $fix_elements[$n + 2] =~ s/^\s+//;
3258 }
b34c648b 3259 $line_fixed = 1;
3705ce5b 3260 }
0a920b5b
AW
3261 }
3262
3263 # unary ++ and unary -- are allowed no space on one side.
3264 } elsif ($op eq '++' or $op eq '--') {
773647a0 3265 if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
3705ce5b
JP
3266 if (ERROR("SPACING",
3267 "space required one side of that '$op' $at\n" . $hereptr)) {
b34c648b 3268 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5b
JP
3269 $line_fixed = 1;
3270 }
773647a0
AW
3271 }
3272 if ($ctx =~ /Wx[BE]/ ||
3273 ($ctx =~ /Wx./ && $cc =~ /^;/)) {
3705ce5b
JP
3274 if (ERROR("SPACING",
3275 "space prohibited before that '$op' $at\n" . $hereptr)) {
b34c648b 3276 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5b
JP
3277 $line_fixed = 1;
3278 }
0a920b5b 3279 }
773647a0 3280 if ($ctx =~ /ExW/) {
3705ce5b
JP
3281 if (ERROR("SPACING",
3282 "space prohibited after that '$op' $at\n" . $hereptr)) {
b34c648b 3283 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
3705ce5b
JP
3284 if (defined $fix_elements[$n + 2]) {
3285 $fix_elements[$n + 2] =~ s/^\s+//;
3286 }
b34c648b 3287 $line_fixed = 1;
3705ce5b 3288 }
653d4876 3289 }
0a920b5b 3290
0a920b5b 3291 # << and >> may either have or not have spaces both sides
9c0ca6f9
AW
3292 } elsif ($op eq '<<' or $op eq '>>' or
3293 $op eq '&' or $op eq '^' or $op eq '|' or
3294 $op eq '+' or $op eq '-' or
c2fdda0d
AW
3295 $op eq '*' or $op eq '/' or
3296 $op eq '%')
0a920b5b 3297 {
773647a0 3298 if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
3705ce5b
JP
3299 if (ERROR("SPACING",
3300 "need consistent spacing around '$op' $at\n" . $hereptr)) {
b34c648b
JP
3301 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
3302 if (defined $fix_elements[$n + 2]) {
3303 $fix_elements[$n + 2] =~ s/^\s+//;
3304 }
3705ce5b
JP
3305 $line_fixed = 1;
3306 }
0a920b5b
AW
3307 }
3308
1f65f947
AW
3309 # A colon needs no spaces before when it is
3310 # terminating a case value or a label.
3311 } elsif ($opv eq ':C' || $opv eq ':L') {
3312 if ($ctx =~ /Wx./) {
3705ce5b
JP
3313 if (ERROR("SPACING",
3314 "space prohibited before that '$op' $at\n" . $hereptr)) {
b34c648b 3315 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5b
JP
3316 $line_fixed = 1;
3317 }
1f65f947
AW
3318 }
3319
0a920b5b 3320 # All the others need spaces both sides.
cf655043 3321 } elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947
AW
3322 my $ok = 0;
3323
22f2a2ef 3324 # Ignore email addresses <foo@bar>
1f65f947
AW
3325 if (($op eq '<' &&
3326 $cc =~ /^\S+\@\S+>/) ||
3327 ($op eq '>' &&
3328 $ca =~ /<\S+\@\S+$/))
3329 {
3330 $ok = 1;
3331 }
3332
84731623 3333 # messages are ERROR, but ?: are CHK
1f65f947 3334 if ($ok == 0) {
84731623
JP
3335 my $msg_type = \&ERROR;
3336 $msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
3337
3338 if (&{$msg_type}("SPACING",
3339 "spaces required around that '$op' $at\n" . $hereptr)) {
b34c648b
JP
3340 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
3341 if (defined $fix_elements[$n + 2]) {
3342 $fix_elements[$n + 2] =~ s/^\s+//;
3343 }
3705ce5b
JP
3344 $line_fixed = 1;
3345 }
22f2a2ef 3346 }
0a920b5b 3347 }
4a0df2ef 3348 $off += length($elements[$n + 1]);
3705ce5b
JP
3349
3350## print("n: <$n> GOOD: <$good>\n");
3351
3352 $fixed_line = $fixed_line . $good;
3353 }
3354
3355 if (($#elements % 2) == 0) {
3356 $fixed_line = $fixed_line . $fix_elements[$#elements];
0a920b5b 3357 }
3705ce5b
JP
3358
3359 if ($fix && $line_fixed && $fixed_line ne $fixed[$linenr - 1]) {
3360 $fixed[$linenr - 1] = $fixed_line;
3361 }
3362
3363
0a920b5b
AW
3364 }
3365
786b6326 3366# check for whitespace before a non-naked semicolon
d2e248e7 3367 if ($line =~ /^\+.*\S\s+;\s*$/) {
786b6326
JP
3368 if (WARN("SPACING",
3369 "space prohibited before semicolon\n" . $herecurr) &&
3370 $fix) {
3371 1 while $fixed[$linenr - 1] =~
3372 s/^(\+.*\S)\s+;/$1;/;
3373 }
3374 }
3375
f0a594c1
AW
3376# check for multiple assignments
3377 if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
000d1cc1
JP
3378 CHK("MULTIPLE_ASSIGNMENTS",
3379 "multiple assignments should be avoided\n" . $herecurr);
f0a594c1
AW
3380 }
3381
22f2a2ef
AW
3382## # check for multiple declarations, allowing for a function declaration
3383## # continuation.
3384## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
3385## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
3386##
3387## # Remove any bracketed sections to ensure we do not
3388## # falsly report the parameters of functions.
3389## my $ln = $line;
3390## while ($ln =~ s/\([^\(\)]*\)//g) {
3391## }
3392## if ($ln =~ /,/) {
000d1cc1
JP
3393## WARN("MULTIPLE_DECLARATION",
3394## "declaring multiple variables together should be avoided\n" . $herecurr);
22f2a2ef
AW
3395## }
3396## }
f0a594c1 3397
0a920b5b 3398#need space before brace following if, while, etc
22f2a2ef
AW
3399 if (($line =~ /\(.*\){/ && $line !~ /\($Type\){/) ||
3400 $line =~ /do{/) {
3705ce5b
JP
3401 if (ERROR("SPACING",
3402 "space required before the open brace '{'\n" . $herecurr) &&
3403 $fix) {
d5e616fc 3404 $fixed[$linenr - 1] =~ s/^(\+.*(?:do|\))){/$1 {/;
3705ce5b 3405 }
de7d4f0e
AW
3406 }
3407
c4a62ef9
JP
3408## # check for blank lines before declarations
3409## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
3410## $prevrawline =~ /^.\s*$/) {
3411## WARN("SPACING",
3412## "No blank lines before declarations\n" . $hereprev);
3413## }
3414##
3415
de7d4f0e
AW
3416# closing brace should have a space following it when it has anything
3417# on the line
3418 if ($line =~ /}(?!(?:,|;|\)))\S/) {
d5e616fc
JP
3419 if (ERROR("SPACING",
3420 "space required after that close brace '}'\n" . $herecurr) &&
3421 $fix) {
3422 $fixed[$linenr - 1] =~
3423 s/}((?!(?:,|;|\)))\S)/} $1/;
3424 }
0a920b5b
AW
3425 }
3426
22f2a2ef
AW
3427# check spacing on square brackets
3428 if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
3705ce5b
JP
3429 if (ERROR("SPACING",
3430 "space prohibited after that open square bracket '['\n" . $herecurr) &&
3431 $fix) {
3432 $fixed[$linenr - 1] =~
3433 s/\[\s+/\[/;
3434 }
22f2a2ef
AW
3435 }
3436 if ($line =~ /\s\]/) {
3705ce5b
JP
3437 if (ERROR("SPACING",
3438 "space prohibited before that close square bracket ']'\n" . $herecurr) &&
3439 $fix) {
3440 $fixed[$linenr - 1] =~
3441 s/\s+\]/\]/;
3442 }
22f2a2ef
AW
3443 }
3444
c45dcabd 3445# check spacing on parentheses
9c0ca6f9
AW
3446 if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
3447 $line !~ /for\s*\(\s+;/) {
3705ce5b
JP
3448 if (ERROR("SPACING",
3449 "space prohibited after that open parenthesis '('\n" . $herecurr) &&
3450 $fix) {
3451 $fixed[$linenr - 1] =~
3452 s/\(\s+/\(/;
3453 }
22f2a2ef 3454 }
13214adf 3455 if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd
AW
3456 $line !~ /for\s*\(.*;\s+\)/ &&
3457 $line !~ /:\s+\)/) {
3705ce5b
JP
3458 if (ERROR("SPACING",
3459 "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
3460 $fix) {
3461 $fixed[$linenr - 1] =~
3462 s/\s+\)/\)/;
3463 }
22f2a2ef
AW
3464 }
3465
0a920b5b 3466#goto labels aren't indented, allow a single space however
4a0df2ef 3467 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b 3468 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
3705ce5b
JP
3469 if (WARN("INDENTED_LABEL",
3470 "labels should not be indented\n" . $herecurr) &&
3471 $fix) {
3472 $fixed[$linenr - 1] =~
3473 s/^(.)\s+/$1/;
3474 }
0a920b5b
AW
3475 }
3476
5b9553ab 3477# return is not a function
507e5141 3478 if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
c45dcabd 3479 my $spacing = $1;
507e5141 3480 if ($^V && $^V ge 5.10.0 &&
5b9553ab
JP
3481 $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
3482 my $value = $1;
3483 $value = deparenthesize($value);
3484 if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
3485 ERROR("RETURN_PARENTHESES",
3486 "return is not a function, parentheses are not required\n" . $herecurr);
3487 }
c45dcabd 3488 } elsif ($spacing !~ /\s+/) {
000d1cc1
JP
3489 ERROR("SPACING",
3490 "space required before the open parenthesis '('\n" . $herecurr);
c45dcabd
AW
3491 }
3492 }
507e5141 3493
b43ae21b
JP
3494# unnecessary return in a void function
3495# at end-of-function, with the previous line a single leading tab, then return;
3496# and the line before that not a goto label target like "out:"
3497 if ($sline =~ /^[ \+]}\s*$/ &&
3498 $prevline =~ /^\+\treturn\s*;\s*$/ &&
3499 $linenr >= 3 &&
3500 $lines[$linenr - 3] =~ /^[ +]/ &&
3501 $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
9819cf25 3502 WARN("RETURN_VOID",
b43ae21b
JP
3503 "void function return statements are not generally useful\n" . $hereprev);
3504 }
9819cf25 3505
189248d8
JP
3506# if statements using unnecessary parentheses - ie: if ((foo == bar))
3507 if ($^V && $^V ge 5.10.0 &&
3508 $line =~ /\bif\s*((?:\(\s*){2,})/) {
3509 my $openparens = $1;
3510 my $count = $openparens =~ tr@\(@\(@;
3511 my $msg = "";
3512 if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
3513 my $comp = $4; #Not $1 because of $LvalOrFunc
3514 $msg = " - maybe == should be = ?" if ($comp eq "==");
3515 WARN("UNNECESSARY_PARENTHESES",
3516 "Unnecessary parentheses$msg\n" . $herecurr);
3517 }
3518 }
3519
53a3c448
AW
3520# Return of what appears to be an errno should normally be -'ve
3521 if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) {
3522 my $name = $1;
3523 if ($name ne 'EOF' && $name ne 'ERROR') {
000d1cc1
JP
3524 WARN("USE_NEGATIVE_ERRNO",
3525 "return of an errno should typically be -ve (return -$1)\n" . $herecurr);
53a3c448
AW
3526 }
3527 }
c45dcabd 3528
0a920b5b 3529# Need a space before open parenthesis after if, while etc
3705ce5b
JP
3530 if ($line =~ /\b(if|while|for|switch)\(/) {
3531 if (ERROR("SPACING",
3532 "space required before the open parenthesis '('\n" . $herecurr) &&
3533 $fix) {
3534 $fixed[$linenr - 1] =~
3535 s/\b(if|while|for|switch)\(/$1 \(/;
3536 }
0a920b5b
AW
3537 }
3538
f5fe35dd
AW
3539# Check for illegal assignment in if conditional -- and check for trailing
3540# statements after the conditional.
170d3a22 3541 if ($line =~ /do\s*(?!{)/) {
3e469cdc
AW
3542 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3543 ctx_statement_block($linenr, $realcnt, 0)
3544 if (!defined $stat);
170d3a22
AW
3545 my ($stat_next) = ctx_statement_block($line_nr_next,
3546 $remain_next, $off_next);
3547 $stat_next =~ s/\n./\n /g;
3548 ##print "stat<$stat> stat_next<$stat_next>\n";
3549
3550 if ($stat_next =~ /^\s*while\b/) {
3551 # If the statement carries leading newlines,
3552 # then count those as offsets.
3553 my ($whitespace) =
3554 ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
3555 my $offset =
3556 statement_rawlines($whitespace) - 1;
3557
3558 $suppress_whiletrailers{$line_nr_next +
3559 $offset} = 1;
3560 }
3561 }
3562 if (!defined $suppress_whiletrailers{$linenr} &&
c11230f4 3563 defined($stat) && defined($cond) &&
170d3a22 3564 $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
171ae1a4 3565 my ($s, $c) = ($stat, $cond);
8905a67c 3566
b53c8e10 3567 if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
000d1cc1
JP
3568 ERROR("ASSIGN_IN_IF",
3569 "do not use assignment in if condition\n" . $herecurr);
8905a67c
AW
3570 }
3571
3572 # Find out what is on the end of the line after the
3573 # conditional.
773647a0 3574 substr($s, 0, length($c), '');
8905a67c 3575 $s =~ s/\n.*//g;
13214adf 3576 $s =~ s/$;//g; # Remove any comments
53210168
AW
3577 if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
3578 $c !~ /}\s*while\s*/)
773647a0 3579 {
bb44ad39
AW
3580 # Find out how long the conditional actually is.
3581 my @newlines = ($c =~ /\n/gs);
3582 my $cond_lines = 1 + $#newlines;
42bdf74c 3583 my $stat_real = '';
bb44ad39 3584
42bdf74c
HS
3585 $stat_real = raw_line($linenr, $cond_lines)
3586 . "\n" if ($cond_lines);
bb44ad39
AW
3587 if (defined($stat_real) && $cond_lines > 1) {
3588 $stat_real = "[...]\n$stat_real";
3589 }
3590
000d1cc1
JP
3591 ERROR("TRAILING_STATEMENTS",
3592 "trailing statements should be on next line\n" . $herecurr . $stat_real);
8905a67c
AW
3593 }
3594 }
3595
13214adf
AW
3596# Check for bitwise tests written as boolean
3597 if ($line =~ /
3598 (?:
3599 (?:\[|\(|\&\&|\|\|)
3600 \s*0[xX][0-9]+\s*
3601 (?:\&\&|\|\|)
3602 |
3603 (?:\&\&|\|\|)
3604 \s*0[xX][0-9]+\s*
3605 (?:\&\&|\|\||\)|\])
3606 )/x)
3607 {
000d1cc1
JP
3608 WARN("HEXADECIMAL_BOOLEAN_TEST",
3609 "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
13214adf
AW
3610 }
3611
8905a67c 3612# if and else should not have general statements after it
13214adf
AW
3613 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
3614 my $s = $1;
3615 $s =~ s/$;//g; # Remove any comments
3616 if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
000d1cc1
JP
3617 ERROR("TRAILING_STATEMENTS",
3618 "trailing statements should be on next line\n" . $herecurr);
13214adf 3619 }
0a920b5b 3620 }
39667782
AW
3621# if should not continue a brace
3622 if ($line =~ /}\s*if\b/) {
000d1cc1
JP
3623 ERROR("TRAILING_STATEMENTS",
3624 "trailing statements should be on next line\n" .
39667782
AW
3625 $herecurr);
3626 }
a1080bf8
AW
3627# case and default should not have general statements after them
3628 if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
3629 $line !~ /\G(?:
3fef12d6 3630 (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf8
AW
3631 \s*return\s+
3632 )/xg)
3633 {
000d1cc1
JP
3634 ERROR("TRAILING_STATEMENTS",
3635 "trailing statements should be on next line\n" . $herecurr);
a1080bf8 3636 }
0a920b5b
AW
3637
3638 # Check for }<nl>else {, these must be at the same
3639 # indent level to be relevant to each other.
3640 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and
3641 $previndent == $indent) {
000d1cc1
JP
3642 ERROR("ELSE_AFTER_BRACE",
3643 "else should follow close brace '}'\n" . $hereprev);
0a920b5b
AW
3644 }
3645
c2fdda0d
AW
3646 if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and
3647 $previndent == $indent) {
3648 my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
3649
3650 # Find out what is on the end of the line after the
3651 # conditional.
773647a0 3652 substr($s, 0, length($c), '');
c2fdda0d
AW
3653 $s =~ s/\n.*//g;
3654
3655 if ($s =~ /^\s*;/) {
000d1cc1
JP
3656 ERROR("WHILE_AFTER_BRACE",
3657 "while should follow close brace '}'\n" . $hereprev);
c2fdda0d
AW
3658 }
3659 }
3660
95e2c602 3661#Specific variable tests
323c1260
JP
3662 while ($line =~ m{($Constant|$Lval)}g) {
3663 my $var = $1;
95e2c602
JP
3664
3665#gcc binary extension
3666 if ($var =~ /^$Binary$/) {
d5e616fc
JP
3667 if (WARN("GCC_BINARY_CONSTANT",
3668 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
3669 $fix) {
3670 my $hexval = sprintf("0x%x", oct($var));
3671 $fixed[$linenr - 1] =~
3672 s/\b$var\b/$hexval/;
3673 }
95e2c602
JP
3674 }
3675
3676#CamelCase
807bd26c 3677 if ($var !~ /^$Constant$/ &&
be79794b 3678 $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
22735ce8 3679#Ignore Page<foo> variants
807bd26c 3680 $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
22735ce8 3681#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
3445686a 3682 $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) {
7e781f67
JP
3683 while ($var =~ m{($Ident)}g) {
3684 my $word = $1;
3685 next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
d8b07710
JP
3686 if ($check) {
3687 seed_camelcase_includes();
3688 if (!$file && !$camelcase_file_seeded) {
3689 seed_camelcase_file($realfile);
3690 $camelcase_file_seeded = 1;
3691 }
3692 }
7e781f67
JP
3693 if (!defined $camelcase{$word}) {
3694 $camelcase{$word} = 1;
3695 CHK("CAMELCASE",
3696 "Avoid CamelCase: <$word>\n" . $herecurr);
3697 }
3445686a 3698 }
323c1260
JP
3699 }
3700 }
0a920b5b
AW
3701
3702#no spaces allowed after \ in define
d5e616fc
JP
3703 if ($line =~ /\#\s*define.*\\\s+$/) {
3704 if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
3705 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
3706 $fix) {
3707 $fixed[$linenr - 1] =~ s/\s+$//;
3708 }
0a920b5b
AW
3709 }
3710
653d4876 3711#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line)
c45dcabd 3712 if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec48
AW
3713 my $file = "$1.h";
3714 my $checkfile = "include/linux/$file";
3715 if (-f "$root/$checkfile" &&
3716 $realfile ne $checkfile &&
7840a94c 3717 $1 !~ /$allowed_asm_includes/)
c45dcabd 3718 {
e09dec48 3719 if ($realfile =~ m{^arch/}) {
000d1cc1
JP
3720 CHK("ARCH_INCLUDE_LINUX",
3721 "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
e09dec48 3722 } else {
000d1cc1
JP
3723 WARN("INCLUDE_LINUX",
3724 "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
e09dec48 3725 }
0a920b5b
AW
3726 }
3727 }
3728
653d4876
AW
3729# multi-statement macros should be enclosed in a do while loop, grab the
3730# first statement and ensure its the whole macro if its not enclosed
cf655043 3731# in a known good container
b8f96a31
AW
3732 if ($realfile !~ m@/vmlinux.lds.h$@ &&
3733 $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf121
AW
3734 my $ln = $linenr;
3735 my $cnt = $realcnt;
c45dcabd
AW
3736 my ($off, $dstat, $dcond, $rest);
3737 my $ctx = '';
c45dcabd 3738 ($dstat, $dcond, $ln, $cnt, $off) =
f74bd194
AW
3739 ctx_statement_block($linenr, $realcnt, 0);
3740 $ctx = $dstat;
c45dcabd 3741 #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
a3bb97a7 3742 #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
c45dcabd 3743
f74bd194 3744 $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
292f1a9b 3745 $dstat =~ s/$;//g;
c45dcabd
AW
3746 $dstat =~ s/\\\n.//g;
3747 $dstat =~ s/^\s*//s;
3748 $dstat =~ s/\s*$//s;
de7d4f0e 3749
c45dcabd 3750 # Flatten any parentheses and braces
bf30d6ed
AW
3751 while ($dstat =~ s/\([^\(\)]*\)/1/ ||
3752 $dstat =~ s/\{[^\{\}]*\}/1/ ||
c81769fd 3753 $dstat =~ s/\[[^\[\]]*\]/1/)
bf30d6ed 3754 {
de7d4f0e 3755 }
d8aaf121 3756
e45bab8e
AW
3757 # Flatten any obvious string concatentation.
3758 while ($dstat =~ s/("X*")\s*$Ident/$1/ ||
3759 $dstat =~ s/$Ident\s*("X*")/$1/)
3760 {
3761 }
3762
c45dcabd
AW
3763 my $exceptions = qr{
3764 $Declare|
3765 module_param_named|
a0a0a7a9 3766 MODULE_PARM_DESC|
c45dcabd
AW
3767 DECLARE_PER_CPU|
3768 DEFINE_PER_CPU|
383099fd 3769 __typeof__\(|
22fd2d3e
SS
3770 union|
3771 struct|
ea71a0a0
AW
3772 \.$Ident\s*=\s*|
3773 ^\"|\"$
c45dcabd 3774 }x;
5eaa20b9 3775 #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
f74bd194
AW
3776 if ($dstat ne '' &&
3777 $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(),
3778 $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo();
3cc4b1c3 3779 $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
356fd398 3780 $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ && # character constants
f74bd194
AW
3781 $dstat !~ /$exceptions/ &&
3782 $dstat !~ /^\.$Ident\s*=/ && # .foo =
e942e2c3 3783 $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo
72f115f9 3784 $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...)
f74bd194
AW
3785 $dstat !~ /^for\s*$Constant$/ && # for (...)
3786 $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar()
3787 $dstat !~ /^do\s*{/ && # do {...
f95a7e6a
JP
3788 $dstat !~ /^\({/ && # ({...
3789 $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
f74bd194
AW
3790 {
3791 $ctx =~ s/\n*$//;
3792 my $herectx = $here . "\n";
3793 my $cnt = statement_rawlines($ctx);
3794
3795 for (my $n = 0; $n < $cnt; $n++) {
3796 $herectx .= raw_line($linenr, $n) . "\n";
c45dcabd
AW
3797 }
3798
f74bd194
AW
3799 if ($dstat =~ /;/) {
3800 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
3801 "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
3802 } else {
000d1cc1 3803 ERROR("COMPLEX_MACRO",
f74bd194 3804 "Macros with complex values should be enclosed in parenthesis\n" . "$herectx");
d8aaf121 3805 }
653d4876 3806 }
5023d347 3807
481eb486 3808# check for line continuations outside of #defines, preprocessor #, and asm
5023d347
JP
3809
3810 } else {
3811 if ($prevline !~ /^..*\\$/ &&
481eb486
JP
3812 $line !~ /^\+\s*\#.*\\$/ && # preprocessor
3813 $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm
5023d347
JP
3814 $line =~ /^\+.*\\$/) {
3815 WARN("LINE_CONTINUATIONS",
3816 "Avoid unnecessary line continuations\n" . $herecurr);
3817 }
0a920b5b
AW
3818 }
3819
b13edf7f
JP
3820# do {} while (0) macro tests:
3821# single-statement macros do not need to be enclosed in do while (0) loop,
3822# macro should not end with a semicolon
3823 if ($^V && $^V ge 5.10.0 &&
3824 $realfile !~ m@/vmlinux.lds.h$@ &&
3825 $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
3826 my $ln = $linenr;
3827 my $cnt = $realcnt;
3828 my ($off, $dstat, $dcond, $rest);
3829 my $ctx = '';
3830 ($dstat, $dcond, $ln, $cnt, $off) =
3831 ctx_statement_block($linenr, $realcnt, 0);
3832 $ctx = $dstat;
3833
3834 $dstat =~ s/\\\n.//g;
3835
3836 if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
3837 my $stmts = $2;
3838 my $semis = $3;
3839
3840 $ctx =~ s/\n*$//;
3841 my $cnt = statement_rawlines($ctx);
3842 my $herectx = $here . "\n";
3843
3844 for (my $n = 0; $n < $cnt; $n++) {
3845 $herectx .= raw_line($linenr, $n) . "\n";
3846 }
3847
ac8e97f8
JP
3848 if (($stmts =~ tr/;/;/) == 1 &&
3849 $stmts !~ /^\s*(if|while|for|switch)\b/) {
b13edf7f
JP
3850 WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
3851 "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
3852 }
3853 if (defined $semis && $semis ne "") {
3854 WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
3855 "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
3856 }
f5ef95b1
JP
3857 } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
3858 $ctx =~ s/\n*$//;
3859 my $cnt = statement_rawlines($ctx);
3860 my $herectx = $here . "\n";
3861
3862 for (my $n = 0; $n < $cnt; $n++) {
3863 $herectx .= raw_line($linenr, $n) . "\n";
3864 }
3865
3866 WARN("TRAILING_SEMICOLON",
3867 "macros should not use a trailing semicolon\n" . "$herectx");
b13edf7f
JP
3868 }
3869 }
3870
080ba929
MF
3871# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
3872# all assignments may have only one of the following with an assignment:
3873# .
3874# ALIGN(...)
3875# VMLINUX_SYMBOL(...)
3876 if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
000d1cc1
JP
3877 WARN("MISSING_VMLINUX_SYMBOL",
3878 "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
080ba929
MF
3879 }
3880
f0a594c1 3881# check for redundant bracing round if etc
13214adf
AW
3882 if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
3883 my ($level, $endln, @chunks) =
cf655043 3884 ctx_statement_full($linenr, $realcnt, 1);
13214adf 3885 #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
cf655043
AW
3886 #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
3887 if ($#chunks > 0 && $level == 0) {
aad4f614
JP
3888 my @allowed = ();
3889 my $allow = 0;
13214adf 3890 my $seen = 0;
773647a0 3891 my $herectx = $here . "\n";
cf655043 3892 my $ln = $linenr - 1;
13214adf
AW
3893 for my $chunk (@chunks) {
3894 my ($cond, $block) = @{$chunk};
3895
773647a0
AW
3896 # If the condition carries leading newlines, then count those as offsets.
3897 my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
3898 my $offset = statement_rawlines($whitespace) - 1;
3899
aad4f614 3900 $allowed[$allow] = 0;
773647a0
AW
3901 #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
3902
3903 # We have looked at and allowed this specific line.
3904 $suppress_ifbraces{$ln + $offset} = 1;
3905
3906 $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
cf655043
AW
3907 $ln += statement_rawlines($block) - 1;
3908
773647a0 3909 substr($block, 0, length($cond), '');
13214adf
AW
3910
3911 $seen++ if ($block =~ /^\s*{/);
3912
aad4f614 3913 #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
cf655043
AW
3914 if (statement_lines($cond) > 1) {
3915 #print "APW: ALLOWED: cond<$cond>\n";
aad4f614 3916 $allowed[$allow] = 1;
13214adf
AW
3917 }
3918 if ($block =~/\b(?:if|for|while)\b/) {
cf655043 3919 #print "APW: ALLOWED: block<$block>\n";
aad4f614 3920 $allowed[$allow] = 1;
13214adf 3921 }
cf655043
AW
3922 if (statement_block_size($block) > 1) {
3923 #print "APW: ALLOWED: lines block<$block>\n";
aad4f614 3924 $allowed[$allow] = 1;
13214adf 3925 }
aad4f614 3926 $allow++;
13214adf 3927 }
aad4f614
JP
3928 if ($seen) {
3929 my $sum_allowed = 0;
3930 foreach (@allowed) {
3931 $sum_allowed += $_;
3932 }
3933 if ($sum_allowed == 0) {
3934 WARN("BRACES",
3935 "braces {} are not necessary for any arm of this statement\n" . $herectx);
3936 } elsif ($sum_allowed != $allow &&
3937 $seen != $allow) {
3938 CHK("BRACES",
3939 "braces {} should be used on all arms of this statement\n" . $herectx);
3940 }
13214adf
AW
3941 }
3942 }
3943 }
773647a0 3944 if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf 3945 $line =~ /\b(if|while|for|else)\b/) {
cf655043
AW
3946 my $allowed = 0;
3947
3948 # Check the pre-context.
3949 if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
3950 #print "APW: ALLOWED: pre<$1>\n";
3951 $allowed = 1;
3952 }
773647a0
AW
3953
3954 my ($level, $endln, @chunks) =
3955 ctx_statement_full($linenr, $realcnt, $-[0]);
3956
cf655043
AW
3957 # Check the condition.
3958 my ($cond, $block) = @{$chunks[0]};
773647a0 3959 #print "CHECKING<$linenr> cond<$cond> block<$block>\n";
cf655043 3960 if (defined $cond) {
773647a0 3961 substr($block, 0, length($cond), '');
cf655043
AW
3962 }
3963 if (statement_lines($cond) > 1) {
3964 #print "APW: ALLOWED: cond<$cond>\n";
3965 $allowed = 1;
3966 }
3967 if ($block =~/\b(?:if|for|while)\b/) {
3968 #print "APW: ALLOWED: block<$block>\n";
3969 $allowed = 1;
3970 }
3971 if (statement_block_size($block) > 1) {
3972 #print "APW: ALLOWED: lines block<$block>\n";
3973 $allowed = 1;
3974 }
3975 # Check the post-context.
3976 if (defined $chunks[1]) {
3977 my ($cond, $block) = @{$chunks[1]};
3978 if (defined $cond) {
773647a0 3979 substr($block, 0, length($cond), '');
cf655043
AW
3980 }
3981 if ($block =~ /^\s*\{/) {
3982 #print "APW: ALLOWED: chunk-1 block<$block>\n";
3983 $allowed = 1;
3984 }
3985 }
3986 if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
69932487 3987 my $herectx = $here . "\n";
f055663c 3988 my $cnt = statement_rawlines($block);
cf655043 3989
f055663c 3990 for (my $n = 0; $n < $cnt; $n++) {
69932487 3991 $herectx .= raw_line($linenr, $n) . "\n";
f0a594c1 3992 }
cf655043 3993
000d1cc1
JP
3994 WARN("BRACES",
3995 "braces {} are not necessary for single statement blocks\n" . $herectx);
f0a594c1
AW
3996 }
3997 }
3998
0979ae66 3999# check for unnecessary blank lines around braces
77b9a53a 4000 if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
0979ae66
JP
4001 CHK("BRACES",
4002 "Blank lines aren't necessary before a close brace '}'\n" . $hereprev);
4003 }
77b9a53a 4004 if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
0979ae66
JP
4005 CHK("BRACES",
4006 "Blank lines aren't necessary after an open brace '{'\n" . $hereprev);
4007 }
4008
4a0df2ef 4009# no volatiles please
6c72ffaa
AW
4010 my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
4011 if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
000d1cc1
JP
4012 WARN("VOLATILE",
4013 "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
4a0df2ef
AW
4014 }
4015
00df344f 4016# warn about #if 0
c45dcabd 4017 if ($line =~ /^.\s*\#\s*if\s+0\b/) {
000d1cc1
JP
4018 CHK("REDUNDANT_CODE",
4019 "if this code is redundant consider removing it\n" .
de7d4f0e 4020 $herecurr);
4a0df2ef
AW
4021 }
4022
03df4b51
AW
4023# check for needless "if (<foo>) fn(<foo>)" uses
4024 if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
4025 my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
4026 if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
4027 WARN('NEEDLESS_IF',
4028 "$1(NULL) is safe this check is probably not required\n" . $hereprev);
4c432a8f
GKH
4029 }
4030 }
f0a594c1 4031
ebfdc409
JP
4032# check for unnecessary "Out of Memory" messages
4033 if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
4034 $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
4035 (defined $1 || defined $3) &&
4036 $linenr > 3) {
4037 my $testval = $2;
4038 my $testline = $lines[$linenr - 3];
4039
4040 my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
4041# print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
4042
4043 if ($c =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|(?:dev_)?alloc_skb)/) {
4044 WARN("OOM_MESSAGE",
4045 "Possible unnecessary 'out of memory' message\n" . $hereprev);
4046 }
4047 }
4048
8716de38
JP
4049# check for bad placement of section $InitAttribute (e.g.: __initdata)
4050 if ($line =~ /(\b$InitAttribute\b)/) {
4051 my $attr = $1;
4052 if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
4053 my $ptr = $1;
4054 my $var = $2;
4055 if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
4056 ERROR("MISPLACED_INIT",
4057 "$attr should be placed after $var\n" . $herecurr)) ||
4058 ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
4059 WARN("MISPLACED_INIT",
4060 "$attr should be placed after $var\n" . $herecurr))) &&
4061 $fix) {
4062 $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;
4063 }
4064 }
4065 }
4066
e970b884
JP
4067# check for $InitAttributeData (ie: __initdata) with const
4068 if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
4069 my $attr = $1;
4070 $attr =~ /($InitAttributePrefix)(.*)/;
4071 my $attr_prefix = $1;
4072 my $attr_type = $2;
4073 if (ERROR("INIT_ATTRIBUTE",
4074 "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
4075 $fix) {
4076 $fixed[$linenr - 1] =~
4077 s/$InitAttributeData/${attr_prefix}initconst/;
4078 }
4079 }
4080
4081# check for $InitAttributeConst (ie: __initconst) without const
4082 if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
4083 my $attr = $1;
4084 if (ERROR("INIT_ATTRIBUTE",
4085 "Use of $attr requires a separate use of const\n" . $herecurr) &&
4086 $fix) {
4087 my $lead = $fixed[$linenr - 1] =~
4088 /(^\+\s*(?:static\s+))/;
4089 $lead = rtrim($1);
4090 $lead = "$lead " if ($lead !~ /^\+$/);
4091 $lead = "${lead}const ";
4092 $fixed[$linenr - 1] =~ s/(^\+\s*(?:static\s+))/$lead/;
4093 }
4094 }
4095
fbdb8138
JP
4096# don't use __constant_<foo> functions outside of include/uapi/
4097 if ($realfile !~ m@^include/uapi/@ &&
4098 $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
4099 my $constant_func = $1;
4100 my $func = $constant_func;
4101 $func =~ s/^__constant_//;
4102 if (WARN("CONSTANT_CONVERSION",
4103 "$constant_func should be $func\n" . $herecurr) &&
4104 $fix) {
4105 $fixed[$linenr - 1] =~ s/\b$constant_func\b/$func/g;
4106 }
4107 }
4108
1a15a250 4109# prefer usleep_range over udelay
37581c28 4110 if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
43c1d77c 4111 my $delay = $1;
1a15a250 4112 # ignore udelay's < 10, however
43c1d77c 4113 if (! ($delay < 10) ) {
000d1cc1 4114 CHK("USLEEP_RANGE",
43c1d77c
JP
4115 "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);
4116 }
4117 if ($delay > 2000) {
4118 WARN("LONG_UDELAY",
4119 "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
1a15a250
PP
4120 }
4121 }
4122
09ef8725
PP
4123# warn about unexpectedly long msleep's
4124 if ($line =~ /\bmsleep\s*\((\d+)\);/) {
4125 if ($1 < 20) {
000d1cc1 4126 WARN("MSLEEP",
43c1d77c 4127 "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);
09ef8725
PP
4128 }
4129 }
4130
36ec1939
JP
4131# check for comparisons of jiffies
4132 if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
4133 WARN("JIFFIES_COMPARISON",
4134 "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
4135 }
4136
9d7a34a5
JP
4137# check for comparisons of get_jiffies_64()
4138 if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
4139 WARN("JIFFIES_COMPARISON",
4140 "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
4141 }
4142
00df344f 4143# warn about #ifdefs in C files
c45dcabd 4144# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344f
AW
4145# print "#ifdef in C files should be avoided\n";
4146# print "$herecurr";
4147# $clean = 0;
4148# }
4149
22f2a2ef 4150# warn about spacing in #ifdefs
c45dcabd 4151 if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
3705ce5b
JP
4152 if (ERROR("SPACING",
4153 "exactly one space required after that #$1\n" . $herecurr) &&
4154 $fix) {
4155 $fixed[$linenr - 1] =~
4156 s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
4157 }
4158
22f2a2ef
AW
4159 }
4160
4a0df2ef 4161# check for spinlock_t definitions without a comment.
171ae1a4
AW
4162 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
4163 $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef
AW
4164 my $which = $1;
4165 if (!ctx_has_comment($first_line, $linenr)) {
000d1cc1
JP
4166 CHK("UNCOMMENTED_DEFINITION",
4167 "$1 definition without comment\n" . $herecurr);
4a0df2ef
AW
4168 }
4169 }
4170# check for memory barriers without a comment.
4171 if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) {
4172 if (!ctx_has_comment($first_line, $linenr)) {
c1fd7bb9
JP
4173 WARN("MEMORY_BARRIER",
4174 "memory barrier without comment\n" . $herecurr);
4a0df2ef
AW
4175 }
4176 }
4177# check of hardware specific defines
c45dcabd 4178 if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
000d1cc1
JP
4179 CHK("ARCH_DEFINES",
4180 "architecture specific defines should be avoided\n" . $herecurr);
0a920b5b 4181 }
653d4876 4182
d4977c78
TK
4183# Check that the storage class is at the beginning of a declaration
4184 if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
000d1cc1
JP
4185 WARN("STORAGE_CLASS",
4186 "storage class should be at the beginning of the declaration\n" . $herecurr)
d4977c78
TK
4187 }
4188
de7d4f0e
AW
4189# check the location of the inline attribute, that it is between
4190# storage class and type.
9c0ca6f9
AW
4191 if ($line =~ /\b$Type\s+$Inline\b/ ||
4192 $line =~ /\b$Inline\s+$Storage\b/) {
000d1cc1
JP
4193 ERROR("INLINE_LOCATION",
4194 "inline keyword should sit between storage class and type\n" . $herecurr);
de7d4f0e
AW
4195 }
4196
8905a67c 4197# Check for __inline__ and __inline, prefer inline
2b7ab453
JP
4198 if ($realfile !~ m@\binclude/uapi/@ &&
4199 $line =~ /\b(__inline__|__inline)\b/) {
d5e616fc
JP
4200 if (WARN("INLINE",
4201 "plain inline is preferred over $1\n" . $herecurr) &&
4202 $fix) {
4203 $fixed[$linenr - 1] =~ s/\b(__inline__|__inline)\b/inline/;
4204
4205 }
8905a67c
AW
4206 }
4207
3d130fd0 4208# Check for __attribute__ packed, prefer __packed
2b7ab453
JP
4209 if ($realfile !~ m@\binclude/uapi/@ &&
4210 $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
000d1cc1
JP
4211 WARN("PREFER_PACKED",
4212 "__packed is preferred over __attribute__((packed))\n" . $herecurr);
3d130fd0
JP
4213 }
4214
39b7e287 4215# Check for __attribute__ aligned, prefer __aligned
2b7ab453
JP
4216 if ($realfile !~ m@\binclude/uapi/@ &&
4217 $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
000d1cc1
JP
4218 WARN("PREFER_ALIGNED",
4219 "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
39b7e287
JP
4220 }
4221
5f14d3bd 4222# Check for __attribute__ format(printf, prefer __printf
2b7ab453
JP
4223 if ($realfile !~ m@\binclude/uapi/@ &&
4224 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
d5e616fc
JP
4225 if (WARN("PREFER_PRINTF",
4226 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
4227 $fix) {
4228 $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
4229
4230 }
5f14d3bd
JP
4231 }
4232
6061d949 4233# Check for __attribute__ format(scanf, prefer __scanf
2b7ab453
JP
4234 if ($realfile !~ m@\binclude/uapi/@ &&
4235 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
d5e616fc
JP
4236 if (WARN("PREFER_SCANF",
4237 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
4238 $fix) {
4239 $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
4240 }
6061d949
JP
4241 }
4242
8f53a9b8
JP
4243# check for sizeof(&)
4244 if ($line =~ /\bsizeof\s*\(\s*\&/) {
000d1cc1
JP
4245 WARN("SIZEOF_ADDRESS",
4246 "sizeof(& should be avoided\n" . $herecurr);
8f53a9b8
JP
4247 }
4248
66c80b60
JP
4249# check for sizeof without parenthesis
4250 if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
d5e616fc
JP
4251 if (WARN("SIZEOF_PARENTHESIS",
4252 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
4253 $fix) {
4254 $fixed[$linenr - 1] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
4255 }
66c80b60
JP
4256 }
4257
428e2fdc
JP
4258# check for line continuations in quoted strings with odd counts of "
4259 if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
000d1cc1
JP
4260 WARN("LINE_CONTINUATIONS",
4261 "Avoid line continuations in quoted strings\n" . $herecurr);
428e2fdc
JP
4262 }
4263
88982fea
JP
4264# check for struct spinlock declarations
4265 if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
4266 WARN("USE_SPINLOCK_T",
4267 "struct spinlock should be spinlock_t\n" . $herecurr);
4268 }
4269
a6962d72 4270# check for seq_printf uses that could be seq_puts
06668727 4271 if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
a6962d72 4272 my $fmt = get_quoted_string($line, $rawline);
06668727 4273 if ($fmt ne "" && $fmt !~ /[^\\]\%/) {
d5e616fc
JP
4274 if (WARN("PREFER_SEQ_PUTS",
4275 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
4276 $fix) {
4277 $fixed[$linenr - 1] =~ s/\bseq_printf\b/seq_puts/;
4278 }
a6962d72
JP
4279 }
4280 }
4281
554e165c 4282# Check for misused memsets
d1fe9c09
JP
4283 if ($^V && $^V ge 5.10.0 &&
4284 defined $stat &&
d7c76ba7
JP
4285 $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) {
4286
4287 my $ms_addr = $2;
d1fe9c09
JP
4288 my $ms_val = $7;
4289 my $ms_size = $12;
554e165c 4290
554e165c
AW
4291 if ($ms_size =~ /^(0x|)0$/i) {
4292 ERROR("MEMSET",
d7c76ba7 4293 "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
554e165c
AW
4294 } elsif ($ms_size =~ /^(0x|)1$/i) {
4295 WARN("MEMSET",
d7c76ba7
JP
4296 "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
4297 }
4298 }
4299
98a9bba5
JP
4300# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
4301 if ($^V && $^V ge 5.10.0 &&
4302 $line =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/s) {
4303 if (WARN("PREFER_ETHER_ADDR_COPY",
4304 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . $herecurr) &&
4305 $fix) {
4306 $fixed[$linenr - 1] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
4307 }
4308 }
4309
d7c76ba7 4310# typecasts on min/max could be min_t/max_t
d1fe9c09
JP
4311 if ($^V && $^V ge 5.10.0 &&
4312 defined $stat &&
d7c76ba7 4313 $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
d1fe9c09 4314 if (defined $2 || defined $7) {
d7c76ba7
JP
4315 my $call = $1;
4316 my $cast1 = deparenthesize($2);
4317 my $arg1 = $3;
d1fe9c09
JP
4318 my $cast2 = deparenthesize($7);
4319 my $arg2 = $8;
d7c76ba7
JP
4320 my $cast;
4321
d1fe9c09 4322 if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
d7c76ba7
JP
4323 $cast = "$cast1 or $cast2";
4324 } elsif ($cast1 ne "") {
4325 $cast = $cast1;
4326 } else {
4327 $cast = $cast2;
4328 }
4329 WARN("MINMAX",
4330 "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
554e165c
AW
4331 }
4332 }
4333
4a273195
JP
4334# check usleep_range arguments
4335 if ($^V && $^V ge 5.10.0 &&
4336 defined $stat &&
4337 $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
4338 my $min = $1;
4339 my $max = $7;
4340 if ($min eq $max) {
4341 WARN("USLEEP_RANGE",
4342 "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4343 } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
4344 $min > $max) {
4345 WARN("USLEEP_RANGE",
4346 "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
4347 }
4348 }
4349
823b794c
JP
4350# check for naked sscanf
4351 if ($^V && $^V ge 5.10.0 &&
4352 defined $stat &&
6c8bd707 4353 $line =~ /\bsscanf\b/ &&
823b794c
JP
4354 ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
4355 $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
4356 $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
4357 my $lc = $stat =~ tr@\n@@;
4358 $lc = $lc + $linenr;
4359 my $stat_real = raw_line($linenr, 0);
4360 for (my $count = $linenr + 1; $count <= $lc; $count++) {
4361 $stat_real = $stat_real . "\n" . raw_line($count, 0);
4362 }
4363 WARN("NAKED_SSCANF",
4364 "unchecked sscanf return value\n" . "$here\n$stat_real\n");
4365 }
4366
afc819ab
JP
4367# check for simple sscanf that should be kstrto<foo>
4368 if ($^V && $^V ge 5.10.0 &&
4369 defined $stat &&
4370 $line =~ /\bsscanf\b/) {
4371 my $lc = $stat =~ tr@\n@@;
4372 $lc = $lc + $linenr;
4373 my $stat_real = raw_line($linenr, 0);
4374 for (my $count = $linenr + 1; $count <= $lc; $count++) {
4375 $stat_real = $stat_real . "\n" . raw_line($count, 0);
4376 }
4377 if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
4378 my $format = $6;
4379 my $count = $format =~ tr@%@%@;
4380 if ($count == 1 &&
4381 $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
4382 WARN("SSCANF_TO_KSTRTO",
4383 "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
4384 }
4385 }
4386 }
4387
70dc8a48
JP
4388# check for new externs in .h files.
4389 if ($realfile =~ /\.h$/ &&
4390 $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
d1d85780
JP
4391 if (CHK("AVOID_EXTERNS",
4392 "extern prototypes should be avoided in .h files\n" . $herecurr) &&
70dc8a48
JP
4393 $fix) {
4394 $fixed[$linenr - 1] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
4395 }
4396 }
4397
de7d4f0e 4398# check for new externs in .c files.
171ae1a4 4399 if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd 4400 $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a4 4401 {
c45dcabd
AW
4402 my $function_name = $1;
4403 my $paren_space = $2;
171ae1a4
AW
4404
4405 my $s = $stat;
4406 if (defined $cond) {
4407 substr($s, 0, length($cond), '');
4408 }
c45dcabd
AW
4409 if ($s =~ /^\s*;/ &&
4410 $function_name ne 'uninitialized_var')
4411 {
000d1cc1
JP
4412 WARN("AVOID_EXTERNS",
4413 "externs should be avoided in .c files\n" . $herecurr);
171ae1a4
AW
4414 }
4415
4416 if ($paren_space =~ /\n/) {
000d1cc1
JP
4417 WARN("FUNCTION_ARGUMENTS",
4418 "arguments for function declarations should follow identifier\n" . $herecurr);
171ae1a4 4419 }
9c9ba34e
AW
4420
4421 } elsif ($realfile =~ /\.c$/ && defined $stat &&
4422 $stat =~ /^.\s*extern\s+/)
4423 {
000d1cc1
JP
4424 WARN("AVOID_EXTERNS",
4425 "externs should be avoided in .c files\n" . $herecurr);
de7d4f0e
AW
4426 }
4427
4428# checks for new __setup's
4429 if ($rawline =~ /\b__setup\("([^"]*)"/) {
4430 my $name = $1;
4431
4432 if (!grep(/$name/, @setup_docs)) {
000d1cc1
JP
4433 CHK("UNDOCUMENTED_SETUP",
4434 "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
de7d4f0e 4435 }
653d4876 4436 }
9c0ca6f9
AW
4437
4438# check for pointless casting of kmalloc return
caf2a54f 4439 if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
000d1cc1
JP
4440 WARN("UNNECESSARY_CASTS",
4441 "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
9c0ca6f9 4442 }
13214adf 4443
a640d25c
JP
4444# alloc style
4445# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
4446 if ($^V && $^V ge 5.10.0 &&
4447 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
4448 CHK("ALLOC_SIZEOF_STRUCT",
4449 "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
4450 }
4451
60a55369
JP
4452# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
4453 if ($^V && $^V ge 5.10.0 &&
4454 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/) {
4455 my $oldfunc = $3;
4456 my $a1 = $4;
4457 my $a2 = $10;
4458 my $newfunc = "kmalloc_array";
4459 $newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
4460 if ($a1 =~ /^sizeof\s*\S/ || $a2 =~ /^sizeof\s*\S/) {
4461 if (WARN("ALLOC_WITH_MULTIPLY",
4462 "Prefer $newfunc over $oldfunc with multiply\n" . $herecurr) &&
4463 $fix) {
4464 my $r1 = $a1;
4465 my $r2 = $a2;
4466 if ($a1 =~ /^sizeof\s*\S/) {
4467 $r1 = $a2;
4468 $r2 = $a1;
4469 }
4470 $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;
4471
4472 }
4473 }
4474 }
4475
972fdea2
JP
4476# check for krealloc arg reuse
4477 if ($^V && $^V ge 5.10.0 &&
4478 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
4479 WARN("KREALLOC_ARG_REUSE",
4480 "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
4481 }
4482
5ce59ae0
JP
4483# check for alloc argument mismatch
4484 if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
4485 WARN("ALLOC_ARRAY_ARGS",
4486 "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
4487 }
4488
caf2a54f
JP
4489# check for multiple semicolons
4490 if ($line =~ /;\s*;\s*$/) {
d5e616fc
JP
4491 if (WARN("ONE_SEMICOLON",
4492 "Statements terminations use 1 semicolon\n" . $herecurr) &&
4493 $fix) {
4494 $fixed[$linenr - 1] =~ s/(\s*;\s*){2,}$/;/g;
4495 }
d1e2ad07
JP
4496 }
4497
c34c09a8
JP
4498# check for case / default statements not preceeded by break/fallthrough/switch
4499 if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
4500 my $has_break = 0;
4501 my $has_statement = 0;
4502 my $count = 0;
4503 my $prevline = $linenr;
4504 while ($prevline > 1 && $count < 3 && !$has_break) {
4505 $prevline--;
4506 my $rline = $rawlines[$prevline - 1];
4507 my $fline = $lines[$prevline - 1];
4508 last if ($fline =~ /^\@\@/);
4509 next if ($fline =~ /^\-/);
4510 next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
4511 $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
4512 next if ($fline =~ /^.[\s$;]*$/);
4513 $has_statement = 1;
4514 $count++;
4515 $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);
4516 }
4517 if (!$has_break && $has_statement) {
4518 WARN("MISSING_BREAK",
4519 "Possible switch case/default not preceeded by break or fallthrough comment\n" . $herecurr);
4520 }
4521 }
4522
d1e2ad07
JP
4523# check for switch/default statements without a break;
4524 if ($^V && $^V ge 5.10.0 &&
4525 defined $stat &&
4526 $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
4527 my $ctx = '';
4528 my $herectx = $here . "\n";
4529 my $cnt = statement_rawlines($stat);
4530 for (my $n = 0; $n < $cnt; $n++) {
4531 $herectx .= raw_line($linenr, $n) . "\n";
4532 }
4533 WARN("DEFAULT_NO_BREAK",
4534 "switch default: should use break\n" . $herectx);
caf2a54f
JP
4535 }
4536
13214adf 4537# check for gcc specific __FUNCTION__
d5e616fc
JP
4538 if ($line =~ /\b__FUNCTION__\b/) {
4539 if (WARN("USE_FUNC",
4540 "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) &&
4541 $fix) {
4542 $fixed[$linenr - 1] =~ s/\b__FUNCTION__\b/__func__/g;
4543 }
13214adf 4544 }
773647a0 4545
2c92488a
JP
4546# check for use of yield()
4547 if ($line =~ /\byield\s*\(\s*\)/) {
4548 WARN("YIELD",
4549 "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr);
4550 }
4551
179f8f40
JP
4552# check for comparisons against true and false
4553 if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
4554 my $lead = $1;
4555 my $arg = $2;
4556 my $test = $3;
4557 my $otype = $4;
4558 my $trail = $5;
4559 my $op = "!";
4560
4561 ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
4562
4563 my $type = lc($otype);
4564 if ($type =~ /^(?:true|false)$/) {
4565 if (("$test" eq "==" && "$type" eq "true") ||
4566 ("$test" eq "!=" && "$type" eq "false")) {
4567 $op = "";
4568 }
4569
4570 CHK("BOOL_COMPARISON",
4571 "Using comparison to $otype is error prone\n" . $herecurr);
4572
4573## maybe suggesting a correct construct would better
4574## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
4575
4576 }
4577 }
4578
4882720b
TG
4579# check for semaphores initialized locked
4580 if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
000d1cc1
JP
4581 WARN("CONSIDER_COMPLETION",
4582 "consider using a completion\n" . $herecurr);
773647a0 4583 }
6712d858 4584
67d0a075
JP
4585# recommend kstrto* over simple_strto* and strict_strto*
4586 if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
000d1cc1 4587 WARN("CONSIDER_KSTRTO",
67d0a075 4588 "$1 is obsolete, use k$3 instead\n" . $herecurr);
773647a0 4589 }
6712d858 4590
ae3ccc46 4591# check for __initcall(), use device_initcall() explicitly or more appropriate function please
f3db6639 4592 if ($line =~ /^.\s*__initcall\s*\(/) {
000d1cc1 4593 WARN("USE_DEVICE_INITCALL",
ae3ccc46 4594 "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
f3db6639 4595 }
6712d858 4596
79404849
ER
4597# check for various ops structs, ensure they are const.
4598 my $struct_ops = qr{acpi_dock_ops|
4599 address_space_operations|
4600 backlight_ops|
4601 block_device_operations|
4602 dentry_operations|
4603 dev_pm_ops|
4604 dma_map_ops|
4605 extent_io_ops|
4606 file_lock_operations|
4607 file_operations|
4608 hv_ops|
4609 ide_dma_ops|
4610 intel_dvo_dev_ops|
4611 item_operations|
4612 iwl_ops|
4613 kgdb_arch|
4614 kgdb_io|
4615 kset_uevent_ops|
4616 lock_manager_operations|
4617 microcode_ops|
4618 mtrr_ops|
4619 neigh_ops|
4620 nlmsvc_binding|
4621 pci_raw_ops|
4622 pipe_buf_operations|
4623 platform_hibernation_ops|
4624 platform_suspend_ops|
4625 proto_ops|
4626 rpc_pipe_ops|
4627 seq_operations|
4628 snd_ac97_build_ops|
4629 soc_pcmcia_socket_ops|
4630 stacktrace_ops|
4631 sysfs_ops|
4632 tty_operations|
4633 usb_mon_operations|
4634 wd_ops}x;
6903ffb2 4635 if ($line !~ /\bconst\b/ &&
79404849 4636 $line =~ /\bstruct\s+($struct_ops)\b/) {
000d1cc1
JP
4637 WARN("CONST_STRUCT",
4638 "struct $1 should normally be const\n" .
6903ffb2 4639 $herecurr);
2b6db5cb 4640 }
773647a0
AW
4641
4642# use of NR_CPUS is usually wrong
4643# ignore definitions of NR_CPUS and usage to define arrays as likely right
4644 if ($line =~ /\bNR_CPUS\b/ &&
c45dcabd
AW
4645 $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
4646 $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a4
AW
4647 $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
4648 $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
4649 $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a0 4650 {
000d1cc1
JP
4651 WARN("NR_CPUS",
4652 "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
773647a0 4653 }
9c9ba34e 4654
52ea8506
JP
4655# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
4656 if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
4657 ERROR("DEFINE_ARCH_HAS",
4658 "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
4659 }
4660
9c9ba34e
AW
4661# check for %L{u,d,i} in strings
4662 my $string;
4663 while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
4664 $string = substr($rawline, $-[1], $+[1] - $-[1]);
2a1bc5d5 4665 $string =~ s/%%/__/g;
9c9ba34e 4666 if ($string =~ /(?<!%)%L[udi]/) {
000d1cc1
JP
4667 WARN("PRINTF_L",
4668 "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
9c9ba34e
AW
4669 last;
4670 }
4671 }
691d77b6
AW
4672
4673# whine mightly about in_atomic
4674 if ($line =~ /\bin_atomic\s*\(/) {
4675 if ($realfile =~ m@^drivers/@) {
000d1cc1
JP
4676 ERROR("IN_ATOMIC",
4677 "do not use in_atomic in drivers\n" . $herecurr);
f4a87736 4678 } elsif ($realfile !~ m@^kernel/@) {
000d1cc1
JP
4679 WARN("IN_ATOMIC",
4680 "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
691d77b6
AW
4681 }
4682 }
1704f47b
PZ
4683
4684# check for lockdep_set_novalidate_class
4685 if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
4686 $line =~ /__lockdep_no_validate__\s*\)/ ) {
4687 if ($realfile !~ m@^kernel/lockdep@ &&
4688 $realfile !~ m@^include/linux/lockdep@ &&
4689 $realfile !~ m@^drivers/base/core@) {
000d1cc1
JP
4690 ERROR("LOCKDEP",
4691 "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
1704f47b
PZ
4692 }
4693 }
88f8831c
DJ
4694
4695 if ($line =~ /debugfs_create_file.*S_IWUGO/ ||
4696 $line =~ /DEVICE_ATTR.*S_IWUGO/ ) {
000d1cc1
JP
4697 WARN("EXPORTED_WORLD_WRITABLE",
4698 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
88f8831c 4699 }
2435880f 4700
515a235e
JP
4701# Mode permission misuses where it seems decimal should be octal
4702# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
4703 if ($^V && $^V ge 5.10.0 &&
4704 $line =~ /$mode_perms_search/) {
4705 foreach my $entry (@mode_permission_funcs) {
4706 my $func = $entry->[0];
4707 my $arg_pos = $entry->[1];
4708
4709 my $skip_args = "";
4710 if ($arg_pos > 1) {
4711 $arg_pos--;
4712 $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
4713 }
4714 my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]";
4715 if ($line =~ /$test/) {
4716 my $val = $1;
4717 $val = $6 if ($skip_args ne "");
4718
4719 if ($val !~ /^0$/ &&
4720 (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
4721 length($val) ne 4)) {
4722 ERROR("NON_OCTAL_PERMISSIONS",
4723 "Use 4 digit octal (0777) not decimal permissions\n" . $herecurr);
4724 }
2435880f
JP
4725 }
4726 }
4727 }
13214adf
AW
4728 }
4729
4730 # If we have no input at all, then there is nothing to report on
4731 # so just keep quiet.
4732 if ($#rawlines == -1) {
4733 exit(0);
0a920b5b
AW
4734 }
4735
8905a67c
AW
4736 # In mailback mode only produce a report in the negative, for
4737 # things that appear to be patches.
4738 if ($mailback && ($clean == 1 || !$is_patch)) {
4739 exit(0);
4740 }
4741
4742 # This is not a patch, and we are are in 'no-patch' mode so
4743 # just keep quiet.
4744 if (!$chk_patch && !$is_patch) {
4745 exit(0);
4746 }
4747
4748 if (!$is_patch) {
000d1cc1
JP
4749 ERROR("NOT_UNIFIED_DIFF",
4750 "Does not appear to be a unified-diff format patch\n");
0a920b5b
AW
4751 }
4752 if ($is_patch && $chk_signoff && $signoff == 0) {
000d1cc1
JP
4753 ERROR("MISSING_SIGN_OFF",
4754 "Missing Signed-off-by: line(s)\n");
0a920b5b
AW
4755 }
4756
8905a67c 4757 print report_dump();
13214adf
AW
4758 if ($summary && !($clean == 1 && $quiet == 1)) {
4759 print "$filename " if ($summary_file);
8905a67c
AW
4760 print "total: $cnt_error errors, $cnt_warn warnings, " .
4761 (($check)? "$cnt_chk checks, " : "") .
4762 "$cnt_lines lines checked\n";
4763 print "\n" if ($quiet == 0);
f0a594c1 4764 }
8905a67c 4765
d2c0a235 4766 if ($quiet == 0) {
d1fe9c09
JP
4767
4768 if ($^V lt 5.10.0) {
4769 print("NOTE: perl $^V is not modern enough to detect all possible issues.\n");
4770 print("An upgrade to at least perl v5.10.0 is suggested.\n\n");
4771 }
4772
d2c0a235
AW
4773 # If there were whitespace errors which cleanpatch can fix
4774 # then suggest that.
4775 if ($rpt_cleaners) {
4776 print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n";
4777 print " scripts/cleanfile\n\n";
b0781216 4778 $rpt_cleaners = 0;
d2c0a235
AW
4779 }
4780 }
4781
91bfe484
JP
4782 hash_show_words(\%use_type, "Used");
4783 hash_show_words(\%ignore_type, "Ignored");
000d1cc1 4784
3705ce5b 4785 if ($clean == 0 && $fix && "@rawlines" ne "@fixed") {
9624b8d6
JP
4786 my $newfile = $filename;
4787 $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
3705ce5b
JP
4788 my $linecount = 0;
4789 my $f;
4790
4791 open($f, '>', $newfile)
4792 or die "$P: Can't open $newfile for write\n";
4793 foreach my $fixed_line (@fixed) {
4794 $linecount++;
4795 if ($file) {
4796 if ($linecount > 3) {
4797 $fixed_line =~ s/^\+//;
4798 print $f $fixed_line. "\n";
4799 }
4800 } else {
4801 print $f $fixed_line . "\n";
4802 }
4803 }
4804 close($f);
4805
4806 if (!$quiet) {
4807 print << "EOM";
4808Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
4809
4810Do _NOT_ trust the results written to this file.
4811Do _NOT_ submit these changes without inspecting them for correctness.
4812
4813This EXPERIMENTAL file is simply a convenience to help rewrite patches.
4814No warranties, expressed or implied...
4815
4816EOM
4817 }
4818 }
4819
0a920b5b 4820 if ($clean == 1 && $quiet == 0) {
c2fdda0d 4821 print "$vname has no obvious style problems and is ready for submission.\n"
0a920b5b
AW
4822 }
4823 if ($clean == 0 && $quiet == 0) {
000d1cc1
JP
4824 print << "EOM";
4825$vname has style problems, please review.
4826
4827If any of these errors are false positives, please report
4828them to the maintainer, see CHECKPATCH in MAINTAINERS.
4829EOM
0a920b5b 4830 }
13214adf 4831
0a920b5b
AW
4832 return $clean;
4833}