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