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