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