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