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