]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - scripts/checkpatch.pl
checkpatch: add support to check already applied git commits
[mirror_ubuntu-zesty-kernel.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;
36061e38
JP
10use File::Basename;
11use Cwd 'abs_path';
57230297 12use Term::ANSIColor qw(:constants);
0a920b5b
AW
13
14my $P = $0;
36061e38 15my $D = dirname(abs_path($P));
0a920b5b 16
000d1cc1 17my $V = '0.32';
0a920b5b
AW
18
19use Getopt::Long qw(:config no_auto_abbrev);
20
21my $quiet = 0;
22my $tree = 1;
23my $chk_signoff = 1;
24my $chk_patch = 1;
773647a0 25my $tst_only;
6c72ffaa 26my $emacs = 0;
8905a67c 27my $terse = 0;
34d8815f 28my $showfile = 0;
6c72ffaa 29my $file = 0;
4a593c34 30my $git = 0;
6c72ffaa 31my $check = 0;
2ac73b4f 32my $check_orig = 0;
8905a67c
AW
33my $summary = 1;
34my $mailback = 0;
13214adf 35my $summary_file = 0;
000d1cc1 36my $show_types = 0;
3beb42ec 37my $list_types = 0;
3705ce5b 38my $fix = 0;
9624b8d6 39my $fix_inplace = 0;
6c72ffaa 40my $root;
c2fdda0d 41my %debug;
3445686a 42my %camelcase = ();
91bfe484
JP
43my %use_type = ();
44my @use = ();
45my %ignore_type = ();
000d1cc1 46my @ignore = ();
77f5b10a 47my $help = 0;
000d1cc1 48my $configuration_file = ".checkpatch.conf";
6cd7f386 49my $max_line_length = 80;
d62a201f
DH
50my $ignore_perl_version = 0;
51my $minimum_perl_version = 5.10.0;
56193274 52my $min_conf_desc_length = 4;
66b47b4a 53my $spelling_file = "$D/spelling.txt";
ebfd7d62 54my $codespell = 0;
f1a63678 55my $codespellfile = "/usr/share/codespell/dictionary.txt";
57230297 56my $color = 1;
77f5b10a
HE
57
58sub help {
59 my ($exitcode) = @_;
60
61 print << "EOM";
62Usage: $P [OPTION]... [FILE]...
63Version: $V
64
65Options:
66 -q, --quiet quiet
67 --no-tree run without a kernel tree
68 --no-signoff do not check for 'Signed-off-by' line
69 --patch treat FILE as patchfile (default)
70 --emacs emacs compile window format
71 --terse one line per report
34d8815f 72 --showfile emit diffed file position, not input file position
4a593c34
DC
73 -g, --git treat FILE as a single commit or git revision range
74 single git commit with:
75 <rev>
76 <rev>^
77 <rev>~n
78 multiple git commits with:
79 <rev1>..<rev2>
80 <rev1>...<rev2>
81 <rev>-<count>
82 git merges are ignored
77f5b10a
HE
83 -f, --file treat FILE as regular source file
84 --subjective, --strict enable more subjective tests
3beb42ec 85 --list-types list the possible message types
91bfe484 86 --types TYPE(,TYPE2...) show only these comma separated message types
000d1cc1 87 --ignore TYPE(,TYPE2...) ignore various comma separated message types
3beb42ec 88 --show-types show the specific message type in the output
6cd7f386 89 --max-line-length=n set the maximum line length, if exceeded, warn
56193274 90 --min-conf-desc-length=n set the min description length, if shorter, warn
77f5b10a
HE
91 --root=PATH PATH to the kernel tree root
92 --no-summary suppress the per-file summary
93 --mailback only produce a report in case of warnings/errors
94 --summary-file include the filename in summary
95 --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of
96 'values', 'possible', 'type', and 'attr' (default
97 is all off)
98 --test-only=WORD report only warnings/errors containing WORD
99 literally
3705ce5b
JP
100 --fix EXPERIMENTAL - may create horrible results
101 If correctable single-line errors exist, create
102 "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
103 with potential errors corrected to the preferred
104 checkpatch style
9624b8d6
JP
105 --fix-inplace EXPERIMENTAL - may create horrible results
106 Is the same as --fix, but overwrites the input
107 file. It's your fault if there's no backup or git
d62a201f
DH
108 --ignore-perl-version override checking of perl version. expect
109 runtime errors.
ebfd7d62 110 --codespell Use the codespell dictionary for spelling/typos
f1a63678 111 (default:/usr/share/codespell/dictionary.txt)
ebfd7d62 112 --codespellfile Use this codespell dictionary
57230297 113 --color Use colors when output is STDOUT (default: on)
77f5b10a
HE
114 -h, --help, --version display this help and exit
115
116When FILE is - read standard input.
117EOM
118
119 exit($exitcode);
120}
121
3beb42ec
JP
122sub uniq {
123 my %seen;
124 return grep { !$seen{$_}++ } @_;
125}
126
127sub list_types {
128 my ($exitcode) = @_;
129
130 my $count = 0;
131
132 local $/ = undef;
133
134 open(my $script, '<', abs_path($P)) or
135 die "$P: Can't read '$P' $!\n";
136
137 my $text = <$script>;
138 close($script);
139
140 my @types = ();
141 for ($text =~ /\b(?:(?:CHK|WARN|ERROR)\s*\(\s*"([^"]+)")/g) {
142 push (@types, $_);
143 }
144 @types = sort(uniq(@types));
145 print("#\tMessage type\n\n");
146 foreach my $type (@types) {
147 print(++$count . "\t" . $type . "\n");
148 }
149
150 exit($exitcode);
151}
152
000d1cc1
JP
153my $conf = which_conf($configuration_file);
154if (-f $conf) {
155 my @conf_args;
156 open(my $conffile, '<', "$conf")
157 or warn "$P: Can't find a readable $configuration_file file $!\n";
158
159 while (<$conffile>) {
160 my $line = $_;
161
162 $line =~ s/\s*\n?$//g;
163 $line =~ s/^\s*//g;
164 $line =~ s/\s+/ /g;
165
166 next if ($line =~ m/^\s*#/);
167 next if ($line =~ m/^\s*$/);
168
169 my @words = split(" ", $line);
170 foreach my $word (@words) {
171 last if ($word =~ m/^#/);
172 push (@conf_args, $word);
173 }
174 }
175 close($conffile);
176 unshift(@ARGV, @conf_args) if @conf_args;
177}
178
0a920b5b 179GetOptions(
6c72ffaa 180 'q|quiet+' => \$quiet,
0a920b5b
AW
181 'tree!' => \$tree,
182 'signoff!' => \$chk_signoff,
183 'patch!' => \$chk_patch,
6c72ffaa 184 'emacs!' => \$emacs,
8905a67c 185 'terse!' => \$terse,
34d8815f 186 'showfile!' => \$showfile,
77f5b10a 187 'f|file!' => \$file,
4a593c34 188 'g|git!' => \$git,
6c72ffaa
AW
189 'subjective!' => \$check,
190 'strict!' => \$check,
000d1cc1 191 'ignore=s' => \@ignore,
91bfe484 192 'types=s' => \@use,
000d1cc1 193 'show-types!' => \$show_types,
3beb42ec 194 'list-types!' => \$list_types,
6cd7f386 195 'max-line-length=i' => \$max_line_length,
56193274 196 'min-conf-desc-length=i' => \$min_conf_desc_length,
6c72ffaa 197 'root=s' => \$root,
8905a67c
AW
198 'summary!' => \$summary,
199 'mailback!' => \$mailback,
13214adf 200 'summary-file!' => \$summary_file,
3705ce5b 201 'fix!' => \$fix,
9624b8d6 202 'fix-inplace!' => \$fix_inplace,
d62a201f 203 'ignore-perl-version!' => \$ignore_perl_version,
c2fdda0d 204 'debug=s' => \%debug,
773647a0 205 'test-only=s' => \$tst_only,
ebfd7d62
JP
206 'codespell!' => \$codespell,
207 'codespellfile=s' => \$codespellfile,
57230297 208 'color!' => \$color,
77f5b10a
HE
209 'h|help' => \$help,
210 'version' => \$help
211) or help(1);
212
213help(0) if ($help);
0a920b5b 214
3beb42ec
JP
215list_types(0) if ($list_types);
216
9624b8d6 217$fix = 1 if ($fix_inplace);
2ac73b4f 218$check_orig = $check;
9624b8d6 219
0a920b5b
AW
220my $exit = 0;
221
d62a201f
DH
222if ($^V && $^V lt $minimum_perl_version) {
223 printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
224 if (!$ignore_perl_version) {
225 exit(1);
226 }
227}
228
0a920b5b 229if ($#ARGV < 0) {
77f5b10a 230 print "$P: no input files\n";
0a920b5b
AW
231 exit(1);
232}
233
91bfe484
JP
234sub hash_save_array_words {
235 my ($hashRef, $arrayRef) = @_;
236
237 my @array = split(/,/, join(',', @$arrayRef));
238 foreach my $word (@array) {
239 $word =~ s/\s*\n?$//g;
240 $word =~ s/^\s*//g;
241 $word =~ s/\s+/ /g;
242 $word =~ tr/[a-z]/[A-Z]/;
243
244 next if ($word =~ m/^\s*#/);
245 next if ($word =~ m/^\s*$/);
246
247 $hashRef->{$word}++;
248 }
249}
000d1cc1 250
91bfe484
JP
251sub hash_show_words {
252 my ($hashRef, $prefix) = @_;
000d1cc1 253
3c816e49 254 if (keys %$hashRef) {
d8469f16 255 print "\nNOTE: $prefix message types:";
58cb3cf6 256 foreach my $word (sort keys %$hashRef) {
91bfe484
JP
257 print " $word";
258 }
d8469f16 259 print "\n";
91bfe484 260 }
000d1cc1
JP
261}
262
91bfe484
JP
263hash_save_array_words(\%ignore_type, \@ignore);
264hash_save_array_words(\%use_type, \@use);
265
c2fdda0d
AW
266my $dbg_values = 0;
267my $dbg_possible = 0;
7429c690 268my $dbg_type = 0;
a1ef277e 269my $dbg_attr = 0;
c2fdda0d 270for my $key (keys %debug) {
21caa13c
AW
271 ## no critic
272 eval "\${dbg_$key} = '$debug{$key}';";
273 die "$@" if ($@);
c2fdda0d
AW
274}
275
d2c0a235
AW
276my $rpt_cleaners = 0;
277
8905a67c
AW
278if ($terse) {
279 $emacs = 1;
280 $quiet++;
281}
282
6c72ffaa
AW
283if ($tree) {
284 if (defined $root) {
285 if (!top_of_kernel_tree($root)) {
286 die "$P: $root: --root does not point at a valid tree\n";
287 }
288 } else {
289 if (top_of_kernel_tree('.')) {
290 $root = '.';
291 } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
292 top_of_kernel_tree($1)) {
293 $root = $1;
294 }
295 }
296
297 if (!defined $root) {
298 print "Must be run from the top-level dir. of a kernel tree\n";
299 exit(2);
300 }
0a920b5b
AW
301}
302
6c72ffaa
AW
303my $emitted_corrupt = 0;
304
2ceb532b
AW
305our $Ident = qr{
306 [A-Za-z_][A-Za-z\d_]*
307 (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
308 }x;
6c72ffaa
AW
309our $Storage = qr{extern|static|asmlinkage};
310our $Sparse = qr{
311 __user|
312 __kernel|
313 __force|
314 __iomem|
54507b51 315 __pmem|
6c72ffaa
AW
316 __must_check|
317 __init_refok|
417495ed 318 __kprobes|
165e72a6 319 __ref|
ad315455
BF
320 __rcu|
321 __private
6c72ffaa 322 }x;
e970b884
JP
323our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
324our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
325our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
326our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
327our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
8716de38 328
52131292
WS
329# Notes to $Attribute:
330# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
6c72ffaa
AW
331our $Attribute = qr{
332 const|
03f1df7d
JP
333 __percpu|
334 __nocast|
335 __safe|
336 __bitwise__|
337 __packed__|
338 __packed2__|
339 __naked|
340 __maybe_unused|
341 __always_unused|
342 __noreturn|
343 __used|
344 __cold|
e23ef1f3 345 __pure|
03f1df7d
JP
346 __noclone|
347 __deprecated|
6c72ffaa
AW
348 __read_mostly|
349 __kprobes|
8716de38 350 $InitAttribute|
24e1d81a
AW
351 ____cacheline_aligned|
352 ____cacheline_aligned_in_smp|
5fe3af11
AW
353 ____cacheline_internodealigned_in_smp|
354 __weak
6c72ffaa 355 }x;
c45dcabd 356our $Modifier;
91cb5195 357our $Inline = qr{inline|__always_inline|noinline|__inline|__inline__};
6c72ffaa
AW
358our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
359our $Lval = qr{$Ident(?:$Member)*};
360
95e2c602
JP
361our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u};
362our $Binary = qr{(?i)0b[01]+$Int_type?};
363our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?};
364our $Int = qr{[0-9]+$Int_type?};
2435880f 365our $Octal = qr{0[0-7]+$Int_type?};
c0a5c898 366our $String = qr{"[X\t]*"};
326b1ffc
JP
367our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
368our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
369our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
74349bcc 370our $Float = qr{$Float_hex|$Float_dec|$Float_int};
2435880f 371our $Constant = qr{$Float|$Binary|$Octal|$Hex|$Int};
326b1ffc 372our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
447432f3 373our $Compare = qr{<=|>=|==|!=|<|(?<!-)>};
23f780c9 374our $Arithmetic = qr{\+|-|\*|\/|%};
6c72ffaa
AW
375our $Operators = qr{
376 <=|>=|==|!=|
377 =>|->|<<|>>|<|>|!|~|
23f780c9 378 &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
6c72ffaa
AW
379 }x;
380
91cb5195
JP
381our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
382
ab7e23f3 383our $BasicType;
8905a67c 384our $NonptrType;
1813087d 385our $NonptrTypeMisordered;
8716de38 386our $NonptrTypeWithAttr;
8905a67c 387our $Type;
1813087d 388our $TypeMisordered;
8905a67c 389our $Declare;
1813087d 390our $DeclareMisordered;
8905a67c 391
15662b3e
JP
392our $NON_ASCII_UTF8 = qr{
393 [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
171ae1a4
AW
394 | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
395 | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
396 | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
397 | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
398 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
399 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
400}x;
401
15662b3e
JP
402our $UTF8 = qr{
403 [\x09\x0A\x0D\x20-\x7E] # ASCII
404 | $NON_ASCII_UTF8
405}x;
406
e6176fa4 407our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t};
021158b4
JP
408our $typeOtherOSTypedefs = qr{(?x:
409 u_(?:char|short|int|long) | # bsd
410 u(?:nchar|short|int|long) # sysv
411)};
e6176fa4 412our $typeKernelTypedefs = qr{(?x:
fb9e9096 413 (?:__)?(?:u|s|be|le)(?:8|16|32|64)|
8ed22cad
AW
414 atomic_t
415)};
e6176fa4
JP
416our $typeTypedefs = qr{(?x:
417 $typeC99Typedefs\b|
418 $typeOtherOSTypedefs\b|
419 $typeKernelTypedefs\b
420)};
8ed22cad 421
6d32f7a3
JP
422our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
423
691e669b 424our $logFunctions = qr{(?x:
6e60c02e 425 printk(?:_ratelimited|_once|)|
7d0b6594 426 (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
6e60c02e 427 WARN(?:_RATELIMIT|_ONCE|)|
b0531722 428 panic|
06668727
JP
429 MODULE_[A-Z_]+|
430 seq_vprintf|seq_printf|seq_puts
691e669b
JP
431)};
432
20112475
JP
433our $signature_tags = qr{(?xi:
434 Signed-off-by:|
435 Acked-by:|
436 Tested-by:|
437 Reviewed-by:|
438 Reported-by:|
8543ae12 439 Suggested-by:|
20112475
JP
440 To:|
441 Cc:
442)};
443
1813087d
JP
444our @typeListMisordered = (
445 qr{char\s+(?:un)?signed},
446 qr{int\s+(?:(?:un)?signed\s+)?short\s},
447 qr{int\s+short(?:\s+(?:un)?signed)},
448 qr{short\s+int(?:\s+(?:un)?signed)},
449 qr{(?:un)?signed\s+int\s+short},
450 qr{short\s+(?:un)?signed},
451 qr{long\s+int\s+(?:un)?signed},
452 qr{int\s+long\s+(?:un)?signed},
453 qr{long\s+(?:un)?signed\s+int},
454 qr{int\s+(?:un)?signed\s+long},
455 qr{int\s+(?:un)?signed},
456 qr{int\s+long\s+long\s+(?:un)?signed},
457 qr{long\s+long\s+int\s+(?:un)?signed},
458 qr{long\s+long\s+(?:un)?signed\s+int},
459 qr{long\s+long\s+(?:un)?signed},
460 qr{long\s+(?:un)?signed},
461);
462
8905a67c
AW
463our @typeList = (
464 qr{void},
0c773d9d
JP
465 qr{(?:(?:un)?signed\s+)?char},
466 qr{(?:(?:un)?signed\s+)?short\s+int},
467 qr{(?:(?:un)?signed\s+)?short},
468 qr{(?:(?:un)?signed\s+)?int},
469 qr{(?:(?:un)?signed\s+)?long\s+int},
470 qr{(?:(?:un)?signed\s+)?long\s+long\s+int},
471 qr{(?:(?:un)?signed\s+)?long\s+long},
472 qr{(?:(?:un)?signed\s+)?long},
473 qr{(?:un)?signed},
8905a67c
AW
474 qr{float},
475 qr{double},
476 qr{bool},
8905a67c
AW
477 qr{struct\s+$Ident},
478 qr{union\s+$Ident},
479 qr{enum\s+$Ident},
480 qr{${Ident}_t},
481 qr{${Ident}_handler},
482 qr{${Ident}_handler_fn},
1813087d 483 @typeListMisordered,
8905a67c 484);
938224b5
JP
485
486our $C90_int_types = qr{(?x:
487 long\s+long\s+int\s+(?:un)?signed|
488 long\s+long\s+(?:un)?signed\s+int|
489 long\s+long\s+(?:un)?signed|
490 (?:(?:un)?signed\s+)?long\s+long\s+int|
491 (?:(?:un)?signed\s+)?long\s+long|
492 int\s+long\s+long\s+(?:un)?signed|
493 int\s+(?:(?:un)?signed\s+)?long\s+long|
494
495 long\s+int\s+(?:un)?signed|
496 long\s+(?:un)?signed\s+int|
497 long\s+(?:un)?signed|
498 (?:(?:un)?signed\s+)?long\s+int|
499 (?:(?:un)?signed\s+)?long|
500 int\s+long\s+(?:un)?signed|
501 int\s+(?:(?:un)?signed\s+)?long|
502
503 int\s+(?:un)?signed|
504 (?:(?:un)?signed\s+)?int
505)};
506
485ff23e 507our @typeListFile = ();
8716de38
JP
508our @typeListWithAttr = (
509 @typeList,
510 qr{struct\s+$InitAttribute\s+$Ident},
511 qr{union\s+$InitAttribute\s+$Ident},
512);
513
c45dcabd
AW
514our @modifierList = (
515 qr{fastcall},
516);
485ff23e 517our @modifierListFile = ();
8905a67c 518
2435880f
JP
519our @mode_permission_funcs = (
520 ["module_param", 3],
521 ["module_param_(?:array|named|string)", 4],
522 ["module_param_array_named", 5],
523 ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
524 ["proc_create(?:_data|)", 2],
525 ["(?:CLASS|DEVICE|SENSOR)_ATTR", 2],
526);
527
515a235e
JP
528#Create a search pattern for all these functions to speed up a loop below
529our $mode_perms_search = "";
530foreach my $entry (@mode_permission_funcs) {
531 $mode_perms_search .= '|' if ($mode_perms_search ne "");
532 $mode_perms_search .= $entry->[0];
533}
534
b392c64f
JP
535our $mode_perms_world_writable = qr{
536 S_IWUGO |
537 S_IWOTH |
538 S_IRWXUGO |
539 S_IALLUGO |
540 0[0-7][0-7][2367]
541}x;
542
7840a94c
WS
543our $allowed_asm_includes = qr{(?x:
544 irq|
cdcee686
SR
545 memory|
546 time|
547 reboot
7840a94c
WS
548)};
549# memory.h: ARM has a custom one
550
66b47b4a
KC
551# Load common spelling mistakes and build regular expression list.
552my $misspellings;
66b47b4a 553my %spelling_fix;
66b47b4a 554
36061e38 555if (open(my $spelling, '<', $spelling_file)) {
36061e38
JP
556 while (<$spelling>) {
557 my $line = $_;
66b47b4a 558
36061e38
JP
559 $line =~ s/\s*\n?$//g;
560 $line =~ s/^\s*//g;
66b47b4a 561
36061e38
JP
562 next if ($line =~ m/^\s*#/);
563 next if ($line =~ m/^\s*$/);
564
565 my ($suspect, $fix) = split(/\|\|/, $line);
66b47b4a 566
36061e38
JP
567 $spelling_fix{$suspect} = $fix;
568 }
569 close($spelling);
36061e38
JP
570} else {
571 warn "No typos will be found - file '$spelling_file': $!\n";
66b47b4a 572}
66b47b4a 573
ebfd7d62
JP
574if ($codespell) {
575 if (open(my $spelling, '<', $codespellfile)) {
576 while (<$spelling>) {
577 my $line = $_;
578
579 $line =~ s/\s*\n?$//g;
580 $line =~ s/^\s*//g;
581
582 next if ($line =~ m/^\s*#/);
583 next if ($line =~ m/^\s*$/);
584 next if ($line =~ m/, disabled/i);
585
586 $line =~ s/,.*$//;
587
588 my ($suspect, $fix) = split(/->/, $line);
589
590 $spelling_fix{$suspect} = $fix;
591 }
592 close($spelling);
593 } else {
594 warn "No codespell typos will be found - file '$codespellfile': $!\n";
595 }
596}
597
598$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
599
8905a67c 600sub build_types {
485ff23e
AD
601 my $mods = "(?x: \n" . join("|\n ", (@modifierList, @modifierListFile)) . "\n)";
602 my $all = "(?x: \n" . join("|\n ", (@typeList, @typeListFile)) . "\n)";
1813087d 603 my $Misordered = "(?x: \n" . join("|\n ", @typeListMisordered) . "\n)";
8716de38 604 my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)";
c8cb2ca3 605 $Modifier = qr{(?:$Attribute|$Sparse|$mods)};
ab7e23f3 606 $BasicType = qr{
ab7e23f3
JP
607 (?:$typeTypedefs\b)|
608 (?:${all}\b)
609 }x;
8905a67c 610 $NonptrType = qr{
d2172eb5 611 (?:$Modifier\s+|const\s+)*
cf655043 612 (?:
6b48db24 613 (?:typeof|__typeof__)\s*\([^\)]*\)|
8ed22cad 614 (?:$typeTypedefs\b)|
c45dcabd 615 (?:${all}\b)
cf655043 616 )
c8cb2ca3 617 (?:\s+$Modifier|\s+const)*
8905a67c 618 }x;
1813087d
JP
619 $NonptrTypeMisordered = qr{
620 (?:$Modifier\s+|const\s+)*
621 (?:
622 (?:${Misordered}\b)
623 )
624 (?:\s+$Modifier|\s+const)*
625 }x;
8716de38
JP
626 $NonptrTypeWithAttr = qr{
627 (?:$Modifier\s+|const\s+)*
628 (?:
629 (?:typeof|__typeof__)\s*\([^\)]*\)|
630 (?:$typeTypedefs\b)|
631 (?:${allWithAttr}\b)
632 )
633 (?:\s+$Modifier|\s+const)*
634 }x;
8905a67c 635 $Type = qr{
c45dcabd 636 $NonptrType
1574a29f 637 (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
c8cb2ca3 638 (?:\s+$Inline|\s+$Modifier)*
8905a67c 639 }x;
1813087d
JP
640 $TypeMisordered = qr{
641 $NonptrTypeMisordered
642 (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
643 (?:\s+$Inline|\s+$Modifier)*
644 }x;
91cb5195 645 $Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
1813087d 646 $DeclareMisordered = qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
8905a67c
AW
647}
648build_types();
6c72ffaa 649
7d2367af 650our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
d1fe9c09
JP
651
652# Using $balanced_parens, $LvalOrFunc, or $FuncArg
653# requires at least perl version v5.10.0
654# Any use must be runtime checked with $^V
655
656our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
2435880f 657our $LvalOrFunc = qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
c0a5c898 658our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
7d2367af 659
f8422308 660our $declaration_macros = qr{(?x:
3e838b6c 661 (?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
f8422308
JP
662 (?:$Storage\s+)?LIST_HEAD\s*\(|
663 (?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(
664)};
665
7d2367af
JP
666sub deparenthesize {
667 my ($string) = @_;
668 return "" if (!defined($string));
5b9553ab
JP
669
670 while ($string =~ /^\s*\(.*\)\s*$/) {
671 $string =~ s@^\s*\(\s*@@;
672 $string =~ s@\s*\)\s*$@@;
673 }
674
7d2367af 675 $string =~ s@\s+@ @g;
5b9553ab 676
7d2367af
JP
677 return $string;
678}
679
3445686a
JP
680sub seed_camelcase_file {
681 my ($file) = @_;
682
683 return if (!(-f $file));
684
685 local $/;
686
687 open(my $include_file, '<', "$file")
688 or warn "$P: Can't read '$file' $!\n";
689 my $text = <$include_file>;
690 close($include_file);
691
692 my @lines = split('\n', $text);
693
694 foreach my $line (@lines) {
695 next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
696 if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
697 $camelcase{$1} = 1;
11ea516a
JP
698 } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
699 $camelcase{$1} = 1;
700 } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
3445686a
JP
701 $camelcase{$1} = 1;
702 }
703 }
704}
705
706my $camelcase_seeded = 0;
707sub seed_camelcase_includes {
708 return if ($camelcase_seeded);
709
710 my $files;
c707a81d
JP
711 my $camelcase_cache = "";
712 my @include_files = ();
713
714 $camelcase_seeded = 1;
351b2a1f 715
3645e328 716 if (-e ".git") {
351b2a1f
JP
717 my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
718 chomp $git_last_include_commit;
c707a81d 719 $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
3445686a 720 } else {
c707a81d 721 my $last_mod_date = 0;
3445686a 722 $files = `find $root/include -name "*.h"`;
c707a81d
JP
723 @include_files = split('\n', $files);
724 foreach my $file (@include_files) {
725 my $date = POSIX::strftime("%Y%m%d%H%M",
726 localtime((stat $file)[9]));
727 $last_mod_date = $date if ($last_mod_date < $date);
728 }
729 $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
730 }
731
732 if ($camelcase_cache ne "" && -f $camelcase_cache) {
733 open(my $camelcase_file, '<', "$camelcase_cache")
734 or warn "$P: Can't read '$camelcase_cache' $!\n";
735 while (<$camelcase_file>) {
736 chomp;
737 $camelcase{$_} = 1;
738 }
739 close($camelcase_file);
740
741 return;
3445686a 742 }
c707a81d 743
3645e328 744 if (-e ".git") {
c707a81d
JP
745 $files = `git ls-files "include/*.h"`;
746 @include_files = split('\n', $files);
747 }
748
3445686a
JP
749 foreach my $file (@include_files) {
750 seed_camelcase_file($file);
751 }
351b2a1f 752
c707a81d 753 if ($camelcase_cache ne "") {
351b2a1f 754 unlink glob ".checkpatch-camelcase.*";
c707a81d
JP
755 open(my $camelcase_file, '>', "$camelcase_cache")
756 or warn "$P: Can't write '$camelcase_cache' $!\n";
351b2a1f
JP
757 foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
758 print $camelcase_file ("$_\n");
759 }
760 close($camelcase_file);
761 }
3445686a
JP
762}
763
d311cd44
JP
764sub git_commit_info {
765 my ($commit, $id, $desc) = @_;
766
767 return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
768
769 my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
770 $output =~ s/^\s*//gm;
771 my @lines = split("\n", $output);
772
0d7835fc
JP
773 return ($id, $desc) if ($#lines < 0);
774
d311cd44
JP
775 if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
776# Maybe one day convert this block of bash into something that returns
777# all matching commit ids, but it's very slow...
778#
779# echo "checking commits $1..."
780# git rev-list --remotes | grep -i "^$1" |
781# while read line ; do
782# git log --format='%H %s' -1 $line |
783# echo "commit $(cut -c 1-12,41-)"
784# done
785 } elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
786 } else {
787 $id = substr($lines[0], 0, 12);
788 $desc = substr($lines[0], 41);
789 }
790
791 return ($id, $desc);
792}
793
6c72ffaa
AW
794$chk_signoff = 0 if ($file);
795
00df344f 796my @rawlines = ();
c2fdda0d 797my @lines = ();
3705ce5b 798my @fixed = ();
d752fcc8
JP
799my @fixed_inserted = ();
800my @fixed_deleted = ();
194f66fc
JP
801my $fixlinenr = -1;
802
4a593c34
DC
803# If input is git commits, extract all commits from the commit expressions.
804# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
805die "$P: No git repository found\n" if ($git && !-e ".git");
806
807if ($git) {
808 my @commits = ();
809 for my $commit_expr (@ARGV) {
810 my $git_range;
811 if ($commit_expr =~ m/-/) {
812 my @tmp = split(/-/, $commit_expr);
813 die "$P: incorrect git commits expression $commit_expr$!\n"
814 if (@tmp != 2);
815 $git_range = "-$tmp[1] $tmp[0]";
816 } elsif ($commit_expr =~ m/\.\./) {
817 $git_range = "$commit_expr";
818 }
819 if (defined $git_range) {
820 my $lines = `git log --no-merges --pretty=format:'%H' $git_range`;
821 foreach my $line (split(/\n/, $lines)) {
822 unshift(@commits, $line);
823 }
824 } else {
825 unshift(@commits, $commit_expr);
826 }
827 }
828 die "$P: no git commits after extraction!\n" if (@commits == 0);
829 @ARGV = @commits;
830}
831
c2fdda0d 832my $vname;
6c72ffaa 833for my $filename (@ARGV) {
21caa13c 834 my $FILE;
4a593c34
DC
835 if ($git) {
836 open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
837 die "$P: $filename: git format-patch failed - $!\n";
838 } elsif ($file) {
21caa13c 839 open($FILE, '-|', "diff -u /dev/null $filename") ||
6c72ffaa 840 die "$P: $filename: diff failed - $!\n";
21caa13c
AW
841 } elsif ($filename eq '-') {
842 open($FILE, '<&STDIN');
6c72ffaa 843 } else {
21caa13c 844 open($FILE, '<', "$filename") ||
6c72ffaa 845 die "$P: $filename: open failed - $!\n";
0a920b5b 846 }
c2fdda0d
AW
847 if ($filename eq '-') {
848 $vname = 'Your patch';
4a593c34
DC
849 } elsif ($git) {
850 $vname = "Commit " . substr($filename, 0, 12) . `git log -1 --pretty=format:' ("%s")' $filename`;
c2fdda0d
AW
851 } else {
852 $vname = $filename;
853 }
21caa13c 854 while (<$FILE>) {
6c72ffaa
AW
855 chomp;
856 push(@rawlines, $_);
857 }
21caa13c 858 close($FILE);
d8469f16
JP
859
860 if ($#ARGV > 0 && $quiet == 0) {
861 print '-' x length($vname) . "\n";
862 print "$vname\n";
863 print '-' x length($vname) . "\n";
864 }
865
c2fdda0d 866 if (!process($filename)) {
6c72ffaa
AW
867 $exit = 1;
868 }
869 @rawlines = ();
13214adf 870 @lines = ();
3705ce5b 871 @fixed = ();
d752fcc8
JP
872 @fixed_inserted = ();
873 @fixed_deleted = ();
194f66fc 874 $fixlinenr = -1;
485ff23e
AD
875 @modifierListFile = ();
876 @typeListFile = ();
877 build_types();
0a920b5b
AW
878}
879
d8469f16 880if (!$quiet) {
3c816e49
JP
881 hash_show_words(\%use_type, "Used");
882 hash_show_words(\%ignore_type, "Ignored");
883
d8469f16
JP
884 if ($^V lt 5.10.0) {
885 print << "EOM"
886
887NOTE: perl $^V is not modern enough to detect all possible issues.
888 An upgrade to at least perl v5.10.0 is suggested.
889EOM
890 }
891 if ($exit) {
892 print << "EOM"
893
894NOTE: If any of the errors are false positives, please report
895 them to the maintainer, see CHECKPATCH in MAINTAINERS.
896EOM
897 }
898}
899
0a920b5b
AW
900exit($exit);
901
902sub top_of_kernel_tree {
6c72ffaa
AW
903 my ($root) = @_;
904
905 my @tree_check = (
906 "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
907 "README", "Documentation", "arch", "include", "drivers",
908 "fs", "init", "ipc", "kernel", "lib", "scripts",
909 );
910
911 foreach my $check (@tree_check) {
912 if (! -e $root . '/' . $check) {
913 return 0;
914 }
0a920b5b 915 }
6c72ffaa 916 return 1;
8f26b837 917}
0a920b5b 918
20112475
JP
919sub parse_email {
920 my ($formatted_email) = @_;
921
922 my $name = "";
923 my $address = "";
924 my $comment = "";
925
926 if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
927 $name = $1;
928 $address = $2;
929 $comment = $3 if defined $3;
930 } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
931 $address = $1;
932 $comment = $2 if defined $2;
933 } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
934 $address = $1;
935 $comment = $2 if defined $2;
936 $formatted_email =~ s/$address.*$//;
937 $name = $formatted_email;
3705ce5b 938 $name = trim($name);
20112475
JP
939 $name =~ s/^\"|\"$//g;
940 # If there's a name left after stripping spaces and
941 # leading quotes, and the address doesn't have both
942 # leading and trailing angle brackets, the address
943 # is invalid. ie:
944 # "joe smith joe@smith.com" bad
945 # "joe smith <joe@smith.com" bad
946 if ($name ne "" && $address !~ /^<[^>]+>$/) {
947 $name = "";
948 $address = "";
949 $comment = "";
950 }
951 }
952
3705ce5b 953 $name = trim($name);
20112475 954 $name =~ s/^\"|\"$//g;
3705ce5b 955 $address = trim($address);
20112475
JP
956 $address =~ s/^\<|\>$//g;
957
958 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
959 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
960 $name = "\"$name\"";
961 }
962
963 return ($name, $address, $comment);
964}
965
966sub format_email {
967 my ($name, $address) = @_;
968
969 my $formatted_email;
970
3705ce5b 971 $name = trim($name);
20112475 972 $name =~ s/^\"|\"$//g;
3705ce5b 973 $address = trim($address);
20112475
JP
974
975 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
976 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
977 $name = "\"$name\"";
978 }
979
980 if ("$name" eq "") {
981 $formatted_email = "$address";
982 } else {
983 $formatted_email = "$name <$address>";
984 }
985
986 return $formatted_email;
987}
988
d311cd44 989sub which {
bd474ca0 990 my ($bin) = @_;
d311cd44 991
bd474ca0
JP
992 foreach my $path (split(/:/, $ENV{PATH})) {
993 if (-e "$path/$bin") {
994 return "$path/$bin";
995 }
d311cd44 996 }
d311cd44 997
bd474ca0 998 return "";
d311cd44
JP
999}
1000
000d1cc1
JP
1001sub which_conf {
1002 my ($conf) = @_;
1003
1004 foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
1005 if (-e "$path/$conf") {
1006 return "$path/$conf";
1007 }
1008 }
1009
1010 return "";
1011}
1012
0a920b5b
AW
1013sub expand_tabs {
1014 my ($str) = @_;
1015
1016 my $res = '';
1017 my $n = 0;
1018 for my $c (split(//, $str)) {
1019 if ($c eq "\t") {
1020 $res .= ' ';
1021 $n++;
1022 for (; ($n % 8) != 0; $n++) {
1023 $res .= ' ';
1024 }
1025 next;
1026 }
1027 $res .= $c;
1028 $n++;
1029 }
1030
1031 return $res;
1032}
6c72ffaa 1033sub copy_spacing {
773647a0 1034 (my $res = shift) =~ tr/\t/ /c;
6c72ffaa
AW
1035 return $res;
1036}
0a920b5b 1037
4a0df2ef
AW
1038sub line_stats {
1039 my ($line) = @_;
1040
1041 # Drop the diff line leader and expand tabs
1042 $line =~ s/^.//;
1043 $line = expand_tabs($line);
1044
1045 # Pick the indent from the front of the line.
1046 my ($white) = ($line =~ /^(\s*)/);
1047
1048 return (length($line), length($white));
1049}
1050
773647a0
AW
1051my $sanitise_quote = '';
1052
1053sub sanitise_line_reset {
1054 my ($in_comment) = @_;
1055
1056 if ($in_comment) {
1057 $sanitise_quote = '*/';
1058 } else {
1059 $sanitise_quote = '';
1060 }
1061}
00df344f
AW
1062sub sanitise_line {
1063 my ($line) = @_;
1064
1065 my $res = '';
1066 my $l = '';
1067
c2fdda0d 1068 my $qlen = 0;
773647a0
AW
1069 my $off = 0;
1070 my $c;
00df344f 1071
773647a0
AW
1072 # Always copy over the diff marker.
1073 $res = substr($line, 0, 1);
1074
1075 for ($off = 1; $off < length($line); $off++) {
1076 $c = substr($line, $off, 1);
1077
1078 # Comments we are wacking completly including the begin
1079 # and end, all to $;.
1080 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
1081 $sanitise_quote = '*/';
1082
1083 substr($res, $off, 2, "$;$;");
1084 $off++;
1085 next;
00df344f 1086 }
81bc0e02 1087 if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
773647a0
AW
1088 $sanitise_quote = '';
1089 substr($res, $off, 2, "$;$;");
1090 $off++;
1091 next;
c2fdda0d 1092 }
113f04a8
DW
1093 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
1094 $sanitise_quote = '//';
1095
1096 substr($res, $off, 2, $sanitise_quote);
1097 $off++;
1098 next;
1099 }
773647a0
AW
1100
1101 # A \ in a string means ignore the next character.
1102 if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
1103 $c eq "\\") {
1104 substr($res, $off, 2, 'XX');
1105 $off++;
1106 next;
00df344f 1107 }
773647a0
AW
1108 # Regular quotes.
1109 if ($c eq "'" || $c eq '"') {
1110 if ($sanitise_quote eq '') {
1111 $sanitise_quote = $c;
00df344f 1112
773647a0
AW
1113 substr($res, $off, 1, $c);
1114 next;
1115 } elsif ($sanitise_quote eq $c) {
1116 $sanitise_quote = '';
1117 }
1118 }
00df344f 1119
fae17dae 1120 #print "c<$c> SQ<$sanitise_quote>\n";
773647a0
AW
1121 if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
1122 substr($res, $off, 1, $;);
113f04a8
DW
1123 } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
1124 substr($res, $off, 1, $;);
773647a0
AW
1125 } elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
1126 substr($res, $off, 1, 'X');
1127 } else {
1128 substr($res, $off, 1, $c);
1129 }
c2fdda0d
AW
1130 }
1131
113f04a8
DW
1132 if ($sanitise_quote eq '//') {
1133 $sanitise_quote = '';
1134 }
1135
c2fdda0d 1136 # The pathname on a #include may be surrounded by '<' and '>'.
c45dcabd 1137 if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
c2fdda0d
AW
1138 my $clean = 'X' x length($1);
1139 $res =~ s@\<.*\>@<$clean>@;
1140
1141 # The whole of a #error is a string.
c45dcabd 1142 } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
c2fdda0d 1143 my $clean = 'X' x length($1);
c45dcabd 1144 $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
c2fdda0d
AW
1145 }
1146
00df344f
AW
1147 return $res;
1148}
1149
a6962d72
JP
1150sub get_quoted_string {
1151 my ($line, $rawline) = @_;
1152
33acb54a 1153 return "" if ($line !~ m/($String)/g);
a6962d72
JP
1154 return substr($rawline, $-[0], $+[0] - $-[0]);
1155}
1156
8905a67c
AW
1157sub ctx_statement_block {
1158 my ($linenr, $remain, $off) = @_;
1159 my $line = $linenr - 1;
1160 my $blk = '';
1161 my $soff = $off;
1162 my $coff = $off - 1;
773647a0 1163 my $coff_set = 0;
8905a67c 1164
13214adf
AW
1165 my $loff = 0;
1166
8905a67c
AW
1167 my $type = '';
1168 my $level = 0;
a2750645 1169 my @stack = ();
cf655043 1170 my $p;
8905a67c
AW
1171 my $c;
1172 my $len = 0;
13214adf
AW
1173
1174 my $remainder;
8905a67c 1175 while (1) {
a2750645
AW
1176 @stack = (['', 0]) if ($#stack == -1);
1177
773647a0 1178 #warn "CSB: blk<$blk> remain<$remain>\n";
8905a67c
AW
1179 # If we are about to drop off the end, pull in more
1180 # context.
1181 if ($off >= $len) {
1182 for (; $remain > 0; $line++) {
dea33496 1183 last if (!defined $lines[$line]);
c2fdda0d 1184 next if ($lines[$line] =~ /^-/);
8905a67c 1185 $remain--;
13214adf 1186 $loff = $len;
c2fdda0d 1187 $blk .= $lines[$line] . "\n";
8905a67c
AW
1188 $len = length($blk);
1189 $line++;
1190 last;
1191 }
1192 # Bail if there is no further context.
1193 #warn "CSB: blk<$blk> off<$off> len<$len>\n";
13214adf 1194 if ($off >= $len) {
8905a67c
AW
1195 last;
1196 }
f74bd194
AW
1197 if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
1198 $level++;
1199 $type = '#';
1200 }
8905a67c 1201 }
cf655043 1202 $p = $c;
8905a67c 1203 $c = substr($blk, $off, 1);
13214adf 1204 $remainder = substr($blk, $off);
8905a67c 1205
773647a0 1206 #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
4635f4fb
AW
1207
1208 # Handle nested #if/#else.
1209 if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
1210 push(@stack, [ $type, $level ]);
1211 } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
1212 ($type, $level) = @{$stack[$#stack - 1]};
1213 } elsif ($remainder =~ /^#\s*endif\b/) {
1214 ($type, $level) = @{pop(@stack)};
1215 }
1216
8905a67c
AW
1217 # Statement ends at the ';' or a close '}' at the
1218 # outermost level.
1219 if ($level == 0 && $c eq ';') {
1220 last;
1221 }
1222
13214adf 1223 # An else is really a conditional as long as its not else if
773647a0
AW
1224 if ($level == 0 && $coff_set == 0 &&
1225 (!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
1226 $remainder =~ /^(else)(?:\s|{)/ &&
1227 $remainder !~ /^else\s+if\b/) {
1228 $coff = $off + length($1) - 1;
1229 $coff_set = 1;
1230 #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
1231 #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
13214adf
AW
1232 }
1233
8905a67c
AW
1234 if (($type eq '' || $type eq '(') && $c eq '(') {
1235 $level++;
1236 $type = '(';
1237 }
1238 if ($type eq '(' && $c eq ')') {
1239 $level--;
1240 $type = ($level != 0)? '(' : '';
1241
1242 if ($level == 0 && $coff < $soff) {
1243 $coff = $off;
773647a0
AW
1244 $coff_set = 1;
1245 #warn "CSB: mark coff<$coff>\n";
8905a67c
AW
1246 }
1247 }
1248 if (($type eq '' || $type eq '{') && $c eq '{') {
1249 $level++;
1250 $type = '{';
1251 }
1252 if ($type eq '{' && $c eq '}') {
1253 $level--;
1254 $type = ($level != 0)? '{' : '';
1255
1256 if ($level == 0) {
b998e001
PP
1257 if (substr($blk, $off + 1, 1) eq ';') {
1258 $off++;
1259 }
8905a67c
AW
1260 last;
1261 }
1262 }
f74bd194
AW
1263 # Preprocessor commands end at the newline unless escaped.
1264 if ($type eq '#' && $c eq "\n" && $p ne "\\") {
1265 $level--;
1266 $type = '';
1267 $off++;
1268 last;
1269 }
8905a67c
AW
1270 $off++;
1271 }
a3bb97a7 1272 # We are truly at the end, so shuffle to the next line.
13214adf 1273 if ($off == $len) {
a3bb97a7 1274 $loff = $len + 1;
13214adf
AW
1275 $line++;
1276 $remain--;
1277 }
8905a67c
AW
1278
1279 my $statement = substr($blk, $soff, $off - $soff + 1);
1280 my $condition = substr($blk, $soff, $coff - $soff + 1);
1281
1282 #warn "STATEMENT<$statement>\n";
1283 #warn "CONDITION<$condition>\n";
1284
773647a0 1285 #print "coff<$coff> soff<$off> loff<$loff>\n";
13214adf
AW
1286
1287 return ($statement, $condition,
1288 $line, $remain + 1, $off - $loff + 1, $level);
1289}
1290
cf655043
AW
1291sub statement_lines {
1292 my ($stmt) = @_;
1293
1294 # Strip the diff line prefixes and rip blank lines at start and end.
1295 $stmt =~ s/(^|\n)./$1/g;
1296 $stmt =~ s/^\s*//;
1297 $stmt =~ s/\s*$//;
1298
1299 my @stmt_lines = ($stmt =~ /\n/g);
1300
1301 return $#stmt_lines + 2;
1302}
1303
1304sub statement_rawlines {
1305 my ($stmt) = @_;
1306
1307 my @stmt_lines = ($stmt =~ /\n/g);
1308
1309 return $#stmt_lines + 2;
1310}
1311
1312sub statement_block_size {
1313 my ($stmt) = @_;
1314
1315 $stmt =~ s/(^|\n)./$1/g;
1316 $stmt =~ s/^\s*{//;
1317 $stmt =~ s/}\s*$//;
1318 $stmt =~ s/^\s*//;
1319 $stmt =~ s/\s*$//;
1320
1321 my @stmt_lines = ($stmt =~ /\n/g);
1322 my @stmt_statements = ($stmt =~ /;/g);
1323
1324 my $stmt_lines = $#stmt_lines + 2;
1325 my $stmt_statements = $#stmt_statements + 1;
1326
1327 if ($stmt_lines > $stmt_statements) {
1328 return $stmt_lines;
1329 } else {
1330 return $stmt_statements;
1331 }
1332}
1333
13214adf
AW
1334sub ctx_statement_full {
1335 my ($linenr, $remain, $off) = @_;
1336 my ($statement, $condition, $level);
1337
1338 my (@chunks);
1339
cf655043 1340 # Grab the first conditional/block pair.
13214adf
AW
1341 ($statement, $condition, $linenr, $remain, $off, $level) =
1342 ctx_statement_block($linenr, $remain, $off);
773647a0 1343 #print "F: c<$condition> s<$statement> remain<$remain>\n";
cf655043
AW
1344 push(@chunks, [ $condition, $statement ]);
1345 if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
1346 return ($level, $linenr, @chunks);
1347 }
1348
1349 # Pull in the following conditional/block pairs and see if they
1350 # could continue the statement.
13214adf 1351 for (;;) {
13214adf
AW
1352 ($statement, $condition, $linenr, $remain, $off, $level) =
1353 ctx_statement_block($linenr, $remain, $off);
cf655043 1354 #print "C: c<$condition> s<$statement> remain<$remain>\n";
773647a0 1355 last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
cf655043
AW
1356 #print "C: push\n";
1357 push(@chunks, [ $condition, $statement ]);
13214adf
AW
1358 }
1359
1360 return ($level, $linenr, @chunks);
8905a67c
AW
1361}
1362
4a0df2ef 1363sub ctx_block_get {
f0a594c1 1364 my ($linenr, $remain, $outer, $open, $close, $off) = @_;
4a0df2ef
AW
1365 my $line;
1366 my $start = $linenr - 1;
4a0df2ef
AW
1367 my $blk = '';
1368 my @o;
1369 my @c;
1370 my @res = ();
1371
f0a594c1 1372 my $level = 0;
4635f4fb 1373 my @stack = ($level);
00df344f
AW
1374 for ($line = $start; $remain > 0; $line++) {
1375 next if ($rawlines[$line] =~ /^-/);
1376 $remain--;
1377
1378 $blk .= $rawlines[$line];
4635f4fb
AW
1379
1380 # Handle nested #if/#else.
01464f30 1381 if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
4635f4fb 1382 push(@stack, $level);
01464f30 1383 } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
4635f4fb 1384 $level = $stack[$#stack - 1];
01464f30 1385 } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
4635f4fb
AW
1386 $level = pop(@stack);
1387 }
1388
01464f30 1389 foreach my $c (split(//, $lines[$line])) {
f0a594c1
AW
1390 ##print "C<$c>L<$level><$open$close>O<$off>\n";
1391 if ($off > 0) {
1392 $off--;
1393 next;
1394 }
4a0df2ef 1395
f0a594c1
AW
1396 if ($c eq $close && $level > 0) {
1397 $level--;
1398 last if ($level == 0);
1399 } elsif ($c eq $open) {
1400 $level++;
1401 }
1402 }
4a0df2ef 1403
f0a594c1 1404 if (!$outer || $level <= 1) {
00df344f 1405 push(@res, $rawlines[$line]);
4a0df2ef
AW
1406 }
1407
f0a594c1 1408 last if ($level == 0);
4a0df2ef
AW
1409 }
1410
f0a594c1 1411 return ($level, @res);
4a0df2ef
AW
1412}
1413sub ctx_block_outer {
1414 my ($linenr, $remain) = @_;
1415
f0a594c1
AW
1416 my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1417 return @r;
4a0df2ef
AW
1418}
1419sub ctx_block {
1420 my ($linenr, $remain) = @_;
1421
f0a594c1
AW
1422 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1423 return @r;
653d4876
AW
1424}
1425sub ctx_statement {
f0a594c1
AW
1426 my ($linenr, $remain, $off) = @_;
1427
1428 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1429 return @r;
1430}
1431sub ctx_block_level {
653d4876
AW
1432 my ($linenr, $remain) = @_;
1433
f0a594c1 1434 return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
4a0df2ef 1435}
9c0ca6f9
AW
1436sub ctx_statement_level {
1437 my ($linenr, $remain, $off) = @_;
1438
1439 return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1440}
4a0df2ef
AW
1441
1442sub ctx_locate_comment {
1443 my ($first_line, $end_line) = @_;
1444
1445 # Catch a comment on the end of the line itself.
beae6332 1446 my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
4a0df2ef
AW
1447 return $current_comment if (defined $current_comment);
1448
1449 # Look through the context and try and figure out if there is a
1450 # comment.
1451 my $in_comment = 0;
1452 $current_comment = '';
1453 for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
00df344f
AW
1454 my $line = $rawlines[$linenr - 1];
1455 #warn " $line\n";
4a0df2ef
AW
1456 if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1457 $in_comment = 1;
1458 }
1459 if ($line =~ m@/\*@) {
1460 $in_comment = 1;
1461 }
1462 if (!$in_comment && $current_comment ne '') {
1463 $current_comment = '';
1464 }
1465 $current_comment .= $line . "\n" if ($in_comment);
1466 if ($line =~ m@\*/@) {
1467 $in_comment = 0;
1468 }
1469 }
1470
1471 chomp($current_comment);
1472 return($current_comment);
1473}
1474sub ctx_has_comment {
1475 my ($first_line, $end_line) = @_;
1476 my $cmt = ctx_locate_comment($first_line, $end_line);
1477
00df344f 1478 ##print "LINE: $rawlines[$end_line - 1 ]\n";
4a0df2ef
AW
1479 ##print "CMMT: $cmt\n";
1480
1481 return ($cmt ne '');
1482}
1483
4d001e4d
AW
1484sub raw_line {
1485 my ($linenr, $cnt) = @_;
1486
1487 my $offset = $linenr - 1;
1488 $cnt++;
1489
1490 my $line;
1491 while ($cnt) {
1492 $line = $rawlines[$offset++];
1493 next if (defined($line) && $line =~ /^-/);
1494 $cnt--;
1495 }
1496
1497 return $line;
1498}
1499
6c72ffaa
AW
1500sub cat_vet {
1501 my ($vet) = @_;
1502 my ($res, $coded);
9c0ca6f9 1503
6c72ffaa
AW
1504 $res = '';
1505 while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
1506 $res .= $1;
1507 if ($2 ne '') {
1508 $coded = sprintf("^%c", unpack('C', $2) + 64);
1509 $res .= $coded;
9c0ca6f9
AW
1510 }
1511 }
6c72ffaa 1512 $res =~ s/$/\$/;
9c0ca6f9 1513
6c72ffaa 1514 return $res;
9c0ca6f9
AW
1515}
1516
c2fdda0d 1517my $av_preprocessor = 0;
cf655043 1518my $av_pending;
c2fdda0d 1519my @av_paren_type;
1f65f947 1520my $av_pend_colon;
c2fdda0d
AW
1521
1522sub annotate_reset {
1523 $av_preprocessor = 0;
cf655043
AW
1524 $av_pending = '_';
1525 @av_paren_type = ('E');
1f65f947 1526 $av_pend_colon = 'O';
c2fdda0d
AW
1527}
1528
6c72ffaa
AW
1529sub annotate_values {
1530 my ($stream, $type) = @_;
0a920b5b 1531
6c72ffaa 1532 my $res;
1f65f947 1533 my $var = '_' x length($stream);
6c72ffaa
AW
1534 my $cur = $stream;
1535
c2fdda0d 1536 print "$stream\n" if ($dbg_values > 1);
6c72ffaa 1537
6c72ffaa 1538 while (length($cur)) {
773647a0 1539 @av_paren_type = ('E') if ($#av_paren_type < 0);
cf655043 1540 print " <" . join('', @av_paren_type) .
171ae1a4 1541 "> <$type> <$av_pending>" if ($dbg_values > 1);
6c72ffaa 1542 if ($cur =~ /^(\s+)/o) {
c2fdda0d
AW
1543 print "WS($1)\n" if ($dbg_values > 1);
1544 if ($1 =~ /\n/ && $av_preprocessor) {
cf655043 1545 $type = pop(@av_paren_type);
c2fdda0d 1546 $av_preprocessor = 0;
6c72ffaa
AW
1547 }
1548
c023e473 1549 } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
9446ef56
AW
1550 print "CAST($1)\n" if ($dbg_values > 1);
1551 push(@av_paren_type, $type);
addcdcea 1552 $type = 'c';
9446ef56 1553
e91b6e26 1554 } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
c2fdda0d 1555 print "DECLARE($1)\n" if ($dbg_values > 1);
6c72ffaa
AW
1556 $type = 'T';
1557
389a2fe5
AW
1558 } elsif ($cur =~ /^($Modifier)\s*/) {
1559 print "MODIFIER($1)\n" if ($dbg_values > 1);
1560 $type = 'T';
1561
c45dcabd 1562 } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
171ae1a4 1563 print "DEFINE($1,$2)\n" if ($dbg_values > 1);
c2fdda0d 1564 $av_preprocessor = 1;
171ae1a4
AW
1565 push(@av_paren_type, $type);
1566 if ($2 ne '') {
1567 $av_pending = 'N';
1568 }
1569 $type = 'E';
1570
c45dcabd 1571 } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
171ae1a4
AW
1572 print "UNDEF($1)\n" if ($dbg_values > 1);
1573 $av_preprocessor = 1;
1574 push(@av_paren_type, $type);
6c72ffaa 1575
c45dcabd 1576 } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
cf655043 1577 print "PRE_START($1)\n" if ($dbg_values > 1);
c2fdda0d 1578 $av_preprocessor = 1;
cf655043
AW
1579
1580 push(@av_paren_type, $type);
1581 push(@av_paren_type, $type);
171ae1a4 1582 $type = 'E';
cf655043 1583
c45dcabd 1584 } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
cf655043
AW
1585 print "PRE_RESTART($1)\n" if ($dbg_values > 1);
1586 $av_preprocessor = 1;
1587
1588 push(@av_paren_type, $av_paren_type[$#av_paren_type]);
1589
171ae1a4 1590 $type = 'E';
cf655043 1591
c45dcabd 1592 } elsif ($cur =~ /^(\#\s*(?:endif))/o) {
cf655043
AW
1593 print "PRE_END($1)\n" if ($dbg_values > 1);
1594
1595 $av_preprocessor = 1;
1596
1597 # Assume all arms of the conditional end as this
1598 # one does, and continue as if the #endif was not here.
1599 pop(@av_paren_type);
1600 push(@av_paren_type, $type);
171ae1a4 1601 $type = 'E';
6c72ffaa
AW
1602
1603 } elsif ($cur =~ /^(\\\n)/o) {
c2fdda0d 1604 print "PRECONT($1)\n" if ($dbg_values > 1);
6c72ffaa 1605
171ae1a4
AW
1606 } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
1607 print "ATTR($1)\n" if ($dbg_values > 1);
1608 $av_pending = $type;
1609 $type = 'N';
1610
6c72ffaa 1611 } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
c2fdda0d 1612 print "SIZEOF($1)\n" if ($dbg_values > 1);
6c72ffaa 1613 if (defined $2) {
cf655043 1614 $av_pending = 'V';
6c72ffaa
AW
1615 }
1616 $type = 'N';
1617
14b111c1 1618 } elsif ($cur =~ /^(if|while|for)\b/o) {
c2fdda0d 1619 print "COND($1)\n" if ($dbg_values > 1);
14b111c1 1620 $av_pending = 'E';
6c72ffaa
AW
1621 $type = 'N';
1622
1f65f947
AW
1623 } elsif ($cur =~/^(case)/o) {
1624 print "CASE($1)\n" if ($dbg_values > 1);
1625 $av_pend_colon = 'C';
1626 $type = 'N';
1627
14b111c1 1628 } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
c2fdda0d 1629 print "KEYWORD($1)\n" if ($dbg_values > 1);
6c72ffaa
AW
1630 $type = 'N';
1631
1632 } elsif ($cur =~ /^(\()/o) {
c2fdda0d 1633 print "PAREN('$1')\n" if ($dbg_values > 1);
cf655043
AW
1634 push(@av_paren_type, $av_pending);
1635 $av_pending = '_';
6c72ffaa
AW
1636 $type = 'N';
1637
1638 } elsif ($cur =~ /^(\))/o) {
cf655043
AW
1639 my $new_type = pop(@av_paren_type);
1640 if ($new_type ne '_') {
1641 $type = $new_type;
c2fdda0d
AW
1642 print "PAREN('$1') -> $type\n"
1643 if ($dbg_values > 1);
6c72ffaa 1644 } else {
c2fdda0d 1645 print "PAREN('$1')\n" if ($dbg_values > 1);
6c72ffaa
AW
1646 }
1647
c8cb2ca3 1648 } elsif ($cur =~ /^($Ident)\s*\(/o) {
c2fdda0d 1649 print "FUNC($1)\n" if ($dbg_values > 1);
c8cb2ca3 1650 $type = 'V';
cf655043 1651 $av_pending = 'V';
6c72ffaa 1652
8e761b04
AW
1653 } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
1654 if (defined $2 && $type eq 'C' || $type eq 'T') {
1f65f947 1655 $av_pend_colon = 'B';
8e761b04
AW
1656 } elsif ($type eq 'E') {
1657 $av_pend_colon = 'L';
1f65f947
AW
1658 }
1659 print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
1660 $type = 'V';
1661
6c72ffaa 1662 } elsif ($cur =~ /^($Ident|$Constant)/o) {
c2fdda0d 1663 print "IDENT($1)\n" if ($dbg_values > 1);
6c72ffaa
AW
1664 $type = 'V';
1665
1666 } elsif ($cur =~ /^($Assignment)/o) {
c2fdda0d 1667 print "ASSIGN($1)\n" if ($dbg_values > 1);
6c72ffaa
AW
1668 $type = 'N';
1669
cf655043 1670 } elsif ($cur =~/^(;|{|})/) {
c2fdda0d 1671 print "END($1)\n" if ($dbg_values > 1);
13214adf 1672 $type = 'E';
1f65f947
AW
1673 $av_pend_colon = 'O';
1674
8e761b04
AW
1675 } elsif ($cur =~/^(,)/) {
1676 print "COMMA($1)\n" if ($dbg_values > 1);
1677 $type = 'C';
1678
1f65f947
AW
1679 } elsif ($cur =~ /^(\?)/o) {
1680 print "QUESTION($1)\n" if ($dbg_values > 1);
1681 $type = 'N';
1682
1683 } elsif ($cur =~ /^(:)/o) {
1684 print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
1685
1686 substr($var, length($res), 1, $av_pend_colon);
1687 if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
1688 $type = 'E';
1689 } else {
1690 $type = 'N';
1691 }
1692 $av_pend_colon = 'O';
13214adf 1693
8e761b04 1694 } elsif ($cur =~ /^(\[)/o) {
13214adf 1695 print "CLOSE($1)\n" if ($dbg_values > 1);
6c72ffaa
AW
1696 $type = 'N';
1697
0d413866 1698 } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
74048ed8
AW
1699 my $variant;
1700
1701 print "OPV($1)\n" if ($dbg_values > 1);
1702 if ($type eq 'V') {
1703 $variant = 'B';
1704 } else {
1705 $variant = 'U';
1706 }
1707
1708 substr($var, length($res), 1, $variant);
1709 $type = 'N';
1710
6c72ffaa 1711 } elsif ($cur =~ /^($Operators)/o) {
c2fdda0d 1712 print "OP($1)\n" if ($dbg_values > 1);
6c72ffaa
AW
1713 if ($1 ne '++' && $1 ne '--') {
1714 $type = 'N';
1715 }
1716
1717 } elsif ($cur =~ /(^.)/o) {
c2fdda0d 1718 print "C($1)\n" if ($dbg_values > 1);
6c72ffaa
AW
1719 }
1720 if (defined $1) {
1721 $cur = substr($cur, length($1));
1722 $res .= $type x length($1);
1723 }
9c0ca6f9 1724 }
0a920b5b 1725
1f65f947 1726 return ($res, $var);
0a920b5b
AW
1727}
1728
8905a67c 1729sub possible {
13214adf 1730 my ($possible, $line) = @_;
9a974fdb 1731 my $notPermitted = qr{(?:
0776e594
AW
1732 ^(?:
1733 $Modifier|
1734 $Storage|
1735 $Type|
9a974fdb
AW
1736 DEFINE_\S+
1737 )$|
1738 ^(?:
0776e594
AW
1739 goto|
1740 return|
1741 case|
1742 else|
1743 asm|__asm__|
89a88353
AW
1744 do|
1745 \#|
1746 \#\#|
9a974fdb 1747 )(?:\s|$)|
0776e594 1748 ^(?:typedef|struct|enum)\b
9a974fdb
AW
1749 )}x;
1750 warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1751 if ($possible !~ $notPermitted) {
c45dcabd
AW
1752 # Check for modifiers.
1753 $possible =~ s/\s*$Storage\s*//g;
1754 $possible =~ s/\s*$Sparse\s*//g;
1755 if ($possible =~ /^\s*$/) {
1756
1757 } elsif ($possible =~ /\s/) {
1758 $possible =~ s/\s*$Type\s*//g;
d2506586 1759 for my $modifier (split(' ', $possible)) {
9a974fdb
AW
1760 if ($modifier !~ $notPermitted) {
1761 warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
485ff23e 1762 push(@modifierListFile, $modifier);
9a974fdb 1763 }
d2506586 1764 }
c45dcabd
AW
1765
1766 } else {
1767 warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
485ff23e 1768 push(@typeListFile, $possible);
c45dcabd 1769 }
8905a67c 1770 build_types();
0776e594
AW
1771 } else {
1772 warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
8905a67c
AW
1773 }
1774}
1775
6c72ffaa
AW
1776my $prefix = '';
1777
000d1cc1 1778sub show_type {
cbec18af 1779 my ($type) = @_;
91bfe484 1780
cbec18af
JP
1781 return defined $use_type{$type} if (scalar keys %use_type > 0);
1782
1783 return !defined $ignore_type{$type};
000d1cc1
JP
1784}
1785
f0a594c1 1786sub report {
cbec18af
JP
1787 my ($level, $type, $msg) = @_;
1788
1789 if (!show_type($type) ||
1790 (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
773647a0
AW
1791 return 0;
1792 }
57230297
JP
1793 my $output = '';
1794 if (-t STDOUT && $color) {
1795 if ($level eq 'ERROR') {
1796 $output .= RED;
1797 } elsif ($level eq 'WARNING') {
1798 $output .= YELLOW;
1799 } else {
1800 $output .= GREEN;
1801 }
1802 }
1803 $output .= $prefix . $level . ':';
000d1cc1 1804 if ($show_types) {
57230297
JP
1805 $output .= BLUE if (-t STDOUT && $color);
1806 $output .= "$type:";
000d1cc1 1807 }
57230297
JP
1808 $output .= RESET if (-t STDOUT && $color);
1809 $output .= ' ' . $msg . "\n";
34d8815f
JP
1810
1811 if ($showfile) {
1812 my @lines = split("\n", $output, -1);
1813 splice(@lines, 1, 1);
1814 $output = join("\n", @lines);
1815 }
57230297 1816 $output = (split('\n', $output))[0] . "\n" if ($terse);
8905a67c 1817
57230297 1818 push(our @report, $output);
773647a0
AW
1819
1820 return 1;
f0a594c1 1821}
cbec18af 1822
f0a594c1 1823sub report_dump {
13214adf 1824 our @report;
f0a594c1 1825}
000d1cc1 1826
d752fcc8
JP
1827sub fixup_current_range {
1828 my ($lineRef, $offset, $length) = @_;
1829
1830 if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) {
1831 my $o = $1;
1832 my $l = $2;
1833 my $no = $o + $offset;
1834 my $nl = $l + $length;
1835 $$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/;
1836 }
1837}
1838
1839sub fix_inserted_deleted_lines {
1840 my ($linesRef, $insertedRef, $deletedRef) = @_;
1841
1842 my $range_last_linenr = 0;
1843 my $delta_offset = 0;
1844
1845 my $old_linenr = 0;
1846 my $new_linenr = 0;
1847
1848 my $next_insert = 0;
1849 my $next_delete = 0;
1850
1851 my @lines = ();
1852
1853 my $inserted = @{$insertedRef}[$next_insert++];
1854 my $deleted = @{$deletedRef}[$next_delete++];
1855
1856 foreach my $old_line (@{$linesRef}) {
1857 my $save_line = 1;
1858 my $line = $old_line; #don't modify the array
323b267f 1859 if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) { #new filename
d752fcc8
JP
1860 $delta_offset = 0;
1861 } elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) { #new hunk
1862 $range_last_linenr = $new_linenr;
1863 fixup_current_range(\$line, $delta_offset, 0);
1864 }
1865
1866 while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) {
1867 $deleted = @{$deletedRef}[$next_delete++];
1868 $save_line = 0;
1869 fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1);
1870 }
1871
1872 while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) {
1873 push(@lines, ${$inserted}{'LINE'});
1874 $inserted = @{$insertedRef}[$next_insert++];
1875 $new_linenr++;
1876 fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1);
1877 }
1878
1879 if ($save_line) {
1880 push(@lines, $line);
1881 $new_linenr++;
1882 }
1883
1884 $old_linenr++;
1885 }
1886
1887 return @lines;
1888}
1889
f2d7e4d4
JP
1890sub fix_insert_line {
1891 my ($linenr, $line) = @_;
1892
1893 my $inserted = {
1894 LINENR => $linenr,
1895 LINE => $line,
1896 };
1897 push(@fixed_inserted, $inserted);
1898}
1899
1900sub fix_delete_line {
1901 my ($linenr, $line) = @_;
1902
1903 my $deleted = {
1904 LINENR => $linenr,
1905 LINE => $line,
1906 };
1907
1908 push(@fixed_deleted, $deleted);
1909}
1910
de7d4f0e 1911sub ERROR {
cbec18af
JP
1912 my ($type, $msg) = @_;
1913
1914 if (report("ERROR", $type, $msg)) {
773647a0
AW
1915 our $clean = 0;
1916 our $cnt_error++;
3705ce5b 1917 return 1;
773647a0 1918 }
3705ce5b 1919 return 0;
de7d4f0e
AW
1920}
1921sub WARN {
cbec18af
JP
1922 my ($type, $msg) = @_;
1923
1924 if (report("WARNING", $type, $msg)) {
773647a0
AW
1925 our $clean = 0;
1926 our $cnt_warn++;
3705ce5b 1927 return 1;
773647a0 1928 }
3705ce5b 1929 return 0;
de7d4f0e
AW
1930}
1931sub CHK {
cbec18af
JP
1932 my ($type, $msg) = @_;
1933
1934 if ($check && report("CHECK", $type, $msg)) {
6c72ffaa
AW
1935 our $clean = 0;
1936 our $cnt_chk++;
3705ce5b 1937 return 1;
6c72ffaa 1938 }
3705ce5b 1939 return 0;
de7d4f0e
AW
1940}
1941
6ecd9674
AW
1942sub check_absolute_file {
1943 my ($absolute, $herecurr) = @_;
1944 my $file = $absolute;
1945
1946 ##print "absolute<$absolute>\n";
1947
1948 # See if any suffix of this path is a path within the tree.
1949 while ($file =~ s@^[^/]*/@@) {
1950 if (-f "$root/$file") {
1951 ##print "file<$file>\n";
1952 last;
1953 }
1954 }
1955 if (! -f _) {
1956 return 0;
1957 }
1958
1959 # It is, so see if the prefix is acceptable.
1960 my $prefix = $absolute;
1961 substr($prefix, -length($file)) = '';
1962
1963 ##print "prefix<$prefix>\n";
1964 if ($prefix ne ".../") {
000d1cc1
JP
1965 WARN("USE_RELATIVE_PATH",
1966 "use relative pathname instead of absolute in changelog text\n" . $herecurr);
6ecd9674
AW
1967 }
1968}
1969
3705ce5b
JP
1970sub trim {
1971 my ($string) = @_;
1972
b34c648b
JP
1973 $string =~ s/^\s+|\s+$//g;
1974
1975 return $string;
1976}
1977
1978sub ltrim {
1979 my ($string) = @_;
1980
1981 $string =~ s/^\s+//;
1982
1983 return $string;
1984}
1985
1986sub rtrim {
1987 my ($string) = @_;
1988
1989 $string =~ s/\s+$//;
3705ce5b
JP
1990
1991 return $string;
1992}
1993
52ea8506
JP
1994sub string_find_replace {
1995 my ($string, $find, $replace) = @_;
1996
1997 $string =~ s/$find/$replace/g;
1998
1999 return $string;
2000}
2001
3705ce5b
JP
2002sub tabify {
2003 my ($leading) = @_;
2004
2005 my $source_indent = 8;
2006 my $max_spaces_before_tab = $source_indent - 1;
2007 my $spaces_to_tab = " " x $source_indent;
2008
2009 #convert leading spaces to tabs
2010 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
2011 #Remove spaces before a tab
2012 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
2013
2014 return "$leading";
2015}
2016
d1fe9c09
JP
2017sub pos_last_openparen {
2018 my ($line) = @_;
2019
2020 my $pos = 0;
2021
2022 my $opens = $line =~ tr/\(/\(/;
2023 my $closes = $line =~ tr/\)/\)/;
2024
2025 my $last_openparen = 0;
2026
2027 if (($opens == 0) || ($closes >= $opens)) {
2028 return -1;
2029 }
2030
2031 my $len = length($line);
2032
2033 for ($pos = 0; $pos < $len; $pos++) {
2034 my $string = substr($line, $pos);
2035 if ($string =~ /^($FuncArg|$balanced_parens)/) {
2036 $pos += length($1) - 1;
2037 } elsif (substr($line, $pos, 1) eq '(') {
2038 $last_openparen = $pos;
2039 } elsif (index($string, '(') == -1) {
2040 last;
2041 }
2042 }
2043
91cb5195 2044 return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
d1fe9c09
JP
2045}
2046
0a920b5b
AW
2047sub process {
2048 my $filename = shift;
0a920b5b
AW
2049
2050 my $linenr=0;
2051 my $prevline="";
c2fdda0d 2052 my $prevrawline="";
0a920b5b 2053 my $stashline="";
c2fdda0d 2054 my $stashrawline="";
0a920b5b 2055
4a0df2ef 2056 my $length;
0a920b5b
AW
2057 my $indent;
2058 my $previndent=0;
2059 my $stashindent=0;
2060
de7d4f0e 2061 our $clean = 1;
0a920b5b
AW
2062 my $signoff = 0;
2063 my $is_patch = 0;
29ee1b0c 2064 my $in_header_lines = $file ? 0 : 1;
15662b3e 2065 my $in_commit_log = 0; #Scanning lines before patch
bf4daf12 2066 my $commit_log_possible_stack_dump = 0;
2a076f40 2067 my $commit_log_long_line = 0;
e518e9a5 2068 my $commit_log_has_diff = 0;
13f1937e 2069 my $reported_maintainer_file = 0;
fa64205d
PS
2070 my $non_utf8_charset = 0;
2071
365dd4ea 2072 my $last_blank_line = 0;
5e4f6ba5 2073 my $last_coalesced_string_linenr = -1;
365dd4ea 2074
13214adf 2075 our @report = ();
6c72ffaa
AW
2076 our $cnt_lines = 0;
2077 our $cnt_error = 0;
2078 our $cnt_warn = 0;
2079 our $cnt_chk = 0;
2080
0a920b5b
AW
2081 # Trace the real file/line as we go.
2082 my $realfile = '';
2083 my $realline = 0;
2084 my $realcnt = 0;
2085 my $here = '';
2086 my $in_comment = 0;
c2fdda0d 2087 my $comment_edge = 0;
0a920b5b 2088 my $first_line = 0;
1e855726 2089 my $p1_prefix = '';
0a920b5b 2090
13214adf
AW
2091 my $prev_values = 'E';
2092
2093 # suppression flags
773647a0 2094 my %suppress_ifbraces;
170d3a22 2095 my %suppress_whiletrailers;
2b474a1a 2096 my %suppress_export;
3e469cdc 2097 my $suppress_statement = 0;
653d4876 2098
7e51f197 2099 my %signatures = ();
323c1260 2100
c2fdda0d 2101 # Pre-scan the patch sanitizing the lines.
de7d4f0e 2102 # Pre-scan the patch looking for any __setup documentation.
c2fdda0d 2103 #
de7d4f0e
AW
2104 my @setup_docs = ();
2105 my $setup_docs = 0;
773647a0 2106
d8b07710
JP
2107 my $camelcase_file_seeded = 0;
2108
773647a0 2109 sanitise_line_reset();
c2fdda0d
AW
2110 my $line;
2111 foreach my $rawline (@rawlines) {
773647a0
AW
2112 $linenr++;
2113 $line = $rawline;
c2fdda0d 2114
3705ce5b
JP
2115 push(@fixed, $rawline) if ($fix);
2116
773647a0 2117 if ($rawline=~/^\+\+\+\s+(\S+)/) {
de7d4f0e
AW
2118 $setup_docs = 0;
2119 if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
2120 $setup_docs = 1;
2121 }
773647a0
AW
2122 #next;
2123 }
2124 if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
2125 $realline=$1-1;
2126 if (defined $2) {
2127 $realcnt=$3+1;
2128 } else {
2129 $realcnt=1+1;
2130 }
c45dcabd 2131 $in_comment = 0;
773647a0
AW
2132
2133 # Guestimate if this is a continuing comment. Run
2134 # the context looking for a comment "edge". If this
2135 # edge is a close comment then we must be in a comment
2136 # at context start.
2137 my $edge;
01fa9147
AW
2138 my $cnt = $realcnt;
2139 for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
2140 next if (defined $rawlines[$ln - 1] &&
2141 $rawlines[$ln - 1] =~ /^-/);
2142 $cnt--;
2143 #print "RAW<$rawlines[$ln - 1]>\n";
721c1cb6 2144 last if (!defined $rawlines[$ln - 1]);
fae17dae
AW
2145 if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
2146 $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
2147 ($edge) = $1;
2148 last;
2149 }
773647a0
AW
2150 }
2151 if (defined $edge && $edge eq '*/') {
2152 $in_comment = 1;
2153 }
2154
2155 # Guestimate if this is a continuing comment. If this
2156 # is the start of a diff block and this line starts
2157 # ' *' then it is very likely a comment.
2158 if (!defined $edge &&
83242e0c 2159 $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
773647a0
AW
2160 {
2161 $in_comment = 1;
2162 }
2163
2164 ##print "COMMENT:$in_comment edge<$edge> $rawline\n";
2165 sanitise_line_reset($in_comment);
2166
171ae1a4 2167 } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
773647a0 2168 # Standardise the strings and chars within the input to
171ae1a4 2169 # simplify matching -- only bother with positive lines.
773647a0 2170 $line = sanitise_line($rawline);
de7d4f0e 2171 }
773647a0
AW
2172 push(@lines, $line);
2173
2174 if ($realcnt > 1) {
2175 $realcnt-- if ($line =~ /^(?:\+| |$)/);
2176 } else {
2177 $realcnt = 0;
2178 }
2179
2180 #print "==>$rawline\n";
2181 #print "-->$line\n";
de7d4f0e
AW
2182
2183 if ($setup_docs && $line =~ /^\+/) {
2184 push(@setup_docs, $line);
2185 }
2186 }
2187
6c72ffaa
AW
2188 $prefix = '';
2189
773647a0
AW
2190 $realcnt = 0;
2191 $linenr = 0;
194f66fc 2192 $fixlinenr = -1;
0a920b5b
AW
2193 foreach my $line (@lines) {
2194 $linenr++;
194f66fc 2195 $fixlinenr++;
1b5539b1
JP
2196 my $sline = $line; #copy of $line
2197 $sline =~ s/$;/ /g; #with comments as spaces
0a920b5b 2198
c2fdda0d 2199 my $rawline = $rawlines[$linenr - 1];
6c72ffaa 2200
0a920b5b 2201#extract the line range in the file after the patch is applied
e518e9a5
JP
2202 if (!$in_commit_log &&
2203 $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
0a920b5b 2204 $is_patch = 1;
4a0df2ef 2205 $first_line = $linenr + 1;
0a920b5b
AW
2206 $realline=$1-1;
2207 if (defined $2) {
2208 $realcnt=$3+1;
2209 } else {
2210 $realcnt=1+1;
2211 }
c2fdda0d 2212 annotate_reset();
13214adf
AW
2213 $prev_values = 'E';
2214
773647a0 2215 %suppress_ifbraces = ();
170d3a22 2216 %suppress_whiletrailers = ();
2b474a1a 2217 %suppress_export = ();
3e469cdc 2218 $suppress_statement = 0;
0a920b5b 2219 next;
0a920b5b 2220
4a0df2ef
AW
2221# track the line number as we move through the hunk, note that
2222# new versions of GNU diff omit the leading space on completely
2223# blank context lines so we need to count that too.
773647a0 2224 } elsif ($line =~ /^( |\+|$)/) {
0a920b5b 2225 $realline++;
d8aaf121 2226 $realcnt-- if ($realcnt != 0);
0a920b5b 2227
4a0df2ef 2228 # Measure the line length and indent.
c2fdda0d 2229 ($length, $indent) = line_stats($rawline);
0a920b5b
AW
2230
2231 # Track the previous line.
2232 ($prevline, $stashline) = ($stashline, $line);
2233 ($previndent, $stashindent) = ($stashindent, $indent);
c2fdda0d
AW
2234 ($prevrawline, $stashrawline) = ($stashrawline, $rawline);
2235
773647a0 2236 #warn "line<$line>\n";
6c72ffaa 2237
d8aaf121
AW
2238 } elsif ($realcnt == 1) {
2239 $realcnt--;
0a920b5b
AW
2240 }
2241
cc77cdca
AW
2242 my $hunk_line = ($realcnt != 0);
2243
6c72ffaa
AW
2244 $here = "#$linenr: " if (!$file);
2245 $here = "#$realline: " if ($file);
773647a0 2246
2ac73b4f 2247 my $found_file = 0;
773647a0 2248 # extract the filename as it passes
3bf9a009
RV
2249 if ($line =~ /^diff --git.*?(\S+)$/) {
2250 $realfile = $1;
2b7ab453 2251 $realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a0 2252 $in_commit_log = 0;
2ac73b4f 2253 $found_file = 1;
3bf9a009 2254 } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
773647a0 2255 $realfile = $1;
2b7ab453 2256 $realfile =~ s@^([^/]*)/@@ if (!$file);
270c49a0 2257 $in_commit_log = 0;
1e855726
WS
2258
2259 $p1_prefix = $1;
e2f7aa4b
AW
2260 if (!$file && $tree && $p1_prefix ne '' &&
2261 -e "$root/$p1_prefix") {
000d1cc1
JP
2262 WARN("PATCH_PREFIX",
2263 "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
1e855726 2264 }
773647a0 2265
c1ab3326 2266 if ($realfile =~ m@^include/asm/@) {
000d1cc1
JP
2267 ERROR("MODIFIED_INCLUDE_ASM",
2268 "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
773647a0 2269 }
2ac73b4f
JP
2270 $found_file = 1;
2271 }
2272
34d8815f
JP
2273#make up the handle for any error we report on this line
2274 if ($showfile) {
2275 $prefix = "$realfile:$realline: "
2276 } elsif ($emacs) {
7d3a9f67
JP
2277 if ($file) {
2278 $prefix = "$filename:$realline: ";
2279 } else {
2280 $prefix = "$filename:$linenr: ";
2281 }
34d8815f
JP
2282 }
2283
2ac73b4f 2284 if ($found_file) {
7bd7e483 2285 if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
2ac73b4f
JP
2286 $check = 1;
2287 } else {
2288 $check = $check_orig;
2289 }
773647a0
AW
2290 next;
2291 }
2292
389834b6 2293 $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
0a920b5b 2294
c2fdda0d
AW
2295 my $hereline = "$here\n$rawline\n";
2296 my $herecurr = "$here\n$rawline\n";
2297 my $hereprev = "$here\n$prevrawline\n$rawline\n";
0a920b5b 2298
6c72ffaa
AW
2299 $cnt_lines++ if ($realcnt != 0);
2300
e518e9a5
JP
2301# Check if the commit log has what seems like a diff which can confuse patch
2302 if ($in_commit_log && !$commit_log_has_diff &&
2303 (($line =~ m@^\s+diff\b.*a/[\w/]+@ &&
2304 $line =~ m@^\s+diff\b.*a/([\w/]+)\s+b/$1\b@) ||
2305 $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ ||
2306 $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) {
2307 ERROR("DIFF_IN_COMMIT_MSG",
2308 "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr);
2309 $commit_log_has_diff = 1;
2310 }
2311
3bf9a009
RV
2312# Check for incorrect file permissions
2313 if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
2314 my $permhere = $here . "FILE: $realfile\n";
04db4d25
JP
2315 if ($realfile !~ m@scripts/@ &&
2316 $realfile !~ /\.(py|pl|awk|sh)$/) {
000d1cc1
JP
2317 ERROR("EXECUTE_PERMISSIONS",
2318 "do not set execute permissions for source files\n" . $permhere);
3bf9a009
RV
2319 }
2320 }
2321
20112475 2322# Check the patch for a signoff:
d8aaf121 2323 if ($line =~ /^\s*signed-off-by:/i) {
4a0df2ef 2324 $signoff++;
15662b3e 2325 $in_commit_log = 0;
20112475
JP
2326 }
2327
e0d975b1
JP
2328# Check if MAINTAINERS is being updated. If so, there's probably no need to
2329# emit the "does MAINTAINERS need updating?" message on file add/move/delete
2330 if ($line =~ /^\s*MAINTAINERS\s*\|/) {
2331 $reported_maintainer_file = 1;
2332 }
2333
20112475 2334# Check signature styles
270c49a0 2335 if (!$in_header_lines &&
ce0338df 2336 $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
20112475
JP
2337 my $space_before = $1;
2338 my $sign_off = $2;
2339 my $space_after = $3;
2340 my $email = $4;
2341 my $ucfirst_sign_off = ucfirst(lc($sign_off));
2342
ce0338df
JP
2343 if ($sign_off !~ /$signature_tags/) {
2344 WARN("BAD_SIGN_OFF",
2345 "Non-standard signature: $sign_off\n" . $herecurr);
2346 }
20112475 2347 if (defined $space_before && $space_before ne "") {
3705ce5b
JP
2348 if (WARN("BAD_SIGN_OFF",
2349 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
2350 $fix) {
194f66fc 2351 $fixed[$fixlinenr] =
3705ce5b
JP
2352 "$ucfirst_sign_off $email";
2353 }
20112475
JP
2354 }
2355 if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
3705ce5b
JP
2356 if (WARN("BAD_SIGN_OFF",
2357 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
2358 $fix) {
194f66fc 2359 $fixed[$fixlinenr] =
3705ce5b
JP
2360 "$ucfirst_sign_off $email";
2361 }
2362
20112475
JP
2363 }
2364 if (!defined $space_after || $space_after ne " ") {
3705ce5b
JP
2365 if (WARN("BAD_SIGN_OFF",
2366 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
2367 $fix) {
194f66fc 2368 $fixed[$fixlinenr] =
3705ce5b
JP
2369 "$ucfirst_sign_off $email";
2370 }
0a920b5b 2371 }
20112475
JP
2372
2373 my ($email_name, $email_address, $comment) = parse_email($email);
2374 my $suggested_email = format_email(($email_name, $email_address));
2375 if ($suggested_email eq "") {
000d1cc1
JP
2376 ERROR("BAD_SIGN_OFF",
2377 "Unrecognized email address: '$email'\n" . $herecurr);
20112475
JP
2378 } else {
2379 my $dequoted = $suggested_email;
2380 $dequoted =~ s/^"//;
2381 $dequoted =~ s/" </ </;
2382 # Don't force email to have quotes
2383 # Allow just an angle bracketed address
2384 if ("$dequoted$comment" ne $email &&
2385 "<$email_address>$comment" ne $email &&
2386 "$suggested_email$comment" ne $email) {
000d1cc1
JP
2387 WARN("BAD_SIGN_OFF",
2388 "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
20112475 2389 }
0a920b5b 2390 }
7e51f197
JP
2391
2392# Check for duplicate signatures
2393 my $sig_nospace = $line;
2394 $sig_nospace =~ s/\s//g;
2395 $sig_nospace = lc($sig_nospace);
2396 if (defined $signatures{$sig_nospace}) {
2397 WARN("BAD_SIGN_OFF",
2398 "Duplicate signature\n" . $herecurr);
2399 } else {
2400 $signatures{$sig_nospace} = 1;
2401 }
0a920b5b
AW
2402 }
2403
a2fe16b9
JP
2404# Check email subject for common tools that don't need to be mentioned
2405 if ($in_header_lines &&
2406 $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) {
2407 WARN("EMAIL_SUBJECT",
2408 "A patch subject line should describe the change not the tool that found it\n" . $herecurr);
2409 }
2410
9b3189eb
JP
2411# Check for old stable address
2412 if ($line =~ /^\s*cc:\s*.*<?\bstable\@kernel\.org\b>?.*$/i) {
2413 ERROR("STABLE_ADDRESS",
2414 "The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);
2415 }
2416
7ebd05ef
CC
2417# Check for unwanted Gerrit info
2418 if ($in_commit_log && $line =~ /^\s*change-id:/i) {
2419 ERROR("GERRIT_CHANGE_ID",
2420 "Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
2421 }
2422
369c8dd3
JP
2423# Check if the commit log is in a possible stack dump
2424 if ($in_commit_log && !$commit_log_possible_stack_dump &&
2425 ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
2426 $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||
2427 # timestamp
2428 $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/)) {
2429 # stack dump address
2430 $commit_log_possible_stack_dump = 1;
2431 }
2432
2a076f40
JP
2433# Check for line lengths > 75 in commit log, warn once
2434 if ($in_commit_log && !$commit_log_long_line &&
369c8dd3
JP
2435 length($line) > 75 &&
2436 !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ ||
2437 # file delta changes
2438 $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ ||
2439 # filename then :
2440 $line =~ /^\s*(?:Fixes:|Link:)/i ||
2441 # A Fixes: or Link: line
2442 $commit_log_possible_stack_dump)) {
2a076f40
JP
2443 WARN("COMMIT_LOG_LONG_LINE",
2444 "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr);
2445 $commit_log_long_line = 1;
2446 }
2447
bf4daf12 2448# Reset possible stack dump if a blank line is found
369c8dd3
JP
2449 if ($in_commit_log && $commit_log_possible_stack_dump &&
2450 $line =~ /^\s*$/) {
2451 $commit_log_possible_stack_dump = 0;
2452 }
bf4daf12 2453
0d7835fc 2454# Check for git id commit length and improperly formed commit descriptions
369c8dd3 2455 if ($in_commit_log && !$commit_log_possible_stack_dump &&
fe043ea1 2456 ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
369c8dd3
JP
2457 ($line =~ /\b[0-9a-f]{12,40}\b/i &&
2458 $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
2459 $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
fe043ea1
JP
2460 my $init_char = "c";
2461 my $orig_commit = "";
0d7835fc
JP
2462 my $short = 1;
2463 my $long = 0;
2464 my $case = 1;
2465 my $space = 1;
2466 my $hasdesc = 0;
19c146a6 2467 my $hasparens = 0;
0d7835fc
JP
2468 my $id = '0123456789ab';
2469 my $orig_desc = "commit description";
2470 my $description = "";
2471
fe043ea1
JP
2472 if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
2473 $init_char = $1;
2474 $orig_commit = lc($2);
2475 } elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) {
2476 $orig_commit = lc($1);
2477 }
2478
0d7835fc
JP
2479 $short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i);
2480 $long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i);
2481 $space = 0 if ($line =~ /\bcommit [0-9a-f]/i);
2482 $case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
2483 if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) {
2484 $orig_desc = $1;
19c146a6 2485 $hasparens = 1;
0d7835fc
JP
2486 } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
2487 defined $rawlines[$linenr] &&
2488 $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
2489 $orig_desc = $1;
19c146a6 2490 $hasparens = 1;
b671fde0
JP
2491 } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i &&
2492 defined $rawlines[$linenr] &&
2493 $rawlines[$linenr] =~ /^\s*[^"]+"\)/) {
2494 $line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i;
2495 $orig_desc = $1;
2496 $rawlines[$linenr] =~ /^\s*([^"]+)"\)/;
2497 $orig_desc .= " " . $1;
19c146a6 2498 $hasparens = 1;
0d7835fc
JP
2499 }
2500
2501 ($id, $description) = git_commit_info($orig_commit,
2502 $id, $orig_desc);
2503
19c146a6 2504 if ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens) {
0d7835fc
JP
2505 ERROR("GIT_COMMIT_ID",
2506 "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr);
2507 }
d311cd44
JP
2508 }
2509
13f1937e
JP
2510# Check for added, moved or deleted files
2511 if (!$reported_maintainer_file && !$in_commit_log &&
2512 ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
2513 $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
2514 ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
2515 (defined($1) || defined($2))))) {
2516 $reported_maintainer_file = 1;
2517 WARN("FILE_PATH_CHANGES",
2518 "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
2519 }
2520
00df344f 2521# Check for wrappage within a valid hunk of the file
8905a67c 2522 if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
000d1cc1
JP
2523 ERROR("CORRUPTED_PATCH",
2524 "patch seems to be corrupt (line wrapped?)\n" .
6c72ffaa 2525 $herecurr) if (!$emitted_corrupt++);
de7d4f0e
AW
2526 }
2527
6ecd9674
AW
2528# Check for absolute kernel paths.
2529 if ($tree) {
2530 while ($line =~ m{(?:^|\s)(/\S*)}g) {
2531 my $file = $1;
2532
2533 if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
2534 check_absolute_file($1, $herecurr)) {
2535 #
2536 } else {
2537 check_absolute_file($file, $herecurr);
2538 }
2539 }
2540 }
2541
de7d4f0e
AW
2542# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
2543 if (($realfile =~ /^$/ || $line =~ /^\+/) &&
171ae1a4
AW
2544 $rawline !~ m/^$UTF8*$/) {
2545 my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
2546
2547 my $blank = copy_spacing($rawline);
2548 my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
2549 my $hereptr = "$hereline$ptr\n";
2550
34d99219
JP
2551 CHK("INVALID_UTF8",
2552 "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
00df344f
AW
2553 }
2554
15662b3e
JP
2555# Check if it's the start of a commit log
2556# (not a header line and we haven't seen the patch filename)
2557 if ($in_header_lines && $realfile =~ /^$/ &&
29ee1b0c
JP
2558 !($rawline =~ /^\s+\S/ ||
2559 $rawline =~ /^(commit\b|from\b|[\w-]+:).*$/i)) {
15662b3e
JP
2560 $in_header_lines = 0;
2561 $in_commit_log = 1;
2562 }
2563
fa64205d
PS
2564# Check if there is UTF-8 in a commit log when a mail header has explicitly
2565# declined it, i.e defined some charset where it is missing.
2566 if ($in_header_lines &&
2567 $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
2568 $1 !~ /utf-8/i) {
2569 $non_utf8_charset = 1;
2570 }
2571
2572 if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
15662b3e 2573 $rawline =~ /$NON_ASCII_UTF8/) {
fa64205d 2574 WARN("UTF8_BEFORE_PATCH",
15662b3e
JP
2575 "8-bit UTF-8 used in possible commit log\n" . $herecurr);
2576 }
2577
66b47b4a 2578# Check for various typo / spelling mistakes
66d7a382
JP
2579 if (defined($misspellings) &&
2580 ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
ebfd7d62 2581 while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {
66b47b4a
KC
2582 my $typo = $1;
2583 my $typo_fix = $spelling_fix{lc($typo)};
2584 $typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
2585 $typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
2586 my $msg_type = \&WARN;
2587 $msg_type = \&CHK if ($file);
2588 if (&{$msg_type}("TYPO_SPELLING",
2589 "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) &&
2590 $fix) {
2591 $fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
2592 }
2593 }
2594 }
2595
30670854
AW
2596# ignore non-hunk lines and lines being removed
2597 next if (!$hunk_line || $line =~ /^-/);
0a920b5b 2598
0a920b5b 2599#trailing whitespace
9c0ca6f9 2600 if ($line =~ /^\+.*\015/) {
c2fdda0d 2601 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
d5e616fc
JP
2602 if (ERROR("DOS_LINE_ENDINGS",
2603 "DOS line endings\n" . $herevet) &&
2604 $fix) {
194f66fc 2605 $fixed[$fixlinenr] =~ s/[\s\015]+$//;
d5e616fc 2606 }
c2fdda0d
AW
2607 } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
2608 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3705ce5b
JP
2609 if (ERROR("TRAILING_WHITESPACE",
2610 "trailing whitespace\n" . $herevet) &&
2611 $fix) {
194f66fc 2612 $fixed[$fixlinenr] =~ s/\s+$//;
3705ce5b
JP
2613 }
2614
d2c0a235 2615 $rpt_cleaners = 1;
0a920b5b 2616 }
5368df20 2617
4783f894 2618# Check for FSF mailing addresses.
109d8cb2 2619 if ($rawline =~ /\bwrite to the Free/i ||
3e2232f2
JP
2620 $rawline =~ /\b59\s+Temple\s+Pl/i ||
2621 $rawline =~ /\b51\s+Franklin\s+St/i) {
4783f894
JT
2622 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2623 my $msg_type = \&ERROR;
2624 $msg_type = \&CHK if ($file);
2625 &{$msg_type}("FSF_MAILING_ADDRESS",
3e2232f2 2626 "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
2627 }
2628
3354957a 2629# check for Kconfig help text having a real description
9fe287d7
AW
2630# Only applies when adding the entry originally, after that we do not have
2631# sufficient context to determine whether it is indeed long enough.
3354957a 2632 if ($realfile =~ /Kconfig/ &&
8d73e0e7 2633 $line =~ /^\+\s*config\s+/) {
3354957a 2634 my $length = 0;
9fe287d7
AW
2635 my $cnt = $realcnt;
2636 my $ln = $linenr + 1;
2637 my $f;
a1385803 2638 my $is_start = 0;
9fe287d7 2639 my $is_end = 0;
a1385803 2640 for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
9fe287d7
AW
2641 $f = $lines[$ln - 1];
2642 $cnt-- if ($lines[$ln - 1] !~ /^-/);
2643 $is_end = $lines[$ln - 1] =~ /^\+/;
9fe287d7
AW
2644
2645 next if ($f =~ /^-/);
8d73e0e7 2646 last if (!$file && $f =~ /^\@\@/);
a1385803 2647
8d73e0e7 2648 if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate)\s*\"/) {
a1385803 2649 $is_start = 1;
8d73e0e7 2650 } elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {
a1385803
AW
2651 $length = -1;
2652 }
2653
9fe287d7 2654 $f =~ s/^.//;
3354957a
AK
2655 $f =~ s/#.*//;
2656 $f =~ s/^\s+//;
2657 next if ($f =~ /^$/);
9fe287d7
AW
2658 if ($f =~ /^\s*config\s/) {
2659 $is_end = 1;
2660 last;
2661 }
3354957a
AK
2662 $length++;
2663 }
56193274
VB
2664 if ($is_start && $is_end && $length < $min_conf_desc_length) {
2665 WARN("CONFIG_DESCRIPTION",
2666 "please write a paragraph that describes the config symbol fully\n" . $herecurr);
2667 }
a1385803 2668 #print "is_start<$is_start> is_end<$is_end> length<$length>\n";
3354957a
AK
2669 }
2670
1ba8dfd1
KC
2671# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
2672 if ($realfile =~ /Kconfig/ &&
2673 $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
2674 WARN("CONFIG_EXPERIMENTAL",
2675 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
2676 }
2677
327953e9
CJ
2678# discourage the use of boolean for type definition attributes of Kconfig options
2679 if ($realfile =~ /Kconfig/ &&
2680 $line =~ /^\+\s*\bboolean\b/) {
2681 WARN("CONFIG_TYPE_BOOLEAN",
2682 "Use of boolean is deprecated, please use bool instead.\n" . $herecurr);
2683 }
2684
c68e5878
AL
2685 if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
2686 ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
2687 my $flag = $1;
2688 my $replacement = {
2689 'EXTRA_AFLAGS' => 'asflags-y',
2690 'EXTRA_CFLAGS' => 'ccflags-y',
2691 'EXTRA_CPPFLAGS' => 'cppflags-y',
2692 'EXTRA_LDFLAGS' => 'ldflags-y',
2693 };
2694
2695 WARN("DEPRECATED_VARIABLE",
2696 "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
2697 }
2698
bff5da43 2699# check for DT compatible documentation
7dd05b38
FV
2700 if (defined $root &&
2701 (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
2702 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
2703
bff5da43
RH
2704 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
2705
cc93319b
FV
2706 my $dt_path = $root . "/Documentation/devicetree/bindings/";
2707 my $vp_file = $dt_path . "vendor-prefixes.txt";
2708
bff5da43
RH
2709 foreach my $compat (@compats) {
2710 my $compat2 = $compat;
185d566b
RH
2711 $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
2712 my $compat3 = $compat;
2713 $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
2714 `grep -Erq "$compat|$compat2|$compat3" $dt_path`;
bff5da43
RH
2715 if ( $? >> 8 ) {
2716 WARN("UNDOCUMENTED_DT_STRING",
2717 "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
2718 }
2719
4fbf32a6
FV
2720 next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
2721 my $vendor = $1;
cc93319b 2722 `grep -Eq "^$vendor\\b" $vp_file`;
bff5da43
RH
2723 if ( $? >> 8 ) {
2724 WARN("UNDOCUMENTED_DT_STRING",
cc93319b 2725 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
bff5da43
RH
2726 }
2727 }
2728 }
2729
5368df20 2730# check we are in a valid source file if not then ignore this hunk
de4c924c 2731 next if ($realfile !~ /\.(h|c|s|S|pl|sh|dtsi|dts)$/);
5368df20 2732
47e0c88b
JP
2733# line length limit (with some exclusions)
2734#
2735# There are a few types of lines that may extend beyond $max_line_length:
2736# logging functions like pr_info that end in a string
2737# lines with a single string
2738# #defines that are a single string
2739#
2740# There are 3 different line length message types:
2741# LONG_LINE_COMMENT a comment starts before but extends beyond $max_linelength
2742# LONG_LINE_STRING a string starts before but extends beyond $max_line_length
2743# LONG_LINE all other lines longer than $max_line_length
2744#
2745# if LONG_LINE is ignored, the other 2 types are also ignored
2746#
2747
b4749e96 2748 if ($line =~ /^\+/ && $length > $max_line_length) {
47e0c88b
JP
2749 my $msg_type = "LONG_LINE";
2750
2751 # Check the allowed long line types first
2752
2753 # logging functions that end in a string that starts
2754 # before $max_line_length
2755 if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&
2756 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
2757 $msg_type = "";
2758
2759 # lines with only strings (w/ possible termination)
2760 # #defines with only strings
2761 } elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
2762 $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {
2763 $msg_type = "";
2764
2765 # Otherwise set the alternate message types
2766
2767 # a comment starts before $max_line_length
2768 } elsif ($line =~ /($;[\s$;]*)$/ &&
2769 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
2770 $msg_type = "LONG_LINE_COMMENT"
2771
2772 # a quoted string starts before $max_line_length
2773 } elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&
2774 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
2775 $msg_type = "LONG_LINE_STRING"
2776 }
2777
2778 if ($msg_type ne "" &&
2779 (show_type("LONG_LINE") || show_type($msg_type))) {
2780 WARN($msg_type,
2781 "line over $max_line_length characters\n" . $herecurr);
2782 }
0a920b5b
AW
2783 }
2784
8905a67c
AW
2785# check for adding lines without a newline.
2786 if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
000d1cc1
JP
2787 WARN("MISSING_EOF_NEWLINE",
2788 "adding a line without newline at end of file\n" . $herecurr);
8905a67c
AW
2789 }
2790
42e41c54
MF
2791# Blackfin: use hi/lo macros
2792 if ($realfile =~ m@arch/blackfin/.*\.S$@) {
2793 if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
2794 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
2795 ERROR("LO_MACRO",
2796 "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
42e41c54
MF
2797 }
2798 if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
2799 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
2800 ERROR("HI_MACRO",
2801 "use the HI() macro, not (... >> 16)\n" . $herevet);
42e41c54
MF
2802 }
2803 }
2804
b9ea10d6 2805# check we are in a valid source file C or perl if not then ignore this hunk
de4c924c 2806 next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
0a920b5b
AW
2807
2808# at the beginning of a line any tabs must come first and anything
2809# more than 8 must use tabs.
c2fdda0d
AW
2810 if ($rawline =~ /^\+\s* \t\s*\S/ ||
2811 $rawline =~ /^\+\s* \s*/) {
2812 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
d2c0a235 2813 $rpt_cleaners = 1;
3705ce5b
JP
2814 if (ERROR("CODE_INDENT",
2815 "code indent should use tabs where possible\n" . $herevet) &&
2816 $fix) {
194f66fc 2817 $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5b 2818 }
0a920b5b
AW
2819 }
2820
08e44365
AP
2821# check for space before tabs.
2822 if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
2823 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3705ce5b
JP
2824 if (WARN("SPACE_BEFORE_TAB",
2825 "please, no space before tabs\n" . $herevet) &&
2826 $fix) {
194f66fc 2827 while ($fixed[$fixlinenr] =~
d2207ccb 2828 s/(^\+.*) {8,8}\t/$1\t\t/) {}
194f66fc 2829 while ($fixed[$fixlinenr] =~
c76f4cb3 2830 s/(^\+.*) +\t/$1\t/) {}
3705ce5b 2831 }
08e44365
AP
2832 }
2833
d1fe9c09
JP
2834# check for && or || at the start of a line
2835 if ($rawline =~ /^\+\s*(&&|\|\|)/) {
2836 CHK("LOGICAL_CONTINUATIONS",
2837 "Logical continuations should be on the previous line\n" . $hereprev);
2838 }
2839
a91e8994
JP
2840# check indentation starts on a tab stop
2841 if ($^V && $^V ge 5.10.0 &&
2842 $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$))/) {
2843 my $indent = length($1);
2844 if ($indent % 8) {
2845 if (WARN("TABSTOP",
2846 "Statements should start on a tabstop\n" . $herecurr) &&
2847 $fix) {
2848 $fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e;
2849 }
2850 }
2851 }
2852
d1fe9c09
JP
2853# check multi-line statement indentation matches previous line
2854 if ($^V && $^V ge 5.10.0 &&
91cb5195 2855 $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|$Ident\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
d1fe9c09
JP
2856 $prevline =~ /^\+(\t*)(.*)$/;
2857 my $oldindent = $1;
2858 my $rest = $2;
2859
2860 my $pos = pos_last_openparen($rest);
2861 if ($pos >= 0) {
b34a26f3
JP
2862 $line =~ /^(\+| )([ \t]*)/;
2863 my $newindent = $2;
d1fe9c09
JP
2864
2865 my $goodtabindent = $oldindent .
2866 "\t" x ($pos / 8) .
2867 " " x ($pos % 8);
2868 my $goodspaceindent = $oldindent . " " x $pos;
2869
2870 if ($newindent ne $goodtabindent &&
2871 $newindent ne $goodspaceindent) {
3705ce5b
JP
2872
2873 if (CHK("PARENTHESIS_ALIGNMENT",
2874 "Alignment should match open parenthesis\n" . $hereprev) &&
2875 $fix && $line =~ /^\+/) {
194f66fc 2876 $fixed[$fixlinenr] =~
3705ce5b
JP
2877 s/^\+[ \t]*/\+$goodtabindent/;
2878 }
d1fe9c09
JP
2879 }
2880 }
2881 }
2882
6ab3a970
JP
2883# check for space after cast like "(int) foo" or "(struct foo) bar"
2884# avoid checking a few false positives:
2885# "sizeof(<type>)" or "__alignof__(<type>)"
2886# function pointer declarations like "(*foo)(int) = bar;"
2887# structure definitions like "(struct foo) { 0 };"
2888# multiline macros that define functions
2889# known attributes or the __attribute__ keyword
2890 if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&
2891 (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {
3705ce5b 2892 if (CHK("SPACING",
f27c95db 2893 "No space is necessary after a cast\n" . $herecurr) &&
3705ce5b 2894 $fix) {
194f66fc 2895 $fixed[$fixlinenr] =~
f27c95db 2896 s/(\(\s*$Type\s*\))[ \t]+/$1/;
3705ce5b 2897 }
aad4f614
JP
2898 }
2899
86406b1c
JP
2900# Block comment styles
2901# Networking with an initial /*
05880600 2902 if ($realfile =~ m@^(drivers/net/|net/)@ &&
fdb4bcd6 2903 $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
85ad978c
JP
2904 $rawline =~ /^\+[ \t]*\*/ &&
2905 $realline > 2) {
05880600
JP
2906 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
2907 "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
2908 }
2909
86406b1c
JP
2910# Block comments use * on subsequent lines
2911 if ($prevline =~ /$;[ \t]*$/ && #ends in comment
2912 $prevrawline =~ /^\+.*?\/\*/ && #starting /*
a605e32e 2913 $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */
61135e96 2914 $rawline =~ /^\+/ && #line is new
a605e32e 2915 $rawline !~ /^\+[ \t]*\*/) { #no leading *
86406b1c
JP
2916 WARN("BLOCK_COMMENT_STYLE",
2917 "Block comments use * on subsequent lines\n" . $hereprev);
a605e32e
JP
2918 }
2919
86406b1c
JP
2920# Block comments use */ on trailing lines
2921 if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */
c24f9f19
JP
2922 $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/
2923 $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/
2924 $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */
86406b1c
JP
2925 WARN("BLOCK_COMMENT_STYLE",
2926 "Block comments use a trailing */ on a separate line\n" . $herecurr);
05880600
JP
2927 }
2928
7f619191
JP
2929# check for missing blank lines after struct/union declarations
2930# with exceptions for various attributes and macros
2931 if ($prevline =~ /^[\+ ]};?\s*$/ &&
2932 $line =~ /^\+/ &&
2933 !($line =~ /^\+\s*$/ ||
2934 $line =~ /^\+\s*EXPORT_SYMBOL/ ||
2935 $line =~ /^\+\s*MODULE_/i ||
2936 $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
2937 $line =~ /^\+[a-z_]*init/ ||
2938 $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
2939 $line =~ /^\+\s*DECLARE/ ||
2940 $line =~ /^\+\s*__setup/)) {
d752fcc8
JP
2941 if (CHK("LINE_SPACING",
2942 "Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&
2943 $fix) {
f2d7e4d4 2944 fix_insert_line($fixlinenr, "\+");
d752fcc8 2945 }
7f619191
JP
2946 }
2947
365dd4ea
JP
2948# check for multiple consecutive blank lines
2949 if ($prevline =~ /^[\+ ]\s*$/ &&
2950 $line =~ /^\+\s*$/ &&
2951 $last_blank_line != ($linenr - 1)) {
d752fcc8
JP
2952 if (CHK("LINE_SPACING",
2953 "Please don't use multiple blank lines\n" . $hereprev) &&
2954 $fix) {
f2d7e4d4 2955 fix_delete_line($fixlinenr, $rawline);
d752fcc8
JP
2956 }
2957
365dd4ea
JP
2958 $last_blank_line = $linenr;
2959 }
2960
3b617e3b 2961# check for missing blank lines after declarations
3f7bac03
JP
2962 if ($sline =~ /^\+\s+\S/ && #Not at char 1
2963 # actual declarations
2964 ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd3
JP
2965 # function pointer declarations
2966 $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac03
JP
2967 # foo bar; where foo is some local typedef or #define
2968 $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
2969 # known declaration macros
2970 $prevline =~ /^\+\s+$declaration_macros/) &&
2971 # for "else if" which can look like "$Ident $Ident"
2972 !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
2973 # other possible extensions of declaration lines
2974 $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
2975 # not starting a section or a macro "\" extended line
2976 $prevline =~ /(?:\{\s*|\\)$/) &&
2977 # looks like a declaration
2978 !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd3
JP
2979 # function pointer declarations
2980 $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac03
JP
2981 # foo bar; where foo is some local typedef or #define
2982 $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
2983 # known declaration macros
2984 $sline =~ /^\+\s+$declaration_macros/ ||
2985 # start of struct or union or enum
3b617e3b 2986 $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||
3f7bac03
JP
2987 # start or end of block or continuation of declaration
2988 $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
2989 # bitfield continuation
2990 $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
2991 # other possible extensions of declaration lines
2992 $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
2993 # indentation of previous and current line are the same
2994 (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
d752fcc8
JP
2995 if (WARN("LINE_SPACING",
2996 "Missing a blank line after declarations\n" . $hereprev) &&
2997 $fix) {
f2d7e4d4 2998 fix_insert_line($fixlinenr, "\+");
d752fcc8 2999 }
3b617e3b
JP
3000 }
3001
5f7ddae6 3002# check for spaces at the beginning of a line.
6b4c5beb
AW
3003# Exceptions:
3004# 1) within comments
3005# 2) indented preprocessor commands
3006# 3) hanging labels
3705ce5b 3007 if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) {
5f7ddae6 3008 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3705ce5b
JP
3009 if (WARN("LEADING_SPACE",
3010 "please, no spaces at the start of a line\n" . $herevet) &&
3011 $fix) {
194f66fc 3012 $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5b 3013 }
5f7ddae6
RR
3014 }
3015
b9ea10d6
AW
3016# check we are in a valid C source file if not then ignore this hunk
3017 next if ($realfile !~ /\.(h|c)$/);
3018
032a4c0f 3019# check indentation of any line with a bare else
840080a0 3020# (but not if it is a multiple line "if (foo) return bar; else return baz;")
032a4c0f
JP
3021# if the previous line is a break or return and is indented 1 tab more...
3022 if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
3023 my $tabs = length($1) + 1;
840080a0
JP
3024 if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ ||
3025 ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ &&
3026 defined $lines[$linenr] &&
3027 $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) {
032a4c0f
JP
3028 WARN("UNNECESSARY_ELSE",
3029 "else is not generally useful after a break or return\n" . $hereprev);
3030 }
3031 }
3032
c00df19a
JP
3033# check indentation of a line with a break;
3034# if the previous line is a goto or return and is indented the same # of tabs
3035 if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
3036 my $tabs = $1;
3037 if ($prevline =~ /^\+$tabs(?:goto|return)\b/) {
3038 WARN("UNNECESSARY_BREAK",
3039 "break is not useful after a goto or return\n" . $hereprev);
3040 }
3041 }
3042
1ba8dfd1
KC
3043# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
3044 if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
3045 WARN("CONFIG_EXPERIMENTAL",
3046 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
3047 }
3048
c2fdda0d 3049# check for RCS/CVS revision markers
cf655043 3050 if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
000d1cc1
JP
3051 WARN("CVS_KEYWORD",
3052 "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
c2fdda0d 3053 }
22f2a2ef 3054
42e41c54
MF
3055# Blackfin: don't use __builtin_bfin_[cs]sync
3056 if ($line =~ /__builtin_bfin_csync/) {
3057 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
3058 ERROR("CSYNC",
3059 "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
42e41c54
MF
3060 }
3061 if ($line =~ /__builtin_bfin_ssync/) {
3062 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
3063 ERROR("SSYNC",
3064 "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
42e41c54
MF
3065 }
3066
56e77d70
JP
3067# check for old HOTPLUG __dev<foo> section markings
3068 if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
3069 WARN("HOTPLUG_SECTION",
3070 "Using $1 is unnecessary\n" . $herecurr);
3071 }
3072
9c0ca6f9 3073# Check for potential 'bare' types
2b474a1a
AW
3074 my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
3075 $realline_next);
3e469cdc
AW
3076#print "LINE<$line>\n";
3077 if ($linenr >= $suppress_statement &&
1b5539b1 3078 $realcnt && $sline =~ /.\s*\S/) {
170d3a22 3079 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd 3080 ctx_statement_block($linenr, $realcnt, 0);
171ae1a4
AW
3081 $stat =~ s/\n./\n /g;
3082 $cond =~ s/\n./\n /g;
3083
3e469cdc
AW
3084#print "linenr<$linenr> <$stat>\n";
3085 # If this statement has no statement boundaries within
3086 # it there is no point in retrying a statement scan
3087 # until we hit end of it.
3088 my $frag = $stat; $frag =~ s/;+\s*$//;
3089 if ($frag !~ /(?:{|;)/) {
3090#print "skip<$line_nr_next>\n";
3091 $suppress_statement = $line_nr_next;
3092 }
f74bd194 3093
2b474a1a
AW
3094 # Find the real next line.
3095 $realline_next = $line_nr_next;
3096 if (defined $realline_next &&
3097 (!defined $lines[$realline_next - 1] ||
3098 substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
3099 $realline_next++;
3100 }
3101
171ae1a4
AW
3102 my $s = $stat;
3103 $s =~ s/{.*$//s;
cf655043 3104
c2fdda0d 3105 # Ignore goto labels.
171ae1a4 3106 if ($s =~ /$Ident:\*$/s) {
c2fdda0d
AW
3107
3108 # Ignore functions being called
171ae1a4 3109 } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0d 3110
463f2864
AW
3111 } elsif ($s =~ /^.\s*else\b/s) {
3112
c45dcabd 3113 # declarations always start with types
d2506586 3114 } 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
3115 my $type = $1;
3116 $type =~ s/\s+/ /g;
3117 possible($type, "A:" . $s);
3118
8905a67c 3119 # definitions in global scope can only start with types
a6a84062 3120 } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd 3121 possible($1, "B:" . $s);
c2fdda0d 3122 }
8905a67c
AW
3123
3124 # any (foo ... *) is a pointer cast, and foo is a type
65863862 3125 while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd 3126 possible($1, "C:" . $s);
8905a67c
AW
3127 }
3128
3129 # Check for any sort of function declaration.
3130 # int foo(something bar, other baz);
3131 # void (*store_gdt)(x86_descr_ptr *);
171ae1a4 3132 if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
8905a67c 3133 my ($name_len) = length($1);
8905a67c 3134
cf655043 3135 my $ctx = $s;
773647a0 3136 substr($ctx, 0, $name_len + 1, '');
8905a67c 3137 $ctx =~ s/\)[^\)]*$//;
cf655043 3138
8905a67c 3139 for my $arg (split(/\s*,\s*/, $ctx)) {
c45dcabd 3140 if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
8905a67c 3141
c45dcabd 3142 possible($1, "D:" . $s);
8905a67c
AW
3143 }
3144 }
9c0ca6f9 3145 }
8905a67c 3146
9c0ca6f9
AW
3147 }
3148
653d4876
AW
3149#
3150# Checks which may be anchored in the context.
3151#
00df344f 3152
653d4876
AW
3153# Check for switch () and associated case and default
3154# statements should be at the same indent.
00df344f
AW
3155 if ($line=~/\bswitch\s*\(.*\)/) {
3156 my $err = '';
3157 my $sep = '';
3158 my @ctx = ctx_block_outer($linenr, $realcnt);
3159 shift(@ctx);
3160 for my $ctx (@ctx) {
3161 my ($clen, $cindent) = line_stats($ctx);
3162 if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
3163 $indent != $cindent) {
3164 $err .= "$sep$ctx\n";
3165 $sep = '';
3166 } else {
3167 $sep = "[...]\n";
3168 }
3169 }
3170 if ($err ne '') {
000d1cc1
JP
3171 ERROR("SWITCH_CASE_INDENT_LEVEL",
3172 "switch and case should be at the same indent\n$hereline$err");
de7d4f0e
AW
3173 }
3174 }
3175
3176# if/while/etc brace do not go on next line, unless defining a do while loop,
3177# or if that brace on the next line is for something else
0fe3dc2b 3178 if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
773647a0
AW
3179 my $pre_ctx = "$1$2";
3180
9c0ca6f9 3181 my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
8eef05dd
JP
3182
3183 if ($line =~ /^\+\t{6,}/) {
3184 WARN("DEEP_INDENTATION",
3185 "Too many leading tabs - consider code refactoring\n" . $herecurr);
3186 }
3187
de7d4f0e
AW
3188 my $ctx_cnt = $realcnt - $#ctx - 1;
3189 my $ctx = join("\n", @ctx);
3190
548596d5
AW
3191 my $ctx_ln = $linenr;
3192 my $ctx_skip = $realcnt;
773647a0 3193
548596d5
AW
3194 while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
3195 defined $lines[$ctx_ln - 1] &&
3196 $lines[$ctx_ln - 1] =~ /^-/)) {
3197 ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
3198 $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
de7d4f0e 3199 $ctx_ln++;
de7d4f0e 3200 }
548596d5 3201
53210168
AW
3202 #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
3203 #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
de7d4f0e 3204
d752fcc8 3205 if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
000d1cc1
JP
3206 ERROR("OPEN_BRACE",
3207 "that open brace { should be on the previous line\n" .
01464f30 3208 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
00df344f 3209 }
773647a0
AW
3210 if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
3211 $ctx =~ /\)\s*\;\s*$/ &&
3212 defined $lines[$ctx_ln - 1])
3213 {
9c0ca6f9
AW
3214 my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
3215 if ($nindent > $indent) {
000d1cc1
JP
3216 WARN("TRAILING_SEMICOLON",
3217 "trailing semicolon indicates no statements, indent implies otherwise\n" .
01464f30 3218 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
9c0ca6f9
AW
3219 }
3220 }
00df344f
AW
3221 }
3222
4d001e4d 3223# Check relative indent for conditionals and blocks.
0fe3dc2b 3224 if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
3e469cdc
AW
3225 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3226 ctx_statement_block($linenr, $realcnt, 0)
3227 if (!defined $stat);
4d001e4d
AW
3228 my ($s, $c) = ($stat, $cond);
3229
3230 substr($s, 0, length($c), '');
3231
9f5af480
JP
3232 # remove inline comments
3233 $s =~ s/$;/ /g;
3234 $c =~ s/$;/ /g;
4d001e4d
AW
3235
3236 # Find out how long the conditional actually is.
6f779c18
AW
3237 my @newlines = ($c =~ /\n/gs);
3238 my $cond_lines = 1 + $#newlines;
4d001e4d 3239
9f5af480
JP
3240 # Make sure we remove the line prefixes as we have
3241 # none on the first line, and are going to readd them
3242 # where necessary.
3243 $s =~ s/\n./\n/gs;
3244 while ($s =~ /\n\s+\\\n/) {
3245 $cond_lines += $s =~ s/\n\s+\\\n/\n/g;
3246 }
3247
4d001e4d
AW
3248 # We want to check the first line inside the block
3249 # starting at the end of the conditional, so remove:
3250 # 1) any blank line termination
3251 # 2) any opening brace { on end of the line
3252 # 3) any do (...) {
3253 my $continuation = 0;
3254 my $check = 0;
3255 $s =~ s/^.*\bdo\b//;
3256 $s =~ s/^\s*{//;
3257 if ($s =~ s/^\s*\\//) {
3258 $continuation = 1;
3259 }
9bd49efe 3260 if ($s =~ s/^\s*?\n//) {
4d001e4d
AW
3261 $check = 1;
3262 $cond_lines++;
3263 }
3264
3265 # Also ignore a loop construct at the end of a
3266 # preprocessor statement.
3267 if (($prevline =~ /^.\s*#\s*define\s/ ||
3268 $prevline =~ /\\\s*$/) && $continuation == 0) {
3269 $check = 0;
3270 }
3271
9bd49efe 3272 my $cond_ptr = -1;
740504c6 3273 $continuation = 0;
9bd49efe
AW
3274 while ($cond_ptr != $cond_lines) {
3275 $cond_ptr = $cond_lines;
3276
f16fa28f
AW
3277 # If we see an #else/#elif then the code
3278 # is not linear.
3279 if ($s =~ /^\s*\#\s*(?:else|elif)/) {
3280 $check = 0;
3281 }
3282
9bd49efe
AW
3283 # Ignore:
3284 # 1) blank lines, they should be at 0,
3285 # 2) preprocessor lines, and
3286 # 3) labels.
740504c6
AW
3287 if ($continuation ||
3288 $s =~ /^\s*?\n/ ||
9bd49efe
AW
3289 $s =~ /^\s*#\s*?/ ||
3290 $s =~ /^\s*$Ident\s*:/) {
740504c6 3291 $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
30dad6eb
AW
3292 if ($s =~ s/^.*?\n//) {
3293 $cond_lines++;
3294 }
9bd49efe 3295 }
4d001e4d
AW
3296 }
3297
3298 my (undef, $sindent) = line_stats("+" . $s);
3299 my $stat_real = raw_line($linenr, $cond_lines);
3300
3301 # Check if either of these lines are modified, else
3302 # this is not this patch's fault.
3303 if (!defined($stat_real) ||
3304 $stat !~ /^\+/ && $stat_real !~ /^\+/) {
3305 $check = 0;
3306 }
3307 if (defined($stat_real) && $cond_lines > 1) {
3308 $stat_real = "[...]\n$stat_real";
3309 }
3310
9bd49efe 3311 #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 3312
9f5af480
JP
3313 if ($check && $s ne '' &&
3314 (($sindent % 8) != 0 ||
3315 ($sindent < $indent) ||
3316 ($sindent > $indent + 8))) {
000d1cc1
JP
3317 WARN("SUSPECT_CODE_INDENT",
3318 "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
4d001e4d
AW
3319 }
3320 }
3321
6c72ffaa
AW
3322 # Track the 'values' across context and added lines.
3323 my $opline = $line; $opline =~ s/^./ /;
1f65f947
AW
3324 my ($curr_values, $curr_vars) =
3325 annotate_values($opline . "\n", $prev_values);
6c72ffaa 3326 $curr_values = $prev_values . $curr_values;
c2fdda0d
AW
3327 if ($dbg_values) {
3328 my $outline = $opline; $outline =~ s/\t/ /g;
cf655043
AW
3329 print "$linenr > .$outline\n";
3330 print "$linenr > $curr_values\n";
1f65f947 3331 print "$linenr > $curr_vars\n";
c2fdda0d 3332 }
6c72ffaa
AW
3333 $prev_values = substr($curr_values, -1);
3334
00df344f 3335#ignore lines not being added
3705ce5b 3336 next if ($line =~ /^[^\+]/);
00df344f 3337
a1ce18e4 3338# check for declarations of signed or unsigned without int
207a8e84 3339 while ($line =~ m{($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
a1ce18e4
JP
3340 my $type = $1;
3341 my $var = $2;
207a8e84
JP
3342 $var = "" if (!defined $var);
3343 if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
a1ce18e4
JP
3344 my $sign = $1;
3345 my $pointer = $2;
3346
3347 $pointer = "" if (!defined $pointer);
3348
3349 if (WARN("UNSPECIFIED_INT",
3350 "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) &&
3351 $fix) {
3352 my $decl = trim($sign) . " int ";
207a8e84
JP
3353 my $comp_pointer = $pointer;
3354 $comp_pointer =~ s/\s//g;
3355 $decl .= $comp_pointer;
3356 $decl = rtrim($decl) if ($var eq "");
3357 $fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;
a1ce18e4
JP
3358 }
3359 }
3360 }
3361
653d4876 3362# TEST: allow direct testing of the type matcher.
7429c690
AW
3363 if ($dbg_type) {
3364 if ($line =~ /^.\s*$Declare\s*$/) {
000d1cc1
JP
3365 ERROR("TEST_TYPE",
3366 "TEST: is type\n" . $herecurr);
7429c690 3367 } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
000d1cc1
JP
3368 ERROR("TEST_NOT_TYPE",
3369 "TEST: is not type ($1 is)\n". $herecurr);
7429c690 3370 }
653d4876
AW
3371 next;
3372 }
a1ef277e
AW
3373# TEST: allow direct testing of the attribute matcher.
3374 if ($dbg_attr) {
9360b0e5 3375 if ($line =~ /^.\s*$Modifier\s*$/) {
000d1cc1
JP
3376 ERROR("TEST_ATTR",
3377 "TEST: is attr\n" . $herecurr);
9360b0e5 3378 } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
000d1cc1
JP
3379 ERROR("TEST_NOT_ATTR",
3380 "TEST: is not attr ($1 is)\n". $herecurr);
a1ef277e
AW
3381 }
3382 next;
3383 }
653d4876 3384
f0a594c1 3385# check for initialisation to aggregates open brace on the next line
99423c20
AW
3386 if ($line =~ /^.\s*{/ &&
3387 $prevline =~ /(?:^|[^=])=\s*$/) {
d752fcc8
JP
3388 if (ERROR("OPEN_BRACE",
3389 "that open brace { should be on the previous line\n" . $hereprev) &&
f2d7e4d4
JP
3390 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
3391 fix_delete_line($fixlinenr - 1, $prevrawline);
3392 fix_delete_line($fixlinenr, $rawline);
d752fcc8
JP
3393 my $fixedline = $prevrawline;
3394 $fixedline =~ s/\s*=\s*$/ = {/;
f2d7e4d4 3395 fix_insert_line($fixlinenr, $fixedline);
d752fcc8
JP
3396 $fixedline = $line;
3397 $fixedline =~ s/^(.\s*){\s*/$1/;
f2d7e4d4 3398 fix_insert_line($fixlinenr, $fixedline);
d752fcc8 3399 }
f0a594c1
AW
3400 }
3401
653d4876
AW
3402#
3403# Checks which are anchored on the added line.
3404#
3405
3406# check for malformed paths in #include statements (uses RAW line)
c45dcabd 3407 if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876
AW
3408 my $path = $1;
3409 if ($path =~ m{//}) {
000d1cc1 3410 ERROR("MALFORMED_INCLUDE",
495e9d84
JP
3411 "malformed #include filename\n" . $herecurr);
3412 }
3413 if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
3414 ERROR("UAPI_INCLUDE",
3415 "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
653d4876 3416 }
653d4876 3417 }
00df344f 3418
0a920b5b 3419# no C99 // comments
00df344f 3420 if ($line =~ m{//}) {
3705ce5b
JP
3421 if (ERROR("C99_COMMENTS",
3422 "do not use C99 // comments\n" . $herecurr) &&
3423 $fix) {
194f66fc 3424 my $line = $fixed[$fixlinenr];
3705ce5b
JP
3425 if ($line =~ /\/\/(.*)$/) {
3426 my $comment = trim($1);
194f66fc 3427 $fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
3705ce5b
JP
3428 }
3429 }
0a920b5b 3430 }
00df344f 3431 # Remove C99 comments.
0a920b5b 3432 $line =~ s@//.*@@;
6c72ffaa 3433 $opline =~ s@//.*@@;
0a920b5b 3434
2b474a1a
AW
3435# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
3436# the whole statement.
3437#print "APW <$lines[$realline_next - 1]>\n";
3438 if (defined $realline_next &&
3439 exists $lines[$realline_next - 1] &&
3440 !defined $suppress_export{$realline_next} &&
3441 ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
3442 $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3cbf62df
AW
3443 # Handle definitions which produce identifiers with
3444 # a prefix:
3445 # XXX(foo);
3446 # EXPORT_SYMBOL(something_foo);
653d4876 3447 my $name = $1;
87a53877 3448 if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3cbf62df
AW
3449 $name =~ /^${Ident}_$2/) {
3450#print "FOO C name<$name>\n";
3451 $suppress_export{$realline_next} = 1;
3452
3453 } elsif ($stat !~ /(?:
2b474a1a 3454 \n.}\s*$|
48012058
AW
3455 ^.DEFINE_$Ident\(\Q$name\E\)|
3456 ^.DECLARE_$Ident\(\Q$name\E\)|
3457 ^.LIST_HEAD\(\Q$name\E\)|
2b474a1a
AW
3458 ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
3459 \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
48012058 3460 )/x) {
2b474a1a
AW
3461#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
3462 $suppress_export{$realline_next} = 2;
3463 } else {
3464 $suppress_export{$realline_next} = 1;
0a920b5b
AW
3465 }
3466 }
2b474a1a
AW
3467 if (!defined $suppress_export{$linenr} &&
3468 $prevline =~ /^.\s*$/ &&
3469 ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
3470 $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3471#print "FOO B <$lines[$linenr - 1]>\n";
3472 $suppress_export{$linenr} = 2;
3473 }
3474 if (defined $suppress_export{$linenr} &&
3475 $suppress_export{$linenr} == 2) {
000d1cc1
JP
3476 WARN("EXPORT_SYMBOL",
3477 "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
2b474a1a 3478 }
0a920b5b 3479
5150bda4 3480# check for global initialisers.
6d32f7a3 3481 if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) {
d5e616fc 3482 if (ERROR("GLOBAL_INITIALISERS",
6d32f7a3 3483 "do not initialise globals to $1\n" . $herecurr) &&
d5e616fc 3484 $fix) {
6d32f7a3 3485 $fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
d5e616fc 3486 }
f0a594c1 3487 }
653d4876 3488# check for static initialisers.
6d32f7a3 3489 if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
d5e616fc 3490 if (ERROR("INITIALISED_STATIC",
6d32f7a3 3491 "do not initialise statics to $1\n" .
d5e616fc
JP
3492 $herecurr) &&
3493 $fix) {
6d32f7a3 3494 $fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
d5e616fc 3495 }
0a920b5b
AW
3496 }
3497
1813087d
JP
3498# check for misordered declarations of char/short/int/long with signed/unsigned
3499 while ($sline =~ m{(\b$TypeMisordered\b)}g) {
3500 my $tmp = trim($1);
3501 WARN("MISORDERED_TYPE",
3502 "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr);
3503 }
3504
cb710eca
JP
3505# check for static const char * arrays.
3506 if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
000d1cc1
JP
3507 WARN("STATIC_CONST_CHAR_ARRAY",
3508 "static const char * array should probably be static const char * const\n" .
cb710eca
JP
3509 $herecurr);
3510 }
3511
3512# check for static char foo[] = "bar" declarations.
3513 if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
000d1cc1
JP
3514 WARN("STATIC_CONST_CHAR_ARRAY",
3515 "static char array declaration should probably be static const char\n" .
cb710eca
JP
3516 $herecurr);
3517 }
3518
ab7e23f3
JP
3519# check for const <foo> const where <foo> is not a pointer or array type
3520 if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
3521 my $found = $1;
3522 if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {
3523 WARN("CONST_CONST",
3524 "'const $found const *' should probably be 'const $found * const'\n" . $herecurr);
3525 } elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {
3526 WARN("CONST_CONST",
3527 "'const $found const' should probably be 'const $found'\n" . $herecurr);
3528 }
3529 }
3530
9b0fa60d
JP
3531# check for non-global char *foo[] = {"bar", ...} declarations.
3532 if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
3533 WARN("STATIC_CONST_CHAR_ARRAY",
3534 "char * array declaration might be better as static const\n" .
3535 $herecurr);
3536 }
3537
b598b670
JP
3538# check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo)
3539 if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {
3540 my $array = $1;
3541 if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {
3542 my $array_div = $1;
3543 if (WARN("ARRAY_SIZE",
3544 "Prefer ARRAY_SIZE($array)\n" . $herecurr) &&
3545 $fix) {
3546 $fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;
3547 }
3548 }
3549 }
3550
b36190c5
JP
3551# check for function declarations without arguments like "int foo()"
3552 if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
3553 if (ERROR("FUNCTION_WITHOUT_ARGS",
3554 "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
3555 $fix) {
194f66fc 3556 $fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
b36190c5
JP
3557 }
3558 }
3559
92e112fd
JP
3560# check for uses of DEFINE_PCI_DEVICE_TABLE
3561 if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) {
3562 if (WARN("DEFINE_PCI_DEVICE_TABLE",
3563 "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) &&
3564 $fix) {
194f66fc 3565 $fixed[$fixlinenr] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /;
92e112fd 3566 }
93ed0e2d
JP
3567 }
3568
653d4876
AW
3569# check for new typedefs, only function parameters and sparse annotations
3570# make sense.
3571 if ($line =~ /\btypedef\s/ &&
8054576d 3572 $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd 3573 $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad 3574 $line !~ /\b$typeTypedefs\b/ &&
653d4876 3575 $line !~ /\b__bitwise(?:__|)\b/) {
000d1cc1
JP
3576 WARN("NEW_TYPEDEFS",
3577 "do not add new typedefs\n" . $herecurr);
0a920b5b
AW
3578 }
3579
3580# * goes on variable not on type
65863862 3581 # (char*[ const])
bfcb2cc7
AW
3582 while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
3583 #print "AA<$1>\n";
3705ce5b 3584 my ($ident, $from, $to) = ($1, $2, $2);
65863862
AW
3585
3586 # Should start with a space.
3587 $to =~ s/^(\S)/ $1/;
3588 # Should not end with a space.
3589 $to =~ s/\s+$//;
3590 # '*'s should not have spaces between.
f9a0b3d1 3591 while ($to =~ s/\*\s+\*/\*\*/) {
65863862 3592 }
d8aaf121 3593
3705ce5b 3594## print "1: from<$from> to<$to> ident<$ident>\n";
65863862 3595 if ($from ne $to) {
3705ce5b
JP
3596 if (ERROR("POINTER_LOCATION",
3597 "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) &&
3598 $fix) {
3599 my $sub_from = $ident;
3600 my $sub_to = $ident;
3601 $sub_to =~ s/\Q$from\E/$to/;
194f66fc 3602 $fixed[$fixlinenr] =~
3705ce5b
JP
3603 s@\Q$sub_from\E@$sub_to@;
3604 }
65863862 3605 }
bfcb2cc7
AW
3606 }
3607 while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
3608 #print "BB<$1>\n";
3705ce5b 3609 my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
65863862
AW
3610
3611 # Should start with a space.
3612 $to =~ s/^(\S)/ $1/;
3613 # Should not end with a space.
3614 $to =~ s/\s+$//;
3615 # '*'s should not have spaces between.
f9a0b3d1 3616 while ($to =~ s/\*\s+\*/\*\*/) {
65863862
AW
3617 }
3618 # Modifiers should have spaces.
3619 $to =~ s/(\b$Modifier$)/$1 /;
d8aaf121 3620
3705ce5b 3621## print "2: from<$from> to<$to> ident<$ident>\n";
667026e7 3622 if ($from ne $to && $ident !~ /^$Modifier$/) {
3705ce5b
JP
3623 if (ERROR("POINTER_LOCATION",
3624 "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) &&
3625 $fix) {
3626
3627 my $sub_from = $match;
3628 my $sub_to = $match;
3629 $sub_to =~ s/\Q$from\E/$to/;
194f66fc 3630 $fixed[$fixlinenr] =~
3705ce5b
JP
3631 s@\Q$sub_from\E@$sub_to@;
3632 }
65863862 3633 }
0a920b5b
AW
3634 }
3635
9d3e3c70
JP
3636# avoid BUG() or BUG_ON()
3637 if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
3638 my $msg_type = \&WARN;
3639 $msg_type = \&CHK if ($file);
3640 &{$msg_type}("AVOID_BUG",
3641 "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr);
3642 }
0a920b5b 3643
9d3e3c70 3644# avoid LINUX_VERSION_CODE
8905a67c 3645 if ($line =~ /\bLINUX_VERSION_CODE\b/) {
000d1cc1
JP
3646 WARN("LINUX_VERSION_CODE",
3647 "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
8905a67c
AW
3648 }
3649
17441227
JP
3650# check for uses of printk_ratelimit
3651 if ($line =~ /\bprintk_ratelimit\s*\(/) {
000d1cc1 3652 WARN("PRINTK_RATELIMITED",
101ee680 3653 "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
17441227
JP
3654 }
3655
00df344f
AW
3656# printk should use KERN_* levels. Note that follow on printk's on the
3657# same line do not need a level, so we use the current block context
3658# to try and find and validate the current printk. In summary the current
25985edc 3659# printk includes all preceding printk's which have no newline on the end.
00df344f 3660# we assume the first bad printk is the one to report.
f0a594c1 3661 if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344f
AW
3662 my $ok = 0;
3663 for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
3664 #print "CHECK<$lines[$ln - 1]\n";
25985edc 3665 # we have a preceding printk if it ends
00df344f
AW
3666 # with "\n" ignore it, else it is to blame
3667 if ($lines[$ln - 1] =~ m{\bprintk\(}) {
3668 if ($rawlines[$ln - 1] !~ m{\\n"}) {
3669 $ok = 1;
3670 }
3671 last;
3672 }
3673 }
3674 if ($ok == 0) {
000d1cc1
JP
3675 WARN("PRINTK_WITHOUT_KERN_LEVEL",
3676 "printk() should include KERN_ facility level\n" . $herecurr);
00df344f 3677 }
0a920b5b
AW
3678 }
3679
243f3803
JP
3680 if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
3681 my $orig = $1;
3682 my $level = lc($orig);
3683 $level = "warn" if ($level eq "warning");
8f26b837
JP
3684 my $level2 = $level;
3685 $level2 = "dbg" if ($level eq "debug");
243f3803 3686 WARN("PREFER_PR_LEVEL",
daa8b059 3687 "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr);
243f3803
JP
3688 }
3689
3690 if ($line =~ /\bpr_warning\s*\(/) {
d5e616fc
JP
3691 if (WARN("PREFER_PR_LEVEL",
3692 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
3693 $fix) {
194f66fc 3694 $fixed[$fixlinenr] =~
d5e616fc
JP
3695 s/\bpr_warning\b/pr_warn/;
3696 }
243f3803
JP
3697 }
3698
dc139313
JP
3699 if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
3700 my $orig = $1;
3701 my $level = lc($orig);
3702 $level = "warn" if ($level eq "warning");
3703 $level = "dbg" if ($level eq "debug");
3704 WARN("PREFER_DEV_LEVEL",
3705 "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
3706 }
3707
91c9afaf
AL
3708# ENOSYS means "bad syscall nr" and nothing else. This will have a small
3709# number of false positives, but assembly files are not checked, so at
3710# least the arch entry code will not trigger this warning.
3711 if ($line =~ /\bENOSYS\b/) {
3712 WARN("ENOSYS",
3713 "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr);
3714 }
3715
653d4876
AW
3716# function brace can't be on same line, except for #defines of do while,
3717# or if closed on same line
8d182478 3718 if (($line=~/$Type\s*$Ident\(.*\).*\s*{/) and
4e5d56bd 3719 !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) {
8d182478
JP
3720 if (ERROR("OPEN_BRACE",
3721 "open brace '{' following function declarations go on the next line\n" . $herecurr) &&
3722 $fix) {
3723 fix_delete_line($fixlinenr, $rawline);
3724 my $fixed_line = $rawline;
3725 $fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/;
3726 my $line1 = $1;
3727 my $line2 = $2;
3728 fix_insert_line($fixlinenr, ltrim($line1));
3729 fix_insert_line($fixlinenr, "\+{");
3730 if ($line2 !~ /^\s*$/) {
3731 fix_insert_line($fixlinenr, "\+\t" . trim($line2));
3732 }
3733 }
0a920b5b 3734 }
653d4876 3735
8905a67c
AW
3736# open braces for enum, union and struct go on the same line.
3737 if ($line =~ /^.\s*{/ &&
3738 $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
8d182478
JP
3739 if (ERROR("OPEN_BRACE",
3740 "open brace '{' following $1 go on the same line\n" . $hereprev) &&
3741 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
3742 fix_delete_line($fixlinenr - 1, $prevrawline);
3743 fix_delete_line($fixlinenr, $rawline);
3744 my $fixedline = rtrim($prevrawline) . " {";
3745 fix_insert_line($fixlinenr, $fixedline);
3746 $fixedline = $rawline;
3747 $fixedline =~ s/^(.\s*){\s*/$1\t/;
3748 if ($fixedline !~ /^\+\s*$/) {
3749 fix_insert_line($fixlinenr, $fixedline);
3750 }
3751 }
8905a67c
AW
3752 }
3753
0c73b4eb 3754# missing space after union, struct or enum definition
3705ce5b
JP
3755 if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
3756 if (WARN("SPACING",
3757 "missing space after $1 definition\n" . $herecurr) &&
3758 $fix) {
194f66fc 3759 $fixed[$fixlinenr] =~
3705ce5b
JP
3760 s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
3761 }
0c73b4eb
AW
3762 }
3763
31070b5d
JP
3764# Function pointer declarations
3765# check spacing between type, funcptr, and args
3766# canonical declaration is "type (*funcptr)(args...)"
91f72e9c 3767 if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
31070b5d
JP
3768 my $declare = $1;
3769 my $pre_pointer_space = $2;
3770 my $post_pointer_space = $3;
3771 my $funcname = $4;
3772 my $post_funcname_space = $5;
3773 my $pre_args_space = $6;
3774
91f72e9c
JP
3775# the $Declare variable will capture all spaces after the type
3776# so check it for a missing trailing missing space but pointer return types
3777# don't need a space so don't warn for those.
3778 my $post_declare_space = "";
3779 if ($declare =~ /(\s+)$/) {
3780 $post_declare_space = $1;
3781 $declare = rtrim($declare);
3782 }
3783 if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
31070b5d
JP
3784 WARN("SPACING",
3785 "missing space after return type\n" . $herecurr);
91f72e9c 3786 $post_declare_space = " ";
31070b5d
JP
3787 }
3788
3789# unnecessary space "type (*funcptr)(args...)"
91f72e9c
JP
3790# This test is not currently implemented because these declarations are
3791# equivalent to
3792# int foo(int bar, ...)
3793# and this is form shouldn't/doesn't generate a checkpatch warning.
3794#
3795# elsif ($declare =~ /\s{2,}$/) {
3796# WARN("SPACING",
3797# "Multiple spaces after return type\n" . $herecurr);
3798# }
31070b5d
JP
3799
3800# unnecessary space "type ( *funcptr)(args...)"
3801 if (defined $pre_pointer_space &&
3802 $pre_pointer_space =~ /^\s/) {
3803 WARN("SPACING",
3804 "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
3805 }
3806
3807# unnecessary space "type (* funcptr)(args...)"
3808 if (defined $post_pointer_space &&
3809 $post_pointer_space =~ /^\s/) {
3810 WARN("SPACING",
3811 "Unnecessary space before function pointer name\n" . $herecurr);
3812 }
3813
3814# unnecessary space "type (*funcptr )(args...)"
3815 if (defined $post_funcname_space &&
3816 $post_funcname_space =~ /^\s/) {
3817 WARN("SPACING",
3818 "Unnecessary space after function pointer name\n" . $herecurr);
3819 }
3820
3821# unnecessary space "type (*funcptr) (args...)"
3822 if (defined $pre_args_space &&
3823 $pre_args_space =~ /^\s/) {
3824 WARN("SPACING",
3825 "Unnecessary space before function pointer arguments\n" . $herecurr);
3826 }
3827
3828 if (show_type("SPACING") && $fix) {
194f66fc 3829 $fixed[$fixlinenr] =~
91f72e9c 3830 s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
31070b5d
JP
3831 }
3832 }
3833
8d31cfce
AW
3834# check for spacing round square brackets; allowed:
3835# 1. with a type on the left -- int [] a;
fe2a7dbc
AW
3836# 2. at the beginning of a line for slice initialisers -- [0...10] = 5,
3837# 3. inside a curly brace -- = { [0...10] = 5 }
8d31cfce
AW
3838 while ($line =~ /(.*?\s)\[/g) {
3839 my ($where, $prefix) = ($-[1], $1);
3840 if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc 3841 ($where != 0 || $prefix !~ /^.\s+$/) &&
daebc534 3842 $prefix !~ /[{,]\s+$/) {
3705ce5b
JP
3843 if (ERROR("BRACKET_SPACE",
3844 "space prohibited before open square bracket '['\n" . $herecurr) &&
3845 $fix) {
194f66fc 3846 $fixed[$fixlinenr] =~
3705ce5b
JP
3847 s/^(\+.*?)\s+\[/$1\[/;
3848 }
8d31cfce
AW
3849 }
3850 }
3851
f0a594c1 3852# check for spaces between functions and their parentheses.
6c72ffaa 3853 while ($line =~ /($Ident)\s+\(/g) {
c2fdda0d 3854 my $name = $1;
773647a0
AW
3855 my $ctx_before = substr($line, 0, $-[1]);
3856 my $ctx = "$ctx_before$name";
c2fdda0d
AW
3857
3858 # Ignore those directives where spaces _are_ permitted.
773647a0
AW
3859 if ($name =~ /^(?:
3860 if|for|while|switch|return|case|
3861 volatile|__volatile__|
3862 __attribute__|format|__extension__|
3863 asm|__asm__)$/x)
3864 {
c2fdda0d
AW
3865 # cpp #define statements have non-optional spaces, ie
3866 # if there is a space between the name and the open
3867 # parenthesis it is simply not a parameter group.
c45dcabd 3868 } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a0
AW
3869
3870 # cpp #elif statement condition may start with a (
c45dcabd 3871 } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0d
AW
3872
3873 # If this whole things ends with a type its most
3874 # likely a typedef for a function.
773647a0 3875 } elsif ($ctx =~ /$Type$/) {
c2fdda0d
AW
3876
3877 } else {
3705ce5b
JP
3878 if (WARN("SPACING",
3879 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
3880 $fix) {
194f66fc 3881 $fixed[$fixlinenr] =~
3705ce5b
JP
3882 s/\b$name\s+\(/$name\(/;
3883 }
6c72ffaa 3884 }
f0a594c1 3885 }
9a4cad4e 3886
653d4876 3887# Check operator spacing.
0a920b5b 3888 if (!($line=~/\#\s*include/)) {
3705ce5b
JP
3889 my $fixed_line = "";
3890 my $line_fixed = 0;
3891
9c0ca6f9
AW
3892 my $ops = qr{
3893 <<=|>>=|<=|>=|==|!=|
3894 \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
3895 =>|->|<<|>>|<|>|=|!|~|
1f65f947 3896 &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
84731623 3897 \?:|\?|:
9c0ca6f9 3898 }x;
cf655043 3899 my @elements = split(/($ops|;)/, $opline);
3705ce5b
JP
3900
3901## print("element count: <" . $#elements . ">\n");
3902## foreach my $el (@elements) {
3903## print("el: <$el>\n");
3904## }
3905
3906 my @fix_elements = ();
00df344f 3907 my $off = 0;
6c72ffaa 3908
3705ce5b
JP
3909 foreach my $el (@elements) {
3910 push(@fix_elements, substr($rawline, $off, length($el)));
3911 $off += length($el);
3912 }
3913
3914 $off = 0;
3915
6c72ffaa 3916 my $blank = copy_spacing($opline);
b34c648b 3917 my $last_after = -1;
6c72ffaa 3918
0a920b5b 3919 for (my $n = 0; $n < $#elements; $n += 2) {
3705ce5b
JP
3920
3921 my $good = $fix_elements[$n] . $fix_elements[$n + 1];
3922
3923## print("n: <$n> good: <$good>\n");
3924
4a0df2ef
AW
3925 $off += length($elements[$n]);
3926
25985edc 3927 # Pick up the preceding and succeeding characters.
773647a0
AW
3928 my $ca = substr($opline, 0, $off);
3929 my $cc = '';
3930 if (length($opline) >= ($off + length($elements[$n + 1]))) {
3931 $cc = substr($opline, $off + length($elements[$n + 1]));
3932 }
3933 my $cb = "$ca$;$cc";
3934
4a0df2ef
AW
3935 my $a = '';
3936 $a = 'V' if ($elements[$n] ne '');
3937 $a = 'W' if ($elements[$n] =~ /\s$/);
cf655043 3938 $a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef
AW
3939 $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
3940 $a = 'O' if ($elements[$n] eq '');
773647a0 3941 $a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef 3942
0a920b5b 3943 my $op = $elements[$n + 1];
4a0df2ef
AW
3944
3945 my $c = '';
0a920b5b 3946 if (defined $elements[$n + 2]) {
4a0df2ef
AW
3947 $c = 'V' if ($elements[$n + 2] ne '');
3948 $c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043 3949 $c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef
AW
3950 $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
3951 $c = 'O' if ($elements[$n + 2] eq '');
8b1b3378 3952 $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef
AW
3953 } else {
3954 $c = 'E';
0a920b5b
AW
3955 }
3956
4a0df2ef
AW
3957 my $ctx = "${a}x${c}";
3958
3959 my $at = "(ctx:$ctx)";
3960
6c72ffaa 3961 my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e 3962 my $hereptr = "$hereline$ptr\n";
0a920b5b 3963
74048ed8 3964 # Pull out the value of this operator.
6c72ffaa 3965 my $op_type = substr($curr_values, $off + 1, 1);
0a920b5b 3966
1f65f947
AW
3967 # Get the full operator variant.
3968 my $opv = $op . substr($curr_vars, $off, 1);
3969
13214adf
AW
3970 # Ignore operators passed as parameters.
3971 if ($op_type ne 'V' &&
d7fe8065 3972 $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) {
13214adf 3973
cf655043
AW
3974# # Ignore comments
3975# } elsif ($op =~ /^$;+$/) {
13214adf 3976
d8aaf121 3977 # ; should have either the end of line or a space or \ after it
13214adf 3978 } elsif ($op eq ';') {
cf655043
AW
3979 if ($ctx !~ /.x[WEBC]/ &&
3980 $cc !~ /^\\/ && $cc !~ /^;/) {
3705ce5b
JP
3981 if (ERROR("SPACING",
3982 "space required after that '$op' $at\n" . $hereptr)) {
b34c648b 3983 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5b
JP
3984 $line_fixed = 1;
3985 }
d8aaf121
AW
3986 }
3987
3988 # // is a comment
3989 } elsif ($op eq '//') {
0a920b5b 3990
b00e4814
JP
3991 # : when part of a bitfield
3992 } elsif ($opv eq ':B') {
3993 # skip the bitfield test for now
3994
1f65f947
AW
3995 # No spaces for:
3996 # ->
b00e4814 3997 } elsif ($op eq '->') {
4a0df2ef 3998 if ($ctx =~ /Wx.|.xW/) {
3705ce5b
JP
3999 if (ERROR("SPACING",
4000 "spaces prohibited around that '$op' $at\n" . $hereptr)) {
b34c648b 4001 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5b
JP
4002 if (defined $fix_elements[$n + 2]) {
4003 $fix_elements[$n + 2] =~ s/^\s+//;
4004 }
b34c648b 4005 $line_fixed = 1;
3705ce5b 4006 }
0a920b5b
AW
4007 }
4008
2381097b 4009 # , must not have a space before and must have a space on the right.
0a920b5b 4010 } elsif ($op eq ',') {
2381097b
JP
4011 my $rtrim_before = 0;
4012 my $space_after = 0;
4013 if ($ctx =~ /Wx./) {
4014 if (ERROR("SPACING",
4015 "space prohibited before that '$op' $at\n" . $hereptr)) {
4016 $line_fixed = 1;
4017 $rtrim_before = 1;
4018 }
4019 }
cf655043 4020 if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
3705ce5b
JP
4021 if (ERROR("SPACING",
4022 "space required after that '$op' $at\n" . $hereptr)) {
3705ce5b 4023 $line_fixed = 1;
b34c648b 4024 $last_after = $n;
2381097b
JP
4025 $space_after = 1;
4026 }
4027 }
4028 if ($rtrim_before || $space_after) {
4029 if ($rtrim_before) {
4030 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
4031 } else {
4032 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
4033 }
4034 if ($space_after) {
4035 $good .= " ";
3705ce5b 4036 }
0a920b5b
AW
4037 }
4038
9c0ca6f9 4039 # '*' as part of a type definition -- reported already.
74048ed8 4040 } elsif ($opv eq '*_') {
9c0ca6f9
AW
4041 #warn "'*' is part of type\n";
4042
4043 # unary operators should have a space before and
4044 # none after. May be left adjacent to another
4045 # unary operator, or a cast
4046 } elsif ($op eq '!' || $op eq '~' ||
74048ed8 4047 $opv eq '*U' || $opv eq '-U' ||
0d413866 4048 $opv eq '&U' || $opv eq '&&U') {
cf655043 4049 if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
3705ce5b
JP
4050 if (ERROR("SPACING",
4051 "space required before that '$op' $at\n" . $hereptr)) {
b34c648b
JP
4052 if ($n != $last_after + 2) {
4053 $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
4054 $line_fixed = 1;
4055 }
3705ce5b 4056 }
0a920b5b 4057 }
a3340b35 4058 if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a4
AW
4059 # A unary '*' may be const
4060
4061 } elsif ($ctx =~ /.xW/) {
3705ce5b
JP
4062 if (ERROR("SPACING",
4063 "space prohibited after that '$op' $at\n" . $hereptr)) {
b34c648b 4064 $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
3705ce5b
JP
4065 if (defined $fix_elements[$n + 2]) {
4066 $fix_elements[$n + 2] =~ s/^\s+//;
4067 }
b34c648b 4068 $line_fixed = 1;
3705ce5b 4069 }
0a920b5b
AW
4070 }
4071
4072 # unary ++ and unary -- are allowed no space on one side.
4073 } elsif ($op eq '++' or $op eq '--') {
773647a0 4074 if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
3705ce5b
JP
4075 if (ERROR("SPACING",
4076 "space required one side of that '$op' $at\n" . $hereptr)) {
b34c648b 4077 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5b
JP
4078 $line_fixed = 1;
4079 }
773647a0
AW
4080 }
4081 if ($ctx =~ /Wx[BE]/ ||
4082 ($ctx =~ /Wx./ && $cc =~ /^;/)) {
3705ce5b
JP
4083 if (ERROR("SPACING",
4084 "space prohibited before that '$op' $at\n" . $hereptr)) {
b34c648b 4085 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5b
JP
4086 $line_fixed = 1;
4087 }
0a920b5b 4088 }
773647a0 4089 if ($ctx =~ /ExW/) {
3705ce5b
JP
4090 if (ERROR("SPACING",
4091 "space prohibited after that '$op' $at\n" . $hereptr)) {
b34c648b 4092 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
3705ce5b
JP
4093 if (defined $fix_elements[$n + 2]) {
4094 $fix_elements[$n + 2] =~ s/^\s+//;
4095 }
b34c648b 4096 $line_fixed = 1;
3705ce5b 4097 }
653d4876 4098 }
0a920b5b 4099
0a920b5b 4100 # << and >> may either have or not have spaces both sides
9c0ca6f9
AW
4101 } elsif ($op eq '<<' or $op eq '>>' or
4102 $op eq '&' or $op eq '^' or $op eq '|' or
4103 $op eq '+' or $op eq '-' or
c2fdda0d
AW
4104 $op eq '*' or $op eq '/' or
4105 $op eq '%')
0a920b5b 4106 {
d2e025f3
JP
4107 if ($check) {
4108 if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {
4109 if (CHK("SPACING",
4110 "spaces preferred around that '$op' $at\n" . $hereptr)) {
4111 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4112 $fix_elements[$n + 2] =~ s/^\s+//;
4113 $line_fixed = 1;
4114 }
4115 } elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {
4116 if (CHK("SPACING",
4117 "space preferred before that '$op' $at\n" . $hereptr)) {
4118 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);
4119 $line_fixed = 1;
4120 }
4121 }
4122 } elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
3705ce5b
JP
4123 if (ERROR("SPACING",
4124 "need consistent spacing around '$op' $at\n" . $hereptr)) {
b34c648b
JP
4125 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4126 if (defined $fix_elements[$n + 2]) {
4127 $fix_elements[$n + 2] =~ s/^\s+//;
4128 }
3705ce5b
JP
4129 $line_fixed = 1;
4130 }
0a920b5b
AW
4131 }
4132
1f65f947
AW
4133 # A colon needs no spaces before when it is
4134 # terminating a case value or a label.
4135 } elsif ($opv eq ':C' || $opv eq ':L') {
4136 if ($ctx =~ /Wx./) {
3705ce5b
JP
4137 if (ERROR("SPACING",
4138 "space prohibited before that '$op' $at\n" . $hereptr)) {
b34c648b 4139 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5b
JP
4140 $line_fixed = 1;
4141 }
1f65f947
AW
4142 }
4143
0a920b5b 4144 # All the others need spaces both sides.
cf655043 4145 } elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947
AW
4146 my $ok = 0;
4147
22f2a2ef 4148 # Ignore email addresses <foo@bar>
1f65f947
AW
4149 if (($op eq '<' &&
4150 $cc =~ /^\S+\@\S+>/) ||
4151 ($op eq '>' &&
4152 $ca =~ /<\S+\@\S+$/))
4153 {
4154 $ok = 1;
4155 }
4156
e0df7e1f
JP
4157 # for asm volatile statements
4158 # ignore a colon with another
4159 # colon immediately before or after
4160 if (($op eq ':') &&
4161 ($ca =~ /:$/ || $cc =~ /^:/)) {
4162 $ok = 1;
4163 }
4164
84731623 4165 # messages are ERROR, but ?: are CHK
1f65f947 4166 if ($ok == 0) {
84731623
JP
4167 my $msg_type = \&ERROR;
4168 $msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
4169
4170 if (&{$msg_type}("SPACING",
4171 "spaces required around that '$op' $at\n" . $hereptr)) {
b34c648b
JP
4172 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4173 if (defined $fix_elements[$n + 2]) {
4174 $fix_elements[$n + 2] =~ s/^\s+//;
4175 }
3705ce5b
JP
4176 $line_fixed = 1;
4177 }
22f2a2ef 4178 }
0a920b5b 4179 }
4a0df2ef 4180 $off += length($elements[$n + 1]);
3705ce5b
JP
4181
4182## print("n: <$n> GOOD: <$good>\n");
4183
4184 $fixed_line = $fixed_line . $good;
4185 }
4186
4187 if (($#elements % 2) == 0) {
4188 $fixed_line = $fixed_line . $fix_elements[$#elements];
0a920b5b 4189 }
3705ce5b 4190
194f66fc
JP
4191 if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
4192 $fixed[$fixlinenr] = $fixed_line;
3705ce5b
JP
4193 }
4194
4195
0a920b5b
AW
4196 }
4197
786b6326 4198# check for whitespace before a non-naked semicolon
d2e248e7 4199 if ($line =~ /^\+.*\S\s+;\s*$/) {
786b6326
JP
4200 if (WARN("SPACING",
4201 "space prohibited before semicolon\n" . $herecurr) &&
4202 $fix) {
194f66fc 4203 1 while $fixed[$fixlinenr] =~
786b6326
JP
4204 s/^(\+.*\S)\s+;/$1;/;
4205 }
4206 }
4207
f0a594c1
AW
4208# check for multiple assignments
4209 if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
000d1cc1
JP
4210 CHK("MULTIPLE_ASSIGNMENTS",
4211 "multiple assignments should be avoided\n" . $herecurr);
f0a594c1
AW
4212 }
4213
22f2a2ef
AW
4214## # check for multiple declarations, allowing for a function declaration
4215## # continuation.
4216## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
4217## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
4218##
4219## # Remove any bracketed sections to ensure we do not
4220## # falsly report the parameters of functions.
4221## my $ln = $line;
4222## while ($ln =~ s/\([^\(\)]*\)//g) {
4223## }
4224## if ($ln =~ /,/) {
000d1cc1
JP
4225## WARN("MULTIPLE_DECLARATION",
4226## "declaring multiple variables together should be avoided\n" . $herecurr);
22f2a2ef
AW
4227## }
4228## }
f0a594c1 4229
0a920b5b 4230#need space before brace following if, while, etc
6b8c69e4 4231 if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
4e5d56bd 4232 $line =~ /do\{/) {
3705ce5b
JP
4233 if (ERROR("SPACING",
4234 "space required before the open brace '{'\n" . $herecurr) &&
4235 $fix) {
194f66fc 4236 $fixed[$fixlinenr] =~ s/^(\+.*(?:do|\))){/$1 {/;
3705ce5b 4237 }
de7d4f0e
AW
4238 }
4239
c4a62ef9
JP
4240## # check for blank lines before declarations
4241## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
4242## $prevrawline =~ /^.\s*$/) {
4243## WARN("SPACING",
4244## "No blank lines before declarations\n" . $hereprev);
4245## }
4246##
4247
de7d4f0e
AW
4248# closing brace should have a space following it when it has anything
4249# on the line
4250 if ($line =~ /}(?!(?:,|;|\)))\S/) {
d5e616fc
JP
4251 if (ERROR("SPACING",
4252 "space required after that close brace '}'\n" . $herecurr) &&
4253 $fix) {
194f66fc 4254 $fixed[$fixlinenr] =~
d5e616fc
JP
4255 s/}((?!(?:,|;|\)))\S)/} $1/;
4256 }
0a920b5b
AW
4257 }
4258
22f2a2ef
AW
4259# check spacing on square brackets
4260 if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
3705ce5b
JP
4261 if (ERROR("SPACING",
4262 "space prohibited after that open square bracket '['\n" . $herecurr) &&
4263 $fix) {
194f66fc 4264 $fixed[$fixlinenr] =~
3705ce5b
JP
4265 s/\[\s+/\[/;
4266 }
22f2a2ef
AW
4267 }
4268 if ($line =~ /\s\]/) {
3705ce5b
JP
4269 if (ERROR("SPACING",
4270 "space prohibited before that close square bracket ']'\n" . $herecurr) &&
4271 $fix) {
194f66fc 4272 $fixed[$fixlinenr] =~
3705ce5b
JP
4273 s/\s+\]/\]/;
4274 }
22f2a2ef
AW
4275 }
4276
c45dcabd 4277# check spacing on parentheses
9c0ca6f9
AW
4278 if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
4279 $line !~ /for\s*\(\s+;/) {
3705ce5b
JP
4280 if (ERROR("SPACING",
4281 "space prohibited after that open parenthesis '('\n" . $herecurr) &&
4282 $fix) {
194f66fc 4283 $fixed[$fixlinenr] =~
3705ce5b
JP
4284 s/\(\s+/\(/;
4285 }
22f2a2ef 4286 }
13214adf 4287 if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd
AW
4288 $line !~ /for\s*\(.*;\s+\)/ &&
4289 $line !~ /:\s+\)/) {
3705ce5b
JP
4290 if (ERROR("SPACING",
4291 "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
4292 $fix) {
194f66fc 4293 $fixed[$fixlinenr] =~
3705ce5b
JP
4294 s/\s+\)/\)/;
4295 }
22f2a2ef
AW
4296 }
4297
e2826fd0
JP
4298# check unnecessary parentheses around addressof/dereference single $Lvals
4299# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
4300
4301 while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
ea4acbb1
JP
4302 my $var = $1;
4303 if (CHK("UNNECESSARY_PARENTHESES",
4304 "Unnecessary parentheses around $var\n" . $herecurr) &&
4305 $fix) {
4306 $fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;
4307 }
4308 }
4309
4310# check for unnecessary parentheses around function pointer uses
4311# ie: (foo->bar)(); should be foo->bar();
4312# but not "if (foo->bar) (" to avoid some false positives
4313 if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {
4314 my $var = $2;
4315 if (CHK("UNNECESSARY_PARENTHESES",
4316 "Unnecessary parentheses around function pointer $var\n" . $herecurr) &&
4317 $fix) {
4318 my $var2 = deparenthesize($var);
4319 $var2 =~ s/\s//g;
4320 $fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;
4321 }
4322 }
e2826fd0 4323
0a920b5b 4324#goto labels aren't indented, allow a single space however
4a0df2ef 4325 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b 4326 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
3705ce5b
JP
4327 if (WARN("INDENTED_LABEL",
4328 "labels should not be indented\n" . $herecurr) &&
4329 $fix) {
194f66fc 4330 $fixed[$fixlinenr] =~
3705ce5b
JP
4331 s/^(.)\s+/$1/;
4332 }
0a920b5b
AW
4333 }
4334
5b9553ab 4335# return is not a function
507e5141 4336 if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
c45dcabd 4337 my $spacing = $1;
507e5141 4338 if ($^V && $^V ge 5.10.0 &&
5b9553ab
JP
4339 $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
4340 my $value = $1;
4341 $value = deparenthesize($value);
4342 if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
4343 ERROR("RETURN_PARENTHESES",
4344 "return is not a function, parentheses are not required\n" . $herecurr);
4345 }
c45dcabd 4346 } elsif ($spacing !~ /\s+/) {
000d1cc1
JP
4347 ERROR("SPACING",
4348 "space required before the open parenthesis '('\n" . $herecurr);
c45dcabd
AW
4349 }
4350 }
507e5141 4351
b43ae21b
JP
4352# unnecessary return in a void function
4353# at end-of-function, with the previous line a single leading tab, then return;
4354# and the line before that not a goto label target like "out:"
4355 if ($sline =~ /^[ \+]}\s*$/ &&
4356 $prevline =~ /^\+\treturn\s*;\s*$/ &&
4357 $linenr >= 3 &&
4358 $lines[$linenr - 3] =~ /^[ +]/ &&
4359 $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
9819cf25 4360 WARN("RETURN_VOID",
b43ae21b
JP
4361 "void function return statements are not generally useful\n" . $hereprev);
4362 }
9819cf25 4363
189248d8
JP
4364# if statements using unnecessary parentheses - ie: if ((foo == bar))
4365 if ($^V && $^V ge 5.10.0 &&
4366 $line =~ /\bif\s*((?:\(\s*){2,})/) {
4367 my $openparens = $1;
4368 my $count = $openparens =~ tr@\(@\(@;
4369 my $msg = "";
4370 if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
4371 my $comp = $4; #Not $1 because of $LvalOrFunc
4372 $msg = " - maybe == should be = ?" if ($comp eq "==");
4373 WARN("UNNECESSARY_PARENTHESES",
4374 "Unnecessary parentheses$msg\n" . $herecurr);
4375 }
4376 }
4377
c5595fa2
JP
4378# comparisons with a constant or upper case identifier on the left
4379# avoid cases like "foo + BAR < baz"
4380# only fix matches surrounded by parentheses to avoid incorrect
4381# conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5"
4382 if ($^V && $^V ge 5.10.0 &&
4383 $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {
4384 my $lead = $1;
4385 my $const = $2;
4386 my $comp = $3;
4387 my $to = $4;
4388 my $newcomp = $comp;
f39e1769 4389 if ($lead !~ /(?:$Operators|\.)\s*$/ &&
c5595fa2
JP
4390 $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
4391 WARN("CONSTANT_COMPARISON",
4392 "Comparisons should place the constant on the right side of the test\n" . $herecurr) &&
4393 $fix) {
4394 if ($comp eq "<") {
4395 $newcomp = ">";
4396 } elsif ($comp eq "<=") {
4397 $newcomp = ">=";
4398 } elsif ($comp eq ">") {
4399 $newcomp = "<";
4400 } elsif ($comp eq ">=") {
4401 $newcomp = "<=";
4402 }
4403 $fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/;
4404 }
4405 }
4406
f34e4a4f
JP
4407# Return of what appears to be an errno should normally be negative
4408 if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
53a3c448
AW
4409 my $name = $1;
4410 if ($name ne 'EOF' && $name ne 'ERROR') {
000d1cc1 4411 WARN("USE_NEGATIVE_ERRNO",
f34e4a4f 4412 "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
53a3c448
AW
4413 }
4414 }
c45dcabd 4415
0a920b5b 4416# Need a space before open parenthesis after if, while etc
3705ce5b
JP
4417 if ($line =~ /\b(if|while|for|switch)\(/) {
4418 if (ERROR("SPACING",
4419 "space required before the open parenthesis '('\n" . $herecurr) &&
4420 $fix) {
194f66fc 4421 $fixed[$fixlinenr] =~
3705ce5b
JP
4422 s/\b(if|while|for|switch)\(/$1 \(/;
4423 }
0a920b5b
AW
4424 }
4425
f5fe35dd
AW
4426# Check for illegal assignment in if conditional -- and check for trailing
4427# statements after the conditional.
170d3a22 4428 if ($line =~ /do\s*(?!{)/) {
3e469cdc
AW
4429 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
4430 ctx_statement_block($linenr, $realcnt, 0)
4431 if (!defined $stat);
170d3a22
AW
4432 my ($stat_next) = ctx_statement_block($line_nr_next,
4433 $remain_next, $off_next);
4434 $stat_next =~ s/\n./\n /g;
4435 ##print "stat<$stat> stat_next<$stat_next>\n";
4436
4437 if ($stat_next =~ /^\s*while\b/) {
4438 # If the statement carries leading newlines,
4439 # then count those as offsets.
4440 my ($whitespace) =
4441 ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
4442 my $offset =
4443 statement_rawlines($whitespace) - 1;
4444
4445 $suppress_whiletrailers{$line_nr_next +
4446 $offset} = 1;
4447 }
4448 }
4449 if (!defined $suppress_whiletrailers{$linenr} &&
c11230f4 4450 defined($stat) && defined($cond) &&
170d3a22 4451 $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
171ae1a4 4452 my ($s, $c) = ($stat, $cond);
8905a67c 4453
b53c8e10 4454 if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
000d1cc1
JP
4455 ERROR("ASSIGN_IN_IF",
4456 "do not use assignment in if condition\n" . $herecurr);
8905a67c
AW
4457 }
4458
4459 # Find out what is on the end of the line after the
4460 # conditional.
773647a0 4461 substr($s, 0, length($c), '');
8905a67c 4462 $s =~ s/\n.*//g;
13214adf 4463 $s =~ s/$;//g; # Remove any comments
53210168
AW
4464 if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
4465 $c !~ /}\s*while\s*/)
773647a0 4466 {
bb44ad39
AW
4467 # Find out how long the conditional actually is.
4468 my @newlines = ($c =~ /\n/gs);
4469 my $cond_lines = 1 + $#newlines;
42bdf74c 4470 my $stat_real = '';
bb44ad39 4471
42bdf74c
HS
4472 $stat_real = raw_line($linenr, $cond_lines)
4473 . "\n" if ($cond_lines);
bb44ad39
AW
4474 if (defined($stat_real) && $cond_lines > 1) {
4475 $stat_real = "[...]\n$stat_real";
4476 }
4477
000d1cc1
JP
4478 ERROR("TRAILING_STATEMENTS",
4479 "trailing statements should be on next line\n" . $herecurr . $stat_real);
8905a67c
AW
4480 }
4481 }
4482
13214adf
AW
4483# Check for bitwise tests written as boolean
4484 if ($line =~ /
4485 (?:
4486 (?:\[|\(|\&\&|\|\|)
4487 \s*0[xX][0-9]+\s*
4488 (?:\&\&|\|\|)
4489 |
4490 (?:\&\&|\|\|)
4491 \s*0[xX][0-9]+\s*
4492 (?:\&\&|\|\||\)|\])
4493 )/x)
4494 {
000d1cc1
JP
4495 WARN("HEXADECIMAL_BOOLEAN_TEST",
4496 "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
13214adf
AW
4497 }
4498
8905a67c 4499# if and else should not have general statements after it
13214adf
AW
4500 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
4501 my $s = $1;
4502 $s =~ s/$;//g; # Remove any comments
4503 if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
000d1cc1
JP
4504 ERROR("TRAILING_STATEMENTS",
4505 "trailing statements should be on next line\n" . $herecurr);
13214adf 4506 }
0a920b5b 4507 }
39667782
AW
4508# if should not continue a brace
4509 if ($line =~ /}\s*if\b/) {
000d1cc1 4510 ERROR("TRAILING_STATEMENTS",
048b123f 4511 "trailing statements should be on next line (or did you mean 'else if'?)\n" .
39667782
AW
4512 $herecurr);
4513 }
a1080bf8
AW
4514# case and default should not have general statements after them
4515 if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
4516 $line !~ /\G(?:
3fef12d6 4517 (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf8
AW
4518 \s*return\s+
4519 )/xg)
4520 {
000d1cc1
JP
4521 ERROR("TRAILING_STATEMENTS",
4522 "trailing statements should be on next line\n" . $herecurr);
a1080bf8 4523 }
0a920b5b
AW
4524
4525 # Check for }<nl>else {, these must be at the same
4526 # indent level to be relevant to each other.
8b8856f4
JP
4527 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
4528 $previndent == $indent) {
4529 if (ERROR("ELSE_AFTER_BRACE",
4530 "else should follow close brace '}'\n" . $hereprev) &&
4531 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
4532 fix_delete_line($fixlinenr - 1, $prevrawline);
4533 fix_delete_line($fixlinenr, $rawline);
4534 my $fixedline = $prevrawline;
4535 $fixedline =~ s/}\s*$//;
4536 if ($fixedline !~ /^\+\s*$/) {
4537 fix_insert_line($fixlinenr, $fixedline);
4538 }
4539 $fixedline = $rawline;
4540 $fixedline =~ s/^(.\s*)else/$1} else/;
4541 fix_insert_line($fixlinenr, $fixedline);
4542 }
0a920b5b
AW
4543 }
4544
8b8856f4
JP
4545 if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
4546 $previndent == $indent) {
c2fdda0d
AW
4547 my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
4548
4549 # Find out what is on the end of the line after the
4550 # conditional.
773647a0 4551 substr($s, 0, length($c), '');
c2fdda0d
AW
4552 $s =~ s/\n.*//g;
4553
4554 if ($s =~ /^\s*;/) {
8b8856f4
JP
4555 if (ERROR("WHILE_AFTER_BRACE",
4556 "while should follow close brace '}'\n" . $hereprev) &&
4557 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
4558 fix_delete_line($fixlinenr - 1, $prevrawline);
4559 fix_delete_line($fixlinenr, $rawline);
4560 my $fixedline = $prevrawline;
4561 my $trailing = $rawline;
4562 $trailing =~ s/^\+//;
4563 $trailing = trim($trailing);
4564 $fixedline =~ s/}\s*$/} $trailing/;
4565 fix_insert_line($fixlinenr, $fixedline);
4566 }
c2fdda0d
AW
4567 }
4568 }
4569
95e2c602 4570#Specific variable tests
323c1260
JP
4571 while ($line =~ m{($Constant|$Lval)}g) {
4572 my $var = $1;
95e2c602
JP
4573
4574#gcc binary extension
4575 if ($var =~ /^$Binary$/) {
d5e616fc
JP
4576 if (WARN("GCC_BINARY_CONSTANT",
4577 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
4578 $fix) {
4579 my $hexval = sprintf("0x%x", oct($var));
194f66fc 4580 $fixed[$fixlinenr] =~
d5e616fc
JP
4581 s/\b$var\b/$hexval/;
4582 }
95e2c602
JP
4583 }
4584
4585#CamelCase
807bd26c 4586 if ($var !~ /^$Constant$/ &&
be79794b 4587 $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
22735ce8 4588#Ignore Page<foo> variants
807bd26c 4589 $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
22735ce8 4590#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
f5123576
JW
4591 $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ &&
4592#Ignore some three character SI units explicitly, like MiB and KHz
4593 $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
7e781f67
JP
4594 while ($var =~ m{($Ident)}g) {
4595 my $word = $1;
4596 next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
d8b07710
JP
4597 if ($check) {
4598 seed_camelcase_includes();
4599 if (!$file && !$camelcase_file_seeded) {
4600 seed_camelcase_file($realfile);
4601 $camelcase_file_seeded = 1;
4602 }
4603 }
7e781f67
JP
4604 if (!defined $camelcase{$word}) {
4605 $camelcase{$word} = 1;
4606 CHK("CAMELCASE",
4607 "Avoid CamelCase: <$word>\n" . $herecurr);
4608 }
3445686a 4609 }
323c1260
JP
4610 }
4611 }
0a920b5b
AW
4612
4613#no spaces allowed after \ in define
d5e616fc
JP
4614 if ($line =~ /\#\s*define.*\\\s+$/) {
4615 if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
4616 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
4617 $fix) {
194f66fc 4618 $fixed[$fixlinenr] =~ s/\s+$//;
d5e616fc 4619 }
0a920b5b
AW
4620 }
4621
0e212e0a
FF
4622# warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes
4623# itself <asm/foo.h> (uses RAW line)
c45dcabd 4624 if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec48
AW
4625 my $file = "$1.h";
4626 my $checkfile = "include/linux/$file";
4627 if (-f "$root/$checkfile" &&
4628 $realfile ne $checkfile &&
7840a94c 4629 $1 !~ /$allowed_asm_includes/)
c45dcabd 4630 {
0e212e0a
FF
4631 my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`;
4632 if ($asminclude > 0) {
4633 if ($realfile =~ m{^arch/}) {
4634 CHK("ARCH_INCLUDE_LINUX",
4635 "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
4636 } else {
4637 WARN("INCLUDE_LINUX",
4638 "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
4639 }
e09dec48 4640 }
0a920b5b
AW
4641 }
4642 }
4643
653d4876
AW
4644# multi-statement macros should be enclosed in a do while loop, grab the
4645# first statement and ensure its the whole macro if its not enclosed
cf655043 4646# in a known good container
b8f96a31
AW
4647 if ($realfile !~ m@/vmlinux.lds.h$@ &&
4648 $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf121
AW
4649 my $ln = $linenr;
4650 my $cnt = $realcnt;
c45dcabd
AW
4651 my ($off, $dstat, $dcond, $rest);
4652 my $ctx = '';
08a2843e
JP
4653 my $has_flow_statement = 0;
4654 my $has_arg_concat = 0;
c45dcabd 4655 ($dstat, $dcond, $ln, $cnt, $off) =
f74bd194
AW
4656 ctx_statement_block($linenr, $realcnt, 0);
4657 $ctx = $dstat;
c45dcabd 4658 #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
a3bb97a7 4659 #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
c45dcabd 4660
08a2843e 4661 $has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
62e15a6d 4662 $has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/);
08a2843e 4663
f74bd194 4664 $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//;
292f1a9b 4665 $dstat =~ s/$;//g;
c45dcabd
AW
4666 $dstat =~ s/\\\n.//g;
4667 $dstat =~ s/^\s*//s;
4668 $dstat =~ s/\s*$//s;
de7d4f0e 4669
c45dcabd 4670 # Flatten any parentheses and braces
bf30d6ed
AW
4671 while ($dstat =~ s/\([^\(\)]*\)/1/ ||
4672 $dstat =~ s/\{[^\{\}]*\}/1/ ||
6b10df42 4673 $dstat =~ s/.\[[^\[\]]*\]/1/)
bf30d6ed 4674 {
de7d4f0e 4675 }
d8aaf121 4676
e45bab8e 4677 # Flatten any obvious string concatentation.
33acb54a
JP
4678 while ($dstat =~ s/($String)\s*$Ident/$1/ ||
4679 $dstat =~ s/$Ident\s*($String)/$1/)
e45bab8e
AW
4680 {
4681 }
4682
42e15293
JP
4683 # Make asm volatile uses seem like a generic function
4684 $dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
4685
c45dcabd
AW
4686 my $exceptions = qr{
4687 $Declare|
4688 module_param_named|
a0a0a7a9 4689 MODULE_PARM_DESC|
c45dcabd
AW
4690 DECLARE_PER_CPU|
4691 DEFINE_PER_CPU|
383099fd 4692 __typeof__\(|
22fd2d3e
SS
4693 union|
4694 struct|
ea71a0a0 4695 \.$Ident\s*=\s*|
6b10df42
VZ
4696 ^\"|\"$|
4697 ^\[
c45dcabd 4698 }x;
5eaa20b9 4699 #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
f74bd194
AW
4700 if ($dstat ne '' &&
4701 $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(),
4702 $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo();
3cc4b1c3 4703 $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
356fd398 4704 $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ && # character constants
f74bd194
AW
4705 $dstat !~ /$exceptions/ &&
4706 $dstat !~ /^\.$Ident\s*=/ && # .foo =
e942e2c3 4707 $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo
72f115f9 4708 $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...)
f74bd194
AW
4709 $dstat !~ /^for\s*$Constant$/ && # for (...)
4710 $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar()
4711 $dstat !~ /^do\s*{/ && # do {...
4e5d56bd 4712 $dstat !~ /^\(\{/ && # ({...
f95a7e6a 4713 $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
f74bd194
AW
4714 {
4715 $ctx =~ s/\n*$//;
4716 my $herectx = $here . "\n";
4717 my $cnt = statement_rawlines($ctx);
4718
4719 for (my $n = 0; $n < $cnt; $n++) {
4720 $herectx .= raw_line($linenr, $n) . "\n";
c45dcabd
AW
4721 }
4722
f74bd194
AW
4723 if ($dstat =~ /;/) {
4724 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
4725 "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
4726 } else {
000d1cc1 4727 ERROR("COMPLEX_MACRO",
388982b5 4728 "Macros with complex values should be enclosed in parentheses\n" . "$herectx");
d8aaf121 4729 }
653d4876 4730 }
5023d347 4731
08a2843e
JP
4732# check for macros with flow control, but without ## concatenation
4733# ## concatenation is commonly a macro that defines a function so ignore those
4734 if ($has_flow_statement && !$has_arg_concat) {
4735 my $herectx = $here . "\n";
4736 my $cnt = statement_rawlines($ctx);
4737
4738 for (my $n = 0; $n < $cnt; $n++) {
4739 $herectx .= raw_line($linenr, $n) . "\n";
4740 }
4741 WARN("MACRO_WITH_FLOW_CONTROL",
4742 "Macros with flow control statements should be avoided\n" . "$herectx");
4743 }
4744
481eb486 4745# check for line continuations outside of #defines, preprocessor #, and asm
5023d347
JP
4746
4747 } else {
4748 if ($prevline !~ /^..*\\$/ &&
481eb486
JP
4749 $line !~ /^\+\s*\#.*\\$/ && # preprocessor
4750 $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm
5023d347
JP
4751 $line =~ /^\+.*\\$/) {
4752 WARN("LINE_CONTINUATIONS",
4753 "Avoid unnecessary line continuations\n" . $herecurr);
4754 }
0a920b5b
AW
4755 }
4756
b13edf7f
JP
4757# do {} while (0) macro tests:
4758# single-statement macros do not need to be enclosed in do while (0) loop,
4759# macro should not end with a semicolon
4760 if ($^V && $^V ge 5.10.0 &&
4761 $realfile !~ m@/vmlinux.lds.h$@ &&
4762 $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
4763 my $ln = $linenr;
4764 my $cnt = $realcnt;
4765 my ($off, $dstat, $dcond, $rest);
4766 my $ctx = '';
4767 ($dstat, $dcond, $ln, $cnt, $off) =
4768 ctx_statement_block($linenr, $realcnt, 0);
4769 $ctx = $dstat;
4770
4771 $dstat =~ s/\\\n.//g;
1b36b201 4772 $dstat =~ s/$;/ /g;
b13edf7f
JP
4773
4774 if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
4775 my $stmts = $2;
4776 my $semis = $3;
4777
4778 $ctx =~ s/\n*$//;
4779 my $cnt = statement_rawlines($ctx);
4780 my $herectx = $here . "\n";
4781
4782 for (my $n = 0; $n < $cnt; $n++) {
4783 $herectx .= raw_line($linenr, $n) . "\n";
4784 }
4785
ac8e97f8
JP
4786 if (($stmts =~ tr/;/;/) == 1 &&
4787 $stmts !~ /^\s*(if|while|for|switch)\b/) {
b13edf7f
JP
4788 WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
4789 "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
4790 }
4791 if (defined $semis && $semis ne "") {
4792 WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
4793 "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
4794 }
f5ef95b1
JP
4795 } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
4796 $ctx =~ s/\n*$//;
4797 my $cnt = statement_rawlines($ctx);
4798 my $herectx = $here . "\n";
4799
4800 for (my $n = 0; $n < $cnt; $n++) {
4801 $herectx .= raw_line($linenr, $n) . "\n";
4802 }
4803
4804 WARN("TRAILING_SEMICOLON",
4805 "macros should not use a trailing semicolon\n" . "$herectx");
b13edf7f
JP
4806 }
4807 }
4808
080ba929
MF
4809# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
4810# all assignments may have only one of the following with an assignment:
4811# .
4812# ALIGN(...)
4813# VMLINUX_SYMBOL(...)
4814 if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
000d1cc1
JP
4815 WARN("MISSING_VMLINUX_SYMBOL",
4816 "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
080ba929
MF
4817 }
4818
f0a594c1 4819# check for redundant bracing round if etc
13214adf
AW
4820 if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
4821 my ($level, $endln, @chunks) =
cf655043 4822 ctx_statement_full($linenr, $realcnt, 1);
13214adf 4823 #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
cf655043
AW
4824 #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
4825 if ($#chunks > 0 && $level == 0) {
aad4f614
JP
4826 my @allowed = ();
4827 my $allow = 0;
13214adf 4828 my $seen = 0;
773647a0 4829 my $herectx = $here . "\n";
cf655043 4830 my $ln = $linenr - 1;
13214adf
AW
4831 for my $chunk (@chunks) {
4832 my ($cond, $block) = @{$chunk};
4833
773647a0
AW
4834 # If the condition carries leading newlines, then count those as offsets.
4835 my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
4836 my $offset = statement_rawlines($whitespace) - 1;
4837
aad4f614 4838 $allowed[$allow] = 0;
773647a0
AW
4839 #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
4840
4841 # We have looked at and allowed this specific line.
4842 $suppress_ifbraces{$ln + $offset} = 1;
4843
4844 $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
cf655043
AW
4845 $ln += statement_rawlines($block) - 1;
4846
773647a0 4847 substr($block, 0, length($cond), '');
13214adf
AW
4848
4849 $seen++ if ($block =~ /^\s*{/);
4850
aad4f614 4851 #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
cf655043
AW
4852 if (statement_lines($cond) > 1) {
4853 #print "APW: ALLOWED: cond<$cond>\n";
aad4f614 4854 $allowed[$allow] = 1;
13214adf
AW
4855 }
4856 if ($block =~/\b(?:if|for|while)\b/) {
cf655043 4857 #print "APW: ALLOWED: block<$block>\n";
aad4f614 4858 $allowed[$allow] = 1;
13214adf 4859 }
cf655043
AW
4860 if (statement_block_size($block) > 1) {
4861 #print "APW: ALLOWED: lines block<$block>\n";
aad4f614 4862 $allowed[$allow] = 1;
13214adf 4863 }
aad4f614 4864 $allow++;
13214adf 4865 }
aad4f614
JP
4866 if ($seen) {
4867 my $sum_allowed = 0;
4868 foreach (@allowed) {
4869 $sum_allowed += $_;
4870 }
4871 if ($sum_allowed == 0) {
4872 WARN("BRACES",
4873 "braces {} are not necessary for any arm of this statement\n" . $herectx);
4874 } elsif ($sum_allowed != $allow &&
4875 $seen != $allow) {
4876 CHK("BRACES",
4877 "braces {} should be used on all arms of this statement\n" . $herectx);
4878 }
13214adf
AW
4879 }
4880 }
4881 }
773647a0 4882 if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf 4883 $line =~ /\b(if|while|for|else)\b/) {
cf655043
AW
4884 my $allowed = 0;
4885
4886 # Check the pre-context.
4887 if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
4888 #print "APW: ALLOWED: pre<$1>\n";
4889 $allowed = 1;
4890 }
773647a0
AW
4891
4892 my ($level, $endln, @chunks) =
4893 ctx_statement_full($linenr, $realcnt, $-[0]);
4894
cf655043
AW
4895 # Check the condition.
4896 my ($cond, $block) = @{$chunks[0]};
773647a0 4897 #print "CHECKING<$linenr> cond<$cond> block<$block>\n";
cf655043 4898 if (defined $cond) {
773647a0 4899 substr($block, 0, length($cond), '');
cf655043
AW
4900 }
4901 if (statement_lines($cond) > 1) {
4902 #print "APW: ALLOWED: cond<$cond>\n";
4903 $allowed = 1;
4904 }
4905 if ($block =~/\b(?:if|for|while)\b/) {
4906 #print "APW: ALLOWED: block<$block>\n";
4907 $allowed = 1;
4908 }
4909 if (statement_block_size($block) > 1) {
4910 #print "APW: ALLOWED: lines block<$block>\n";
4911 $allowed = 1;
4912 }
4913 # Check the post-context.
4914 if (defined $chunks[1]) {
4915 my ($cond, $block) = @{$chunks[1]};
4916 if (defined $cond) {
773647a0 4917 substr($block, 0, length($cond), '');
cf655043
AW
4918 }
4919 if ($block =~ /^\s*\{/) {
4920 #print "APW: ALLOWED: chunk-1 block<$block>\n";
4921 $allowed = 1;
4922 }
4923 }
4924 if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
69932487 4925 my $herectx = $here . "\n";
f055663c 4926 my $cnt = statement_rawlines($block);
cf655043 4927
f055663c 4928 for (my $n = 0; $n < $cnt; $n++) {
69932487 4929 $herectx .= raw_line($linenr, $n) . "\n";
f0a594c1 4930 }
cf655043 4931
000d1cc1
JP
4932 WARN("BRACES",
4933 "braces {} are not necessary for single statement blocks\n" . $herectx);
f0a594c1
AW
4934 }
4935 }
4936
0979ae66 4937# check for unnecessary blank lines around braces
77b9a53a 4938 if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
f8e58219
JP
4939 if (CHK("BRACES",
4940 "Blank lines aren't necessary before a close brace '}'\n" . $hereprev) &&
4941 $fix && $prevrawline =~ /^\+/) {
4942 fix_delete_line($fixlinenr - 1, $prevrawline);
4943 }
0979ae66 4944 }
77b9a53a 4945 if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
f8e58219
JP
4946 if (CHK("BRACES",
4947 "Blank lines aren't necessary after an open brace '{'\n" . $hereprev) &&
4948 $fix) {
4949 fix_delete_line($fixlinenr, $rawline);
4950 }
0979ae66
JP
4951 }
4952
4a0df2ef 4953# no volatiles please
6c72ffaa
AW
4954 my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
4955 if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
000d1cc1
JP
4956 WARN("VOLATILE",
4957 "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
4a0df2ef
AW
4958 }
4959
5e4f6ba5
JP
4960# Check for user-visible strings broken across lines, which breaks the ability
4961# to grep for the string. Make exceptions when the previous string ends in a
4962# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
4963# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
33acb54a 4964 if ($line =~ /^\+\s*$String/ &&
5e4f6ba5
JP
4965 $prevline =~ /"\s*$/ &&
4966 $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
4967 if (WARN("SPLIT_STRING",
4968 "quoted string split across lines\n" . $hereprev) &&
4969 $fix &&
4970 $prevrawline =~ /^\+.*"\s*$/ &&
4971 $last_coalesced_string_linenr != $linenr - 1) {
4972 my $extracted_string = get_quoted_string($line, $rawline);
4973 my $comma_close = "";
4974 if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) {
4975 $comma_close = $1;
4976 }
4977
4978 fix_delete_line($fixlinenr - 1, $prevrawline);
4979 fix_delete_line($fixlinenr, $rawline);
4980 my $fixedline = $prevrawline;
4981 $fixedline =~ s/"\s*$//;
4982 $fixedline .= substr($extracted_string, 1) . trim($comma_close);
4983 fix_insert_line($fixlinenr - 1, $fixedline);
4984 $fixedline = $rawline;
4985 $fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//;
4986 if ($fixedline !~ /\+\s*$/) {
4987 fix_insert_line($fixlinenr, $fixedline);
4988 }
4989 $last_coalesced_string_linenr = $linenr;
4990 }
4991 }
4992
4993# check for missing a space in a string concatenation
4994 if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
4995 WARN('MISSING_SPACE',
4996 "break quoted strings at a space character\n" . $hereprev);
4997 }
4998
4999# check for spaces before a quoted newline
5000 if ($rawline =~ /^.*\".*\s\\n/) {
5001 if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
5002 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
5003 $fix) {
5004 $fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
5005 }
5006
5007 }
5008
f17dba4f 5009# concatenated string without spaces between elements
33acb54a 5010 if ($line =~ /$String[A-Z_]/ || $line =~ /[A-Za-z0-9_]$String/) {
f17dba4f
JP
5011 CHK("CONCATENATED_STRING",
5012 "Concatenated strings should use spaces between elements\n" . $herecurr);
5013 }
5014
90ad30e5 5015# uncoalesced string fragments
33acb54a 5016 if ($line =~ /$String\s*"/) {
90ad30e5
JP
5017 WARN("STRING_FRAGMENTS",
5018 "Consecutive strings are generally better as a single string\n" . $herecurr);
5019 }
5020
6e300757 5021# check for %L{u,d,i} and 0x%[udi] in strings
5e4f6ba5
JP
5022 my $string;
5023 while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
5024 $string = substr($rawline, $-[1], $+[1] - $-[1]);
5025 $string =~ s/%%/__/g;
6e300757 5026 if ($string =~ /(?<!%)%[\*\d\.\$]*L[udi]/) {
5e4f6ba5
JP
5027 WARN("PRINTF_L",
5028 "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
5029 last;
5030 }
6e300757
JP
5031 if ($string =~ /0x%[\*\d\.\$\Llzth]*[udi]/) {
5032 ERROR("PRINTF_0xDECIMAL",
5033 "Prefixing 0x with decimal output is defective\n" . $herecurr);
5034 }
5e4f6ba5
JP
5035 }
5036
5037# check for line continuations in quoted strings with odd counts of "
5038 if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
5039 WARN("LINE_CONTINUATIONS",
5040 "Avoid line continuations in quoted strings\n" . $herecurr);
5041 }
5042
00df344f 5043# warn about #if 0
c45dcabd 5044 if ($line =~ /^.\s*\#\s*if\s+0\b/) {
000d1cc1
JP
5045 CHK("REDUNDANT_CODE",
5046 "if this code is redundant consider removing it\n" .
de7d4f0e 5047 $herecurr);
4a0df2ef
AW
5048 }
5049
03df4b51
AW
5050# check for needless "if (<foo>) fn(<foo>)" uses
5051 if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
100425de
JP
5052 my $tested = quotemeta($1);
5053 my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;';
5054 if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) {
5055 my $func = $1;
5056 if (WARN('NEEDLESS_IF',
5057 "$func(NULL) is safe and this check is probably not required\n" . $hereprev) &&
5058 $fix) {
5059 my $do_fix = 1;
5060 my $leading_tabs = "";
5061 my $new_leading_tabs = "";
5062 if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) {
5063 $leading_tabs = $1;
5064 } else {
5065 $do_fix = 0;
5066 }
5067 if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) {
5068 $new_leading_tabs = $1;
5069 if (length($leading_tabs) + 1 ne length($new_leading_tabs)) {
5070 $do_fix = 0;
5071 }
5072 } else {
5073 $do_fix = 0;
5074 }
5075 if ($do_fix) {
5076 fix_delete_line($fixlinenr - 1, $prevrawline);
5077 $fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/;
5078 }
5079 }
4c432a8f
GKH
5080 }
5081 }
f0a594c1 5082
ebfdc409
JP
5083# check for unnecessary "Out of Memory" messages
5084 if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
5085 $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
5086 (defined $1 || defined $3) &&
5087 $linenr > 3) {
5088 my $testval = $2;
5089 my $testline = $lines[$linenr - 3];
5090
5091 my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
5092# print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
5093
5094 if ($c =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|(?:dev_)?alloc_skb)/) {
5095 WARN("OOM_MESSAGE",
5096 "Possible unnecessary 'out of memory' message\n" . $hereprev);
5097 }
5098 }
5099
f78d98f6 5100# check for logging functions with KERN_<LEVEL>
dcaf1123 5101 if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
f78d98f6
JP
5102 $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) {
5103 my $level = $1;
5104 if (WARN("UNNECESSARY_KERN_LEVEL",
5105 "Possible unnecessary $level\n" . $herecurr) &&
5106 $fix) {
5107 $fixed[$fixlinenr] =~ s/\s*$level\s*//;
5108 }
5109 }
5110
abb08a53
JP
5111# check for mask then right shift without a parentheses
5112 if ($^V && $^V ge 5.10.0 &&
5113 $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
5114 $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so
5115 WARN("MASK_THEN_SHIFT",
5116 "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr);
5117 }
5118
b75ac618
JP
5119# check for pointer comparisons to NULL
5120 if ($^V && $^V ge 5.10.0) {
5121 while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) {
5122 my $val = $1;
5123 my $equal = "!";
5124 $equal = "" if ($4 eq "!=");
5125 if (CHK("COMPARISON_TO_NULL",
5126 "Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) &&
5127 $fix) {
5128 $fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/;
5129 }
5130 }
5131 }
5132
8716de38
JP
5133# check for bad placement of section $InitAttribute (e.g.: __initdata)
5134 if ($line =~ /(\b$InitAttribute\b)/) {
5135 my $attr = $1;
5136 if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
5137 my $ptr = $1;
5138 my $var = $2;
5139 if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
5140 ERROR("MISPLACED_INIT",
5141 "$attr should be placed after $var\n" . $herecurr)) ||
5142 ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
5143 WARN("MISPLACED_INIT",
5144 "$attr should be placed after $var\n" . $herecurr))) &&
5145 $fix) {
194f66fc 5146 $fixed[$fixlinenr] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e;
8716de38
JP
5147 }
5148 }
5149 }
5150
e970b884
JP
5151# check for $InitAttributeData (ie: __initdata) with const
5152 if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
5153 my $attr = $1;
5154 $attr =~ /($InitAttributePrefix)(.*)/;
5155 my $attr_prefix = $1;
5156 my $attr_type = $2;
5157 if (ERROR("INIT_ATTRIBUTE",
5158 "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
5159 $fix) {
194f66fc 5160 $fixed[$fixlinenr] =~
e970b884
JP
5161 s/$InitAttributeData/${attr_prefix}initconst/;
5162 }
5163 }
5164
5165# check for $InitAttributeConst (ie: __initconst) without const
5166 if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
5167 my $attr = $1;
5168 if (ERROR("INIT_ATTRIBUTE",
5169 "Use of $attr requires a separate use of const\n" . $herecurr) &&
5170 $fix) {
194f66fc 5171 my $lead = $fixed[$fixlinenr] =~
e970b884
JP
5172 /(^\+\s*(?:static\s+))/;
5173 $lead = rtrim($1);
5174 $lead = "$lead " if ($lead !~ /^\+$/);
5175 $lead = "${lead}const ";
194f66fc 5176 $fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
e970b884
JP
5177 }
5178 }
5179
c17893c7
JP
5180# check for __read_mostly with const non-pointer (should just be const)
5181 if ($line =~ /\b__read_mostly\b/ &&
5182 $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) {
5183 if (ERROR("CONST_READ_MOSTLY",
5184 "Invalid use of __read_mostly with const type\n" . $herecurr) &&
5185 $fix) {
5186 $fixed[$fixlinenr] =~ s/\s+__read_mostly\b//;
5187 }
5188 }
5189
fbdb8138
JP
5190# don't use __constant_<foo> functions outside of include/uapi/
5191 if ($realfile !~ m@^include/uapi/@ &&
5192 $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
5193 my $constant_func = $1;
5194 my $func = $constant_func;
5195 $func =~ s/^__constant_//;
5196 if (WARN("CONSTANT_CONVERSION",
5197 "$constant_func should be $func\n" . $herecurr) &&
5198 $fix) {
194f66fc 5199 $fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
fbdb8138
JP
5200 }
5201 }
5202
1a15a250 5203# prefer usleep_range over udelay
37581c28 5204 if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
43c1d77c 5205 my $delay = $1;
1a15a250 5206 # ignore udelay's < 10, however
43c1d77c 5207 if (! ($delay < 10) ) {
000d1cc1 5208 CHK("USLEEP_RANGE",
43c1d77c
JP
5209 "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);
5210 }
5211 if ($delay > 2000) {
5212 WARN("LONG_UDELAY",
5213 "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
1a15a250
PP
5214 }
5215 }
5216
09ef8725
PP
5217# warn about unexpectedly long msleep's
5218 if ($line =~ /\bmsleep\s*\((\d+)\);/) {
5219 if ($1 < 20) {
000d1cc1 5220 WARN("MSLEEP",
43c1d77c 5221 "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);
09ef8725
PP
5222 }
5223 }
5224
36ec1939
JP
5225# check for comparisons of jiffies
5226 if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
5227 WARN("JIFFIES_COMPARISON",
5228 "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
5229 }
5230
9d7a34a5
JP
5231# check for comparisons of get_jiffies_64()
5232 if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
5233 WARN("JIFFIES_COMPARISON",
5234 "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
5235 }
5236
00df344f 5237# warn about #ifdefs in C files
c45dcabd 5238# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344f
AW
5239# print "#ifdef in C files should be avoided\n";
5240# print "$herecurr";
5241# $clean = 0;
5242# }
5243
22f2a2ef 5244# warn about spacing in #ifdefs
c45dcabd 5245 if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
3705ce5b
JP
5246 if (ERROR("SPACING",
5247 "exactly one space required after that #$1\n" . $herecurr) &&
5248 $fix) {
194f66fc 5249 $fixed[$fixlinenr] =~
3705ce5b
JP
5250 s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
5251 }
5252
22f2a2ef
AW
5253 }
5254
4a0df2ef 5255# check for spinlock_t definitions without a comment.
171ae1a4
AW
5256 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
5257 $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef
AW
5258 my $which = $1;
5259 if (!ctx_has_comment($first_line, $linenr)) {
000d1cc1
JP
5260 CHK("UNCOMMENTED_DEFINITION",
5261 "$1 definition without comment\n" . $herecurr);
4a0df2ef
AW
5262 }
5263 }
5264# check for memory barriers without a comment.
402c2553
MT
5265
5266 my $barriers = qr{
5267 mb|
5268 rmb|
5269 wmb|
5270 read_barrier_depends
5271 }x;
5272 my $barrier_stems = qr{
5273 mb__before_atomic|
5274 mb__after_atomic|
5275 store_release|
5276 load_acquire|
5277 store_mb|
5278 (?:$barriers)
5279 }x;
5280 my $all_barriers = qr{
5281 (?:$barriers)|
43e361f2
MT
5282 smp_(?:$barrier_stems)|
5283 virt_(?:$barrier_stems)
402c2553
MT
5284 }x;
5285
5286 if ($line =~ /\b(?:$all_barriers)\s*\(/) {
4a0df2ef 5287 if (!ctx_has_comment($first_line, $linenr)) {
c1fd7bb9
JP
5288 WARN("MEMORY_BARRIER",
5289 "memory barrier without comment\n" . $herecurr);
4a0df2ef
AW
5290 }
5291 }
3ad81779 5292
f4073b0f
MT
5293 my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x;
5294
5295 if ($realfile !~ m@^include/asm-generic/@ &&
5296 $realfile !~ m@/barrier\.h$@ &&
5297 $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ &&
5298 $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) {
5299 WARN("MEMORY_BARRIER",
5300 "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr);
5301 }
5302
cb426e99
JP
5303# check for waitqueue_active without a comment.
5304 if ($line =~ /\bwaitqueue_active\s*\(/) {
5305 if (!ctx_has_comment($first_line, $linenr)) {
5306 WARN("WAITQUEUE_ACTIVE",
5307 "waitqueue_active without comment\n" . $herecurr);
5308 }
5309 }
3ad81779
PM
5310
5311# Check for expedited grace periods that interrupt non-idle non-nohz
5312# online CPUs. These expedited can therefore degrade real-time response
5313# if used carelessly, and should be avoided where not absolutely
5314# needed. It is always OK to use synchronize_rcu_expedited() and
5315# synchronize_sched_expedited() at boot time (before real-time applications
5316# start) and in error situations where real-time response is compromised in
5317# any case. Note that synchronize_srcu_expedited() does -not- interrupt
5318# other CPUs, so don't warn on uses of synchronize_srcu_expedited().
5319# Of course, nothing comes for free, and srcu_read_lock() and
5320# srcu_read_unlock() do contain full memory barriers in payment for
5321# synchronize_srcu_expedited() non-interruption properties.
5322 if ($line =~ /\b(synchronize_rcu_expedited|synchronize_sched_expedited)\(/) {
5323 WARN("EXPEDITED_RCU_GRACE_PERIOD",
5324 "expedited RCU grace periods should be avoided where they can degrade real-time response\n" . $herecurr);
5325
5326 }
5327
4a0df2ef 5328# check of hardware specific defines
c45dcabd 5329 if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
000d1cc1
JP
5330 CHK("ARCH_DEFINES",
5331 "architecture specific defines should be avoided\n" . $herecurr);
0a920b5b 5332 }
653d4876 5333
d4977c78
TK
5334# Check that the storage class is at the beginning of a declaration
5335 if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
000d1cc1
JP
5336 WARN("STORAGE_CLASS",
5337 "storage class should be at the beginning of the declaration\n" . $herecurr)
d4977c78
TK
5338 }
5339
de7d4f0e
AW
5340# check the location of the inline attribute, that it is between
5341# storage class and type.
9c0ca6f9
AW
5342 if ($line =~ /\b$Type\s+$Inline\b/ ||
5343 $line =~ /\b$Inline\s+$Storage\b/) {
000d1cc1
JP
5344 ERROR("INLINE_LOCATION",
5345 "inline keyword should sit between storage class and type\n" . $herecurr);
de7d4f0e
AW
5346 }
5347
8905a67c 5348# Check for __inline__ and __inline, prefer inline
2b7ab453
JP
5349 if ($realfile !~ m@\binclude/uapi/@ &&
5350 $line =~ /\b(__inline__|__inline)\b/) {
d5e616fc
JP
5351 if (WARN("INLINE",
5352 "plain inline is preferred over $1\n" . $herecurr) &&
5353 $fix) {
194f66fc 5354 $fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
d5e616fc
JP
5355
5356 }
8905a67c
AW
5357 }
5358
3d130fd0 5359# Check for __attribute__ packed, prefer __packed
2b7ab453
JP
5360 if ($realfile !~ m@\binclude/uapi/@ &&
5361 $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
000d1cc1
JP
5362 WARN("PREFER_PACKED",
5363 "__packed is preferred over __attribute__((packed))\n" . $herecurr);
3d130fd0
JP
5364 }
5365
39b7e287 5366# Check for __attribute__ aligned, prefer __aligned
2b7ab453
JP
5367 if ($realfile !~ m@\binclude/uapi/@ &&
5368 $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
000d1cc1
JP
5369 WARN("PREFER_ALIGNED",
5370 "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
39b7e287
JP
5371 }
5372
5f14d3bd 5373# Check for __attribute__ format(printf, prefer __printf
2b7ab453
JP
5374 if ($realfile !~ m@\binclude/uapi/@ &&
5375 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
d5e616fc
JP
5376 if (WARN("PREFER_PRINTF",
5377 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
5378 $fix) {
194f66fc 5379 $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
d5e616fc
JP
5380
5381 }
5f14d3bd
JP
5382 }
5383
6061d949 5384# Check for __attribute__ format(scanf, prefer __scanf
2b7ab453
JP
5385 if ($realfile !~ m@\binclude/uapi/@ &&
5386 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
d5e616fc
JP
5387 if (WARN("PREFER_SCANF",
5388 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
5389 $fix) {
194f66fc 5390 $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
d5e616fc 5391 }
6061d949
JP
5392 }
5393
619a908a
JP
5394# Check for __attribute__ weak, or __weak declarations (may have link issues)
5395 if ($^V && $^V ge 5.10.0 &&
5396 $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ &&
5397 ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ ||
5398 $line =~ /\b__weak\b/)) {
5399 ERROR("WEAK_DECLARATION",
5400 "Using weak declarations can have unintended link defects\n" . $herecurr);
5401 }
5402
e6176fa4
JP
5403# check for c99 types like uint8_t used outside of uapi/
5404 if ($realfile !~ m@\binclude/uapi/@ &&
5405 $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) {
5406 my $type = $1;
5407 if ($type =~ /\b($typeC99Typedefs)\b/) {
5408 $type = $1;
5409 my $kernel_type = 'u';
5410 $kernel_type = 's' if ($type =~ /^_*[si]/);
5411 $type =~ /(\d+)/;
5412 $kernel_type .= $1;
5413 if (CHK("PREFER_KERNEL_TYPES",
5414 "Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) &&
5415 $fix) {
5416 $fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/;
5417 }
5418 }
5419 }
5420
938224b5
JP
5421# check for cast of C90 native int or longer types constants
5422 if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) {
5423 my $cast = $1;
5424 my $const = $2;
5425 if (WARN("TYPECAST_INT_CONSTANT",
5426 "Unnecessary typecast of c90 int constant\n" . $herecurr) &&
5427 $fix) {
5428 my $suffix = "";
5429 my $newconst = $const;
5430 $newconst =~ s/${Int_type}$//;
5431 $suffix .= 'U' if ($cast =~ /\bunsigned\b/);
5432 if ($cast =~ /\blong\s+long\b/) {
5433 $suffix .= 'LL';
5434 } elsif ($cast =~ /\blong\b/) {
5435 $suffix .= 'L';
5436 }
5437 $fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/;
5438 }
5439 }
5440
8f53a9b8
JP
5441# check for sizeof(&)
5442 if ($line =~ /\bsizeof\s*\(\s*\&/) {
000d1cc1
JP
5443 WARN("SIZEOF_ADDRESS",
5444 "sizeof(& should be avoided\n" . $herecurr);
8f53a9b8
JP
5445 }
5446
66c80b60
JP
5447# check for sizeof without parenthesis
5448 if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
d5e616fc
JP
5449 if (WARN("SIZEOF_PARENTHESIS",
5450 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
5451 $fix) {
194f66fc 5452 $fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
d5e616fc 5453 }
66c80b60
JP
5454 }
5455
88982fea
JP
5456# check for struct spinlock declarations
5457 if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
5458 WARN("USE_SPINLOCK_T",
5459 "struct spinlock should be spinlock_t\n" . $herecurr);
5460 }
5461
a6962d72 5462# check for seq_printf uses that could be seq_puts
06668727 5463 if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
a6962d72 5464 my $fmt = get_quoted_string($line, $rawline);
caac1d5f
HA
5465 $fmt =~ s/%%//g;
5466 if ($fmt !~ /%/) {
d5e616fc
JP
5467 if (WARN("PREFER_SEQ_PUTS",
5468 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
5469 $fix) {
194f66fc 5470 $fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
d5e616fc 5471 }
a6962d72
JP
5472 }
5473 }
5474
554e165c 5475# Check for misused memsets
d1fe9c09
JP
5476 if ($^V && $^V ge 5.10.0 &&
5477 defined $stat &&
9e20a853 5478 $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
d7c76ba7
JP
5479
5480 my $ms_addr = $2;
d1fe9c09
JP
5481 my $ms_val = $7;
5482 my $ms_size = $12;
554e165c 5483
554e165c
AW
5484 if ($ms_size =~ /^(0x|)0$/i) {
5485 ERROR("MEMSET",
d7c76ba7 5486 "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
554e165c
AW
5487 } elsif ($ms_size =~ /^(0x|)1$/i) {
5488 WARN("MEMSET",
d7c76ba7
JP
5489 "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
5490 }
5491 }
5492
98a9bba5
JP
5493# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
5494 if ($^V && $^V ge 5.10.0 &&
10895d2c
MK
5495 defined $stat &&
5496 $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
98a9bba5 5497 if (WARN("PREFER_ETHER_ADDR_COPY",
10895d2c 5498 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") &&
98a9bba5 5499 $fix) {
194f66fc 5500 $fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
98a9bba5
JP
5501 }
5502 }
5503
b6117d17
MK
5504# Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
5505 if ($^V && $^V ge 5.10.0 &&
5506 defined $stat &&
5507 $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
5508 WARN("PREFER_ETHER_ADDR_EQUAL",
5509 "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n")
5510 }
5511
8617cd09
MK
5512# check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr
5513# check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr
5514 if ($^V && $^V ge 5.10.0 &&
5515 defined $stat &&
5516 $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
5517
5518 my $ms_val = $7;
5519
5520 if ($ms_val =~ /^(?:0x|)0+$/i) {
5521 if (WARN("PREFER_ETH_ZERO_ADDR",
5522 "Prefer eth_zero_addr over memset()\n" . "$here\n$stat\n") &&
5523 $fix) {
5524 $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/;
5525 }
5526 } elsif ($ms_val =~ /^(?:0xff|255)$/i) {
5527 if (WARN("PREFER_ETH_BROADCAST_ADDR",
5528 "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") &&
5529 $fix) {
5530 $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/;
5531 }
5532 }
5533 }
5534
d7c76ba7 5535# typecasts on min/max could be min_t/max_t
d1fe9c09
JP
5536 if ($^V && $^V ge 5.10.0 &&
5537 defined $stat &&
d7c76ba7 5538 $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
d1fe9c09 5539 if (defined $2 || defined $7) {
d7c76ba7
JP
5540 my $call = $1;
5541 my $cast1 = deparenthesize($2);
5542 my $arg1 = $3;
d1fe9c09
JP
5543 my $cast2 = deparenthesize($7);
5544 my $arg2 = $8;
d7c76ba7
JP
5545 my $cast;
5546
d1fe9c09 5547 if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
d7c76ba7
JP
5548 $cast = "$cast1 or $cast2";
5549 } elsif ($cast1 ne "") {
5550 $cast = $cast1;
5551 } else {
5552 $cast = $cast2;
5553 }
5554 WARN("MINMAX",
5555 "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
554e165c
AW
5556 }
5557 }
5558
4a273195
JP
5559# check usleep_range arguments
5560 if ($^V && $^V ge 5.10.0 &&
5561 defined $stat &&
5562 $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
5563 my $min = $1;
5564 my $max = $7;
5565 if ($min eq $max) {
5566 WARN("USLEEP_RANGE",
5567 "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
5568 } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
5569 $min > $max) {
5570 WARN("USLEEP_RANGE",
5571 "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
5572 }
5573 }
5574
823b794c
JP
5575# check for naked sscanf
5576 if ($^V && $^V ge 5.10.0 &&
5577 defined $stat &&
6c8bd707 5578 $line =~ /\bsscanf\b/ &&
823b794c
JP
5579 ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
5580 $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
5581 $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
5582 my $lc = $stat =~ tr@\n@@;
5583 $lc = $lc + $linenr;
5584 my $stat_real = raw_line($linenr, 0);
5585 for (my $count = $linenr + 1; $count <= $lc; $count++) {
5586 $stat_real = $stat_real . "\n" . raw_line($count, 0);
5587 }
5588 WARN("NAKED_SSCANF",
5589 "unchecked sscanf return value\n" . "$here\n$stat_real\n");
5590 }
5591
afc819ab
JP
5592# check for simple sscanf that should be kstrto<foo>
5593 if ($^V && $^V ge 5.10.0 &&
5594 defined $stat &&
5595 $line =~ /\bsscanf\b/) {
5596 my $lc = $stat =~ tr@\n@@;
5597 $lc = $lc + $linenr;
5598 my $stat_real = raw_line($linenr, 0);
5599 for (my $count = $linenr + 1; $count <= $lc; $count++) {
5600 $stat_real = $stat_real . "\n" . raw_line($count, 0);
5601 }
5602 if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
5603 my $format = $6;
5604 my $count = $format =~ tr@%@%@;
5605 if ($count == 1 &&
5606 $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
5607 WARN("SSCANF_TO_KSTRTO",
5608 "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
5609 }
5610 }
5611 }
5612
70dc8a48
JP
5613# check for new externs in .h files.
5614 if ($realfile =~ /\.h$/ &&
5615 $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
d1d85780
JP
5616 if (CHK("AVOID_EXTERNS",
5617 "extern prototypes should be avoided in .h files\n" . $herecurr) &&
70dc8a48 5618 $fix) {
194f66fc 5619 $fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
70dc8a48
JP
5620 }
5621 }
5622
de7d4f0e 5623# check for new externs in .c files.
171ae1a4 5624 if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd 5625 $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a4 5626 {
c45dcabd
AW
5627 my $function_name = $1;
5628 my $paren_space = $2;
171ae1a4
AW
5629
5630 my $s = $stat;
5631 if (defined $cond) {
5632 substr($s, 0, length($cond), '');
5633 }
c45dcabd
AW
5634 if ($s =~ /^\s*;/ &&
5635 $function_name ne 'uninitialized_var')
5636 {
000d1cc1
JP
5637 WARN("AVOID_EXTERNS",
5638 "externs should be avoided in .c files\n" . $herecurr);
171ae1a4
AW
5639 }
5640
5641 if ($paren_space =~ /\n/) {
000d1cc1
JP
5642 WARN("FUNCTION_ARGUMENTS",
5643 "arguments for function declarations should follow identifier\n" . $herecurr);
171ae1a4 5644 }
9c9ba34e
AW
5645
5646 } elsif ($realfile =~ /\.c$/ && defined $stat &&
5647 $stat =~ /^.\s*extern\s+/)
5648 {
000d1cc1
JP
5649 WARN("AVOID_EXTERNS",
5650 "externs should be avoided in .c files\n" . $herecurr);
de7d4f0e
AW
5651 }
5652
5653# checks for new __setup's
5654 if ($rawline =~ /\b__setup\("([^"]*)"/) {
5655 my $name = $1;
5656
5657 if (!grep(/$name/, @setup_docs)) {
000d1cc1
JP
5658 CHK("UNDOCUMENTED_SETUP",
5659 "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
de7d4f0e 5660 }
653d4876 5661 }
9c0ca6f9
AW
5662
5663# check for pointless casting of kmalloc return
caf2a54f 5664 if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
000d1cc1
JP
5665 WARN("UNNECESSARY_CASTS",
5666 "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
9c0ca6f9 5667 }
13214adf 5668
a640d25c
JP
5669# alloc style
5670# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
5671 if ($^V && $^V ge 5.10.0 &&
5672 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
5673 CHK("ALLOC_SIZEOF_STRUCT",
5674 "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
5675 }
5676
60a55369
JP
5677# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
5678 if ($^V && $^V ge 5.10.0 &&
e367455a 5679 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
60a55369
JP
5680 my $oldfunc = $3;
5681 my $a1 = $4;
5682 my $a2 = $10;
5683 my $newfunc = "kmalloc_array";
5684 $newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
e367455a
JP
5685 my $r1 = $a1;
5686 my $r2 = $a2;
5687 if ($a1 =~ /^sizeof\s*\S/) {
5688 $r1 = $a2;
5689 $r2 = $a1;
5690 }
5691 if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
5692 !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
60a55369
JP
5693 if (WARN("ALLOC_WITH_MULTIPLY",
5694 "Prefer $newfunc over $oldfunc with multiply\n" . $herecurr) &&
5695 $fix) {
194f66fc 5696 $fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
60a55369
JP
5697
5698 }
5699 }
5700 }
5701
972fdea2
JP
5702# check for krealloc arg reuse
5703 if ($^V && $^V ge 5.10.0 &&
5704 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
5705 WARN("KREALLOC_ARG_REUSE",
5706 "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
5707 }
5708
5ce59ae0
JP
5709# check for alloc argument mismatch
5710 if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
5711 WARN("ALLOC_ARRAY_ARGS",
5712 "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
5713 }
5714
caf2a54f
JP
5715# check for multiple semicolons
5716 if ($line =~ /;\s*;\s*$/) {
d5e616fc
JP
5717 if (WARN("ONE_SEMICOLON",
5718 "Statements terminations use 1 semicolon\n" . $herecurr) &&
5719 $fix) {
194f66fc 5720 $fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
d5e616fc 5721 }
d1e2ad07
JP
5722 }
5723
0ab90191
JP
5724# check for #defines like: 1 << <digit> that could be BIT(digit)
5725 if ($line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
5726 my $ull = "";
5727 $ull = "_ULL" if (defined($1) && $1 =~ /ll/i);
5728 if (CHK("BIT_MACRO",
5729 "Prefer using the BIT$ull macro\n" . $herecurr) &&
5730 $fix) {
5731 $fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/;
5732 }
5733 }
5734
2d632745
JP
5735# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
5736 if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
5737 my $config = $1;
5738 if (WARN("PREFER_IS_ENABLED",
5739 "Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE\n" . $herecurr) &&
5740 $fix) {
5741 $fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
5742 }
5743 }
5744
e81f239b 5745# check for case / default statements not preceded by break/fallthrough/switch
c34c09a8
JP
5746 if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
5747 my $has_break = 0;
5748 my $has_statement = 0;
5749 my $count = 0;
5750 my $prevline = $linenr;
e81f239b 5751 while ($prevline > 1 && ($file || $count < 3) && !$has_break) {
c34c09a8
JP
5752 $prevline--;
5753 my $rline = $rawlines[$prevline - 1];
5754 my $fline = $lines[$prevline - 1];
5755 last if ($fline =~ /^\@\@/);
5756 next if ($fline =~ /^\-/);
5757 next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
5758 $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
5759 next if ($fline =~ /^.[\s$;]*$/);
5760 $has_statement = 1;
5761 $count++;
5762 $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);
5763 }
5764 if (!$has_break && $has_statement) {
5765 WARN("MISSING_BREAK",
5766 "Possible switch case/default not preceeded by break or fallthrough comment\n" . $herecurr);
5767 }
5768 }
5769
d1e2ad07
JP
5770# check for switch/default statements without a break;
5771 if ($^V && $^V ge 5.10.0 &&
5772 defined $stat &&
5773 $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
5774 my $ctx = '';
5775 my $herectx = $here . "\n";
5776 my $cnt = statement_rawlines($stat);
5777 for (my $n = 0; $n < $cnt; $n++) {
5778 $herectx .= raw_line($linenr, $n) . "\n";
5779 }
5780 WARN("DEFAULT_NO_BREAK",
5781 "switch default: should use break\n" . $herectx);
caf2a54f
JP
5782 }
5783
13214adf 5784# check for gcc specific __FUNCTION__
d5e616fc
JP
5785 if ($line =~ /\b__FUNCTION__\b/) {
5786 if (WARN("USE_FUNC",
5787 "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) &&
5788 $fix) {
194f66fc 5789 $fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
d5e616fc 5790 }
13214adf 5791 }
773647a0 5792
62ec818f
JP
5793# check for uses of __DATE__, __TIME__, __TIMESTAMP__
5794 while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) {
5795 ERROR("DATE_TIME",
5796 "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr);
5797 }
5798
2c92488a
JP
5799# check for use of yield()
5800 if ($line =~ /\byield\s*\(\s*\)/) {
5801 WARN("YIELD",
5802 "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr);
5803 }
5804
179f8f40
JP
5805# check for comparisons against true and false
5806 if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
5807 my $lead = $1;
5808 my $arg = $2;
5809 my $test = $3;
5810 my $otype = $4;
5811 my $trail = $5;
5812 my $op = "!";
5813
5814 ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
5815
5816 my $type = lc($otype);
5817 if ($type =~ /^(?:true|false)$/) {
5818 if (("$test" eq "==" && "$type" eq "true") ||
5819 ("$test" eq "!=" && "$type" eq "false")) {
5820 $op = "";
5821 }
5822
5823 CHK("BOOL_COMPARISON",
5824 "Using comparison to $otype is error prone\n" . $herecurr);
5825
5826## maybe suggesting a correct construct would better
5827## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
5828
5829 }
5830 }
5831
4882720b
TG
5832# check for semaphores initialized locked
5833 if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
000d1cc1
JP
5834 WARN("CONSIDER_COMPLETION",
5835 "consider using a completion\n" . $herecurr);
773647a0 5836 }
6712d858 5837
67d0a075
JP
5838# recommend kstrto* over simple_strto* and strict_strto*
5839 if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
000d1cc1 5840 WARN("CONSIDER_KSTRTO",
67d0a075 5841 "$1 is obsolete, use k$3 instead\n" . $herecurr);
773647a0 5842 }
6712d858 5843
ae3ccc46 5844# check for __initcall(), use device_initcall() explicitly or more appropriate function please
f3db6639 5845 if ($line =~ /^.\s*__initcall\s*\(/) {
000d1cc1 5846 WARN("USE_DEVICE_INITCALL",
ae3ccc46 5847 "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
f3db6639 5848 }
6712d858 5849
0f3c5aab
JP
5850# check for various structs that are normally const (ops, kgdb, device_tree)
5851 my $const_structs = qr{
5852 acpi_dock_ops|
79404849
ER
5853 address_space_operations|
5854 backlight_ops|
5855 block_device_operations|
5856 dentry_operations|
5857 dev_pm_ops|
5858 dma_map_ops|
5859 extent_io_ops|
5860 file_lock_operations|
5861 file_operations|
5862 hv_ops|
5863 ide_dma_ops|
5864 intel_dvo_dev_ops|
5865 item_operations|
5866 iwl_ops|
5867 kgdb_arch|
5868 kgdb_io|
5869 kset_uevent_ops|
5870 lock_manager_operations|
5871 microcode_ops|
5872 mtrr_ops|
5873 neigh_ops|
5874 nlmsvc_binding|
0f3c5aab 5875 of_device_id|
79404849
ER
5876 pci_raw_ops|
5877 pipe_buf_operations|
5878 platform_hibernation_ops|
5879 platform_suspend_ops|
5880 proto_ops|
5881 rpc_pipe_ops|
5882 seq_operations|
5883 snd_ac97_build_ops|
5884 soc_pcmcia_socket_ops|
5885 stacktrace_ops|
5886 sysfs_ops|
5887 tty_operations|
6d07d01b 5888 uart_ops|
79404849
ER
5889 usb_mon_operations|
5890 wd_ops}x;
6903ffb2 5891 if ($line !~ /\bconst\b/ &&
0f3c5aab 5892 $line =~ /\bstruct\s+($const_structs)\b/) {
000d1cc1
JP
5893 WARN("CONST_STRUCT",
5894 "struct $1 should normally be const\n" .
6903ffb2 5895 $herecurr);
2b6db5cb 5896 }
773647a0
AW
5897
5898# use of NR_CPUS is usually wrong
5899# ignore definitions of NR_CPUS and usage to define arrays as likely right
5900 if ($line =~ /\bNR_CPUS\b/ &&
c45dcabd
AW
5901 $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
5902 $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a4
AW
5903 $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
5904 $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
5905 $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a0 5906 {
000d1cc1
JP
5907 WARN("NR_CPUS",
5908 "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
773647a0 5909 }
9c9ba34e 5910
52ea8506
JP
5911# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
5912 if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
5913 ERROR("DEFINE_ARCH_HAS",
5914 "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
5915 }
5916
acd9362c
JP
5917# likely/unlikely comparisons similar to "(likely(foo) > 0)"
5918 if ($^V && $^V ge 5.10.0 &&
5919 $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
5920 WARN("LIKELY_MISUSE",
5921 "Using $1 should generally have parentheses around the comparison\n" . $herecurr);
5922 }
5923
691d77b6
AW
5924# whine mightly about in_atomic
5925 if ($line =~ /\bin_atomic\s*\(/) {
5926 if ($realfile =~ m@^drivers/@) {
000d1cc1
JP
5927 ERROR("IN_ATOMIC",
5928 "do not use in_atomic in drivers\n" . $herecurr);
f4a87736 5929 } elsif ($realfile !~ m@^kernel/@) {
000d1cc1
JP
5930 WARN("IN_ATOMIC",
5931 "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
691d77b6
AW
5932 }
5933 }
1704f47b 5934
481aea5c
JP
5935# whine about ACCESS_ONCE
5936 if ($^V && $^V ge 5.10.0 &&
5937 $line =~ /\bACCESS_ONCE\s*$balanced_parens\s*(=(?!=))?\s*($FuncArg)?/) {
5938 my $par = $1;
5939 my $eq = $2;
5940 my $fun = $3;
5941 $par =~ s/^\(\s*(.*)\s*\)$/$1/;
5942 if (defined($eq)) {
5943 if (WARN("PREFER_WRITE_ONCE",
5944 "Prefer WRITE_ONCE(<FOO>, <BAR>) over ACCESS_ONCE(<FOO>) = <BAR>\n" . $herecurr) &&
5945 $fix) {
5946 $fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)\s*$eq\s*\Q$fun\E/WRITE_ONCE($par, $fun)/;
5947 }
5948 } else {
5949 if (WARN("PREFER_READ_ONCE",
5950 "Prefer READ_ONCE(<FOO>) over ACCESS_ONCE(<FOO>)\n" . $herecurr) &&
5951 $fix) {
5952 $fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)/READ_ONCE($par)/;
5953 }
5954 }
5955 }
5956
1704f47b
PZ
5957# check for lockdep_set_novalidate_class
5958 if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
5959 $line =~ /__lockdep_no_validate__\s*\)/ ) {
5960 if ($realfile !~ m@^kernel/lockdep@ &&
5961 $realfile !~ m@^include/linux/lockdep@ &&
5962 $realfile !~ m@^drivers/base/core@) {
000d1cc1
JP
5963 ERROR("LOCKDEP",
5964 "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
1704f47b
PZ
5965 }
5966 }
88f8831c 5967
b392c64f
JP
5968 if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ ||
5969 $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) {
000d1cc1
JP
5970 WARN("EXPORTED_WORLD_WRITABLE",
5971 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
88f8831c 5972 }
2435880f 5973
515a235e
JP
5974# Mode permission misuses where it seems decimal should be octal
5975# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
5976 if ($^V && $^V ge 5.10.0 &&
5977 $line =~ /$mode_perms_search/) {
5978 foreach my $entry (@mode_permission_funcs) {
5979 my $func = $entry->[0];
5980 my $arg_pos = $entry->[1];
5981
5982 my $skip_args = "";
5983 if ($arg_pos > 1) {
5984 $arg_pos--;
5985 $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
5986 }
5987 my $test = "\\b$func\\s*\\(${skip_args}([\\d]+)\\s*[,\\)]";
5988 if ($line =~ /$test/) {
5989 my $val = $1;
5990 $val = $6 if ($skip_args ne "");
5991
5992 if ($val !~ /^0$/ &&
5993 (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
5994 length($val) ne 4)) {
5995 ERROR("NON_OCTAL_PERMISSIONS",
5996 "Use 4 digit octal (0777) not decimal permissions\n" . $herecurr);
c0a5c898
JP
5997 } elsif ($val =~ /^$Octal$/ && (oct($val) & 02)) {
5998 ERROR("EXPORTED_WORLD_WRITABLE",
5999 "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
515a235e 6000 }
2435880f
JP
6001 }
6002 }
6003 }
5a6d20ce
BA
6004
6005# validate content of MODULE_LICENSE against list from include/linux/module.h
6006 if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) {
6007 my $extracted_string = get_quoted_string($line, $rawline);
6008 my $valid_licenses = qr{
6009 GPL|
6010 GPL\ v2|
6011 GPL\ and\ additional\ rights|
6012 Dual\ BSD/GPL|
6013 Dual\ MIT/GPL|
6014 Dual\ MPL/GPL|
6015 Proprietary
6016 }x;
6017 if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) {
6018 WARN("MODULE_LICENSE",
6019 "unknown module license " . $extracted_string . "\n" . $herecurr);
6020 }
6021 }
13214adf
AW
6022 }
6023
6024 # If we have no input at all, then there is nothing to report on
6025 # so just keep quiet.
6026 if ($#rawlines == -1) {
6027 exit(0);
0a920b5b
AW
6028 }
6029
8905a67c
AW
6030 # In mailback mode only produce a report in the negative, for
6031 # things that appear to be patches.
6032 if ($mailback && ($clean == 1 || !$is_patch)) {
6033 exit(0);
6034 }
6035
6036 # This is not a patch, and we are are in 'no-patch' mode so
6037 # just keep quiet.
6038 if (!$chk_patch && !$is_patch) {
6039 exit(0);
6040 }
6041
06330fc4 6042 if (!$is_patch && $file !~ /cover-letter\.patch$/) {
000d1cc1
JP
6043 ERROR("NOT_UNIFIED_DIFF",
6044 "Does not appear to be a unified-diff format patch\n");
0a920b5b 6045 }
34d8815f 6046 if ($is_patch && $filename ne '-' && $chk_signoff && $signoff == 0) {
000d1cc1
JP
6047 ERROR("MISSING_SIGN_OFF",
6048 "Missing Signed-off-by: line(s)\n");
0a920b5b
AW
6049 }
6050
8905a67c 6051 print report_dump();
13214adf
AW
6052 if ($summary && !($clean == 1 && $quiet == 1)) {
6053 print "$filename " if ($summary_file);
8905a67c
AW
6054 print "total: $cnt_error errors, $cnt_warn warnings, " .
6055 (($check)? "$cnt_chk checks, " : "") .
6056 "$cnt_lines lines checked\n";
f0a594c1 6057 }
8905a67c 6058
d2c0a235 6059 if ($quiet == 0) {
ef212196
JP
6060 # If there were any defects found and not already fixing them
6061 if (!$clean and !$fix) {
6062 print << "EOM"
6063
6064NOTE: For some of the reported defects, checkpatch may be able to
6065 mechanically convert to the typical style using --fix or --fix-inplace.
6066EOM
6067 }
d2c0a235
AW
6068 # If there were whitespace errors which cleanpatch can fix
6069 # then suggest that.
6070 if ($rpt_cleaners) {
b0781216 6071 $rpt_cleaners = 0;
d8469f16
JP
6072 print << "EOM"
6073
6074NOTE: Whitespace errors detected.
6075 You may wish to use scripts/cleanpatch or scripts/cleanfile
6076EOM
d2c0a235
AW
6077 }
6078 }
6079
d752fcc8
JP
6080 if ($clean == 0 && $fix &&
6081 ("@rawlines" ne "@fixed" ||
6082 $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
9624b8d6
JP
6083 my $newfile = $filename;
6084 $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
3705ce5b
JP
6085 my $linecount = 0;
6086 my $f;
6087
d752fcc8
JP
6088 @fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
6089
3705ce5b
JP
6090 open($f, '>', $newfile)
6091 or die "$P: Can't open $newfile for write\n";
6092 foreach my $fixed_line (@fixed) {
6093 $linecount++;
6094 if ($file) {
6095 if ($linecount > 3) {
6096 $fixed_line =~ s/^\+//;
d752fcc8 6097 print $f $fixed_line . "\n";
3705ce5b
JP
6098 }
6099 } else {
6100 print $f $fixed_line . "\n";
6101 }
6102 }
6103 close($f);
6104
6105 if (!$quiet) {
6106 print << "EOM";
d8469f16 6107
3705ce5b
JP
6108Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
6109
6110Do _NOT_ trust the results written to this file.
6111Do _NOT_ submit these changes without inspecting them for correctness.
6112
6113This EXPERIMENTAL file is simply a convenience to help rewrite patches.
6114No warranties, expressed or implied...
3705ce5b
JP
6115EOM
6116 }
6117 }
6118
d8469f16
JP
6119 if ($quiet == 0) {
6120 print "\n";
6121 if ($clean == 1) {
6122 print "$vname has no obvious style problems and is ready for submission.\n";
6123 } else {
6124 print "$vname has style problems, please review.\n";
6125 }
0a920b5b
AW
6126 }
6127 return $clean;
6128}