]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - scripts/checkpatch.pl
scripts: Switch to more portable Perl shebang
[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*\(|
f8422308
JP
736 (?:$Storage\s+)?LIST_HEAD\s*\(|
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
327953e9
CJ
2779# discourage the use of boolean for type definition attributes of Kconfig options
2780 if ($realfile =~ /Kconfig/ &&
2781 $line =~ /^\+\s*\bboolean\b/) {
2782 WARN("CONFIG_TYPE_BOOLEAN",
2783 "Use of boolean is deprecated, please use bool instead.\n" . $herecurr);
2784 }
2785
c68e5878
AL
2786 if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
2787 ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
2788 my $flag = $1;
2789 my $replacement = {
2790 'EXTRA_AFLAGS' => 'asflags-y',
2791 'EXTRA_CFLAGS' => 'ccflags-y',
2792 'EXTRA_CPPFLAGS' => 'cppflags-y',
2793 'EXTRA_LDFLAGS' => 'ldflags-y',
2794 };
2795
2796 WARN("DEPRECATED_VARIABLE",
2797 "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
2798 }
2799
bff5da43 2800# check for DT compatible documentation
7dd05b38
FV
2801 if (defined $root &&
2802 (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
2803 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
2804
bff5da43
RH
2805 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
2806
cc93319b
FV
2807 my $dt_path = $root . "/Documentation/devicetree/bindings/";
2808 my $vp_file = $dt_path . "vendor-prefixes.txt";
2809
bff5da43
RH
2810 foreach my $compat (@compats) {
2811 my $compat2 = $compat;
185d566b
RH
2812 $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
2813 my $compat3 = $compat;
2814 $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
2815 `grep -Erq "$compat|$compat2|$compat3" $dt_path`;
bff5da43
RH
2816 if ( $? >> 8 ) {
2817 WARN("UNDOCUMENTED_DT_STRING",
2818 "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
2819 }
2820
4fbf32a6
FV
2821 next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
2822 my $vendor = $1;
cc93319b 2823 `grep -Eq "^$vendor\\b" $vp_file`;
bff5da43
RH
2824 if ( $? >> 8 ) {
2825 WARN("UNDOCUMENTED_DT_STRING",
cc93319b 2826 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
bff5da43
RH
2827 }
2828 }
2829 }
2830
5368df20 2831# check we are in a valid source file if not then ignore this hunk
d6430f71 2832 next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
5368df20 2833
47e0c88b
JP
2834# line length limit (with some exclusions)
2835#
2836# There are a few types of lines that may extend beyond $max_line_length:
2837# logging functions like pr_info that end in a string
2838# lines with a single string
2839# #defines that are a single string
2840#
2841# There are 3 different line length message types:
2842# LONG_LINE_COMMENT a comment starts before but extends beyond $max_linelength
2843# LONG_LINE_STRING a string starts before but extends beyond $max_line_length
2844# LONG_LINE all other lines longer than $max_line_length
2845#
2846# if LONG_LINE is ignored, the other 2 types are also ignored
2847#
2848
b4749e96 2849 if ($line =~ /^\+/ && $length > $max_line_length) {
47e0c88b
JP
2850 my $msg_type = "LONG_LINE";
2851
2852 # Check the allowed long line types first
2853
2854 # logging functions that end in a string that starts
2855 # before $max_line_length
2856 if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&
2857 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
2858 $msg_type = "";
2859
2860 # lines with only strings (w/ possible termination)
2861 # #defines with only strings
2862 } elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
2863 $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {
2864 $msg_type = "";
2865
d560a5f8
JP
2866 # EFI_GUID is another special case
2867 } elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/) {
2868 $msg_type = "";
2869
47e0c88b
JP
2870 # Otherwise set the alternate message types
2871
2872 # a comment starts before $max_line_length
2873 } elsif ($line =~ /($;[\s$;]*)$/ &&
2874 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
2875 $msg_type = "LONG_LINE_COMMENT"
2876
2877 # a quoted string starts before $max_line_length
2878 } elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&
2879 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
2880 $msg_type = "LONG_LINE_STRING"
2881 }
2882
2883 if ($msg_type ne "" &&
2884 (show_type("LONG_LINE") || show_type($msg_type))) {
2885 WARN($msg_type,
2886 "line over $max_line_length characters\n" . $herecurr);
2887 }
0a920b5b
AW
2888 }
2889
8905a67c
AW
2890# check for adding lines without a newline.
2891 if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
000d1cc1
JP
2892 WARN("MISSING_EOF_NEWLINE",
2893 "adding a line without newline at end of file\n" . $herecurr);
8905a67c
AW
2894 }
2895
42e41c54
MF
2896# Blackfin: use hi/lo macros
2897 if ($realfile =~ m@arch/blackfin/.*\.S$@) {
2898 if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) {
2899 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
2900 ERROR("LO_MACRO",
2901 "use the LO() macro, not (... & 0xFFFF)\n" . $herevet);
42e41c54
MF
2902 }
2903 if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) {
2904 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
2905 ERROR("HI_MACRO",
2906 "use the HI() macro, not (... >> 16)\n" . $herevet);
42e41c54
MF
2907 }
2908 }
2909
b9ea10d6 2910# check we are in a valid source file C or perl if not then ignore this hunk
de4c924c 2911 next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
0a920b5b
AW
2912
2913# at the beginning of a line any tabs must come first and anything
2914# more than 8 must use tabs.
c2fdda0d
AW
2915 if ($rawline =~ /^\+\s* \t\s*\S/ ||
2916 $rawline =~ /^\+\s* \s*/) {
2917 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
d2c0a235 2918 $rpt_cleaners = 1;
3705ce5b
JP
2919 if (ERROR("CODE_INDENT",
2920 "code indent should use tabs where possible\n" . $herevet) &&
2921 $fix) {
194f66fc 2922 $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5b 2923 }
0a920b5b
AW
2924 }
2925
08e44365
AP
2926# check for space before tabs.
2927 if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
2928 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3705ce5b
JP
2929 if (WARN("SPACE_BEFORE_TAB",
2930 "please, no space before tabs\n" . $herevet) &&
2931 $fix) {
194f66fc 2932 while ($fixed[$fixlinenr] =~
d2207ccb 2933 s/(^\+.*) {8,8}\t/$1\t\t/) {}
194f66fc 2934 while ($fixed[$fixlinenr] =~
c76f4cb3 2935 s/(^\+.*) +\t/$1\t/) {}
3705ce5b 2936 }
08e44365
AP
2937 }
2938
d1fe9c09
JP
2939# check for && or || at the start of a line
2940 if ($rawline =~ /^\+\s*(&&|\|\|)/) {
2941 CHK("LOGICAL_CONTINUATIONS",
2942 "Logical continuations should be on the previous line\n" . $hereprev);
2943 }
2944
a91e8994
JP
2945# check indentation starts on a tab stop
2946 if ($^V && $^V ge 5.10.0 &&
2947 $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$))/) {
2948 my $indent = length($1);
2949 if ($indent % 8) {
2950 if (WARN("TABSTOP",
2951 "Statements should start on a tabstop\n" . $herecurr) &&
2952 $fix) {
2953 $fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e;
2954 }
2955 }
2956 }
2957
d1fe9c09
JP
2958# check multi-line statement indentation matches previous line
2959 if ($^V && $^V ge 5.10.0 &&
91cb5195 2960 $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|$Ident\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
d1fe9c09
JP
2961 $prevline =~ /^\+(\t*)(.*)$/;
2962 my $oldindent = $1;
2963 my $rest = $2;
2964
2965 my $pos = pos_last_openparen($rest);
2966 if ($pos >= 0) {
b34a26f3
JP
2967 $line =~ /^(\+| )([ \t]*)/;
2968 my $newindent = $2;
d1fe9c09
JP
2969
2970 my $goodtabindent = $oldindent .
2971 "\t" x ($pos / 8) .
2972 " " x ($pos % 8);
2973 my $goodspaceindent = $oldindent . " " x $pos;
2974
2975 if ($newindent ne $goodtabindent &&
2976 $newindent ne $goodspaceindent) {
3705ce5b
JP
2977
2978 if (CHK("PARENTHESIS_ALIGNMENT",
2979 "Alignment should match open parenthesis\n" . $hereprev) &&
2980 $fix && $line =~ /^\+/) {
194f66fc 2981 $fixed[$fixlinenr] =~
3705ce5b
JP
2982 s/^\+[ \t]*/\+$goodtabindent/;
2983 }
d1fe9c09
JP
2984 }
2985 }
2986 }
2987
6ab3a970
JP
2988# check for space after cast like "(int) foo" or "(struct foo) bar"
2989# avoid checking a few false positives:
2990# "sizeof(<type>)" or "__alignof__(<type>)"
2991# function pointer declarations like "(*foo)(int) = bar;"
2992# structure definitions like "(struct foo) { 0 };"
2993# multiline macros that define functions
2994# known attributes or the __attribute__ keyword
2995 if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&
2996 (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {
3705ce5b 2997 if (CHK("SPACING",
f27c95db 2998 "No space is necessary after a cast\n" . $herecurr) &&
3705ce5b 2999 $fix) {
194f66fc 3000 $fixed[$fixlinenr] =~
f27c95db 3001 s/(\(\s*$Type\s*\))[ \t]+/$1/;
3705ce5b 3002 }
aad4f614
JP
3003 }
3004
86406b1c
JP
3005# Block comment styles
3006# Networking with an initial /*
05880600 3007 if ($realfile =~ m@^(drivers/net/|net/)@ &&
fdb4bcd6 3008 $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
85ad978c
JP
3009 $rawline =~ /^\+[ \t]*\*/ &&
3010 $realline > 2) {
05880600
JP
3011 WARN("NETWORKING_BLOCK_COMMENT_STYLE",
3012 "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
3013 }
3014
86406b1c
JP
3015# Block comments use * on subsequent lines
3016 if ($prevline =~ /$;[ \t]*$/ && #ends in comment
3017 $prevrawline =~ /^\+.*?\/\*/ && #starting /*
a605e32e 3018 $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */
61135e96 3019 $rawline =~ /^\+/ && #line is new
a605e32e 3020 $rawline !~ /^\+[ \t]*\*/) { #no leading *
86406b1c
JP
3021 WARN("BLOCK_COMMENT_STYLE",
3022 "Block comments use * on subsequent lines\n" . $hereprev);
a605e32e
JP
3023 }
3024
86406b1c
JP
3025# Block comments use */ on trailing lines
3026 if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */
c24f9f19
JP
3027 $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/
3028 $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/
3029 $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */
86406b1c
JP
3030 WARN("BLOCK_COMMENT_STYLE",
3031 "Block comments use a trailing */ on a separate line\n" . $herecurr);
05880600
JP
3032 }
3033
08eb9b80
JP
3034# Block comment * alignment
3035 if ($prevline =~ /$;[ \t]*$/ && #ends in comment
af207524
JP
3036 $line =~ /^\+[ \t]*$;/ && #leading comment
3037 $rawline =~ /^\+[ \t]*\*/ && #leading *
3038 (($prevrawline =~ /^\+.*?\/\*/ && #leading /*
08eb9b80 3039 $prevrawline !~ /\*\/[ \t]*$/) || #no trailing */
af207524
JP
3040 $prevrawline =~ /^\+[ \t]*\*/)) { #leading *
3041 my $oldindent;
08eb9b80 3042 $prevrawline =~ m@^\+([ \t]*/?)\*@;
af207524
JP
3043 if (defined($1)) {
3044 $oldindent = expand_tabs($1);
3045 } else {
3046 $prevrawline =~ m@^\+(.*/?)\*@;
3047 $oldindent = expand_tabs($1);
3048 }
08eb9b80
JP
3049 $rawline =~ m@^\+([ \t]*)\*@;
3050 my $newindent = $1;
08eb9b80 3051 $newindent = expand_tabs($newindent);
af207524 3052 if (length($oldindent) ne length($newindent)) {
08eb9b80
JP
3053 WARN("BLOCK_COMMENT_STYLE",
3054 "Block comments should align the * on each line\n" . $hereprev);
3055 }
3056 }
3057
7f619191
JP
3058# check for missing blank lines after struct/union declarations
3059# with exceptions for various attributes and macros
3060 if ($prevline =~ /^[\+ ]};?\s*$/ &&
3061 $line =~ /^\+/ &&
3062 !($line =~ /^\+\s*$/ ||
3063 $line =~ /^\+\s*EXPORT_SYMBOL/ ||
3064 $line =~ /^\+\s*MODULE_/i ||
3065 $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
3066 $line =~ /^\+[a-z_]*init/ ||
3067 $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
3068 $line =~ /^\+\s*DECLARE/ ||
3069 $line =~ /^\+\s*__setup/)) {
d752fcc8
JP
3070 if (CHK("LINE_SPACING",
3071 "Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&
3072 $fix) {
f2d7e4d4 3073 fix_insert_line($fixlinenr, "\+");
d752fcc8 3074 }
7f619191
JP
3075 }
3076
365dd4ea
JP
3077# check for multiple consecutive blank lines
3078 if ($prevline =~ /^[\+ ]\s*$/ &&
3079 $line =~ /^\+\s*$/ &&
3080 $last_blank_line != ($linenr - 1)) {
d752fcc8
JP
3081 if (CHK("LINE_SPACING",
3082 "Please don't use multiple blank lines\n" . $hereprev) &&
3083 $fix) {
f2d7e4d4 3084 fix_delete_line($fixlinenr, $rawline);
d752fcc8
JP
3085 }
3086
365dd4ea
JP
3087 $last_blank_line = $linenr;
3088 }
3089
3b617e3b 3090# check for missing blank lines after declarations
3f7bac03
JP
3091 if ($sline =~ /^\+\s+\S/ && #Not at char 1
3092 # actual declarations
3093 ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd3
JP
3094 # function pointer declarations
3095 $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac03
JP
3096 # foo bar; where foo is some local typedef or #define
3097 $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
3098 # known declaration macros
3099 $prevline =~ /^\+\s+$declaration_macros/) &&
3100 # for "else if" which can look like "$Ident $Ident"
3101 !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
3102 # other possible extensions of declaration lines
3103 $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
3104 # not starting a section or a macro "\" extended line
3105 $prevline =~ /(?:\{\s*|\\)$/) &&
3106 # looks like a declaration
3107 !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
5a4e1fd3
JP
3108 # function pointer declarations
3109 $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
3f7bac03
JP
3110 # foo bar; where foo is some local typedef or #define
3111 $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
3112 # known declaration macros
3113 $sline =~ /^\+\s+$declaration_macros/ ||
3114 # start of struct or union or enum
3b617e3b 3115 $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ ||
3f7bac03
JP
3116 # start or end of block or continuation of declaration
3117 $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
3118 # bitfield continuation
3119 $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
3120 # other possible extensions of declaration lines
3121 $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
3122 # indentation of previous and current line are the same
3123 (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
d752fcc8
JP
3124 if (WARN("LINE_SPACING",
3125 "Missing a blank line after declarations\n" . $hereprev) &&
3126 $fix) {
f2d7e4d4 3127 fix_insert_line($fixlinenr, "\+");
d752fcc8 3128 }
3b617e3b
JP
3129 }
3130
5f7ddae6 3131# check for spaces at the beginning of a line.
6b4c5beb
AW
3132# Exceptions:
3133# 1) within comments
3134# 2) indented preprocessor commands
3135# 3) hanging labels
3705ce5b 3136 if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) {
5f7ddae6 3137 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3705ce5b
JP
3138 if (WARN("LEADING_SPACE",
3139 "please, no spaces at the start of a line\n" . $herevet) &&
3140 $fix) {
194f66fc 3141 $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3705ce5b 3142 }
5f7ddae6
RR
3143 }
3144
b9ea10d6
AW
3145# check we are in a valid C source file if not then ignore this hunk
3146 next if ($realfile !~ /\.(h|c)$/);
3147
4dbed76f
JP
3148# check if this appears to be the start function declaration, save the name
3149 if ($sline =~ /^\+\{\s*$/ &&
3150 $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) {
3151 $context_function = $1;
3152 }
3153
3154# check if this appears to be the end of function declaration
3155 if ($sline =~ /^\+\}\s*$/) {
3156 undef $context_function;
3157 }
3158
032a4c0f 3159# check indentation of any line with a bare else
840080a0 3160# (but not if it is a multiple line "if (foo) return bar; else return baz;")
032a4c0f
JP
3161# if the previous line is a break or return and is indented 1 tab more...
3162 if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
3163 my $tabs = length($1) + 1;
840080a0
JP
3164 if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ ||
3165 ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ &&
3166 defined $lines[$linenr] &&
3167 $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) {
032a4c0f
JP
3168 WARN("UNNECESSARY_ELSE",
3169 "else is not generally useful after a break or return\n" . $hereprev);
3170 }
3171 }
3172
c00df19a
JP
3173# check indentation of a line with a break;
3174# if the previous line is a goto or return and is indented the same # of tabs
3175 if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
3176 my $tabs = $1;
3177 if ($prevline =~ /^\+$tabs(?:goto|return)\b/) {
3178 WARN("UNNECESSARY_BREAK",
3179 "break is not useful after a goto or return\n" . $hereprev);
3180 }
3181 }
3182
c2fdda0d 3183# check for RCS/CVS revision markers
cf655043 3184 if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
000d1cc1
JP
3185 WARN("CVS_KEYWORD",
3186 "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
c2fdda0d 3187 }
22f2a2ef 3188
42e41c54
MF
3189# Blackfin: don't use __builtin_bfin_[cs]sync
3190 if ($line =~ /__builtin_bfin_csync/) {
3191 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
3192 ERROR("CSYNC",
3193 "use the CSYNC() macro in asm/blackfin.h\n" . $herevet);
42e41c54
MF
3194 }
3195 if ($line =~ /__builtin_bfin_ssync/) {
3196 my $herevet = "$here\n" . cat_vet($line) . "\n";
000d1cc1
JP
3197 ERROR("SSYNC",
3198 "use the SSYNC() macro in asm/blackfin.h\n" . $herevet);
42e41c54
MF
3199 }
3200
56e77d70
JP
3201# check for old HOTPLUG __dev<foo> section markings
3202 if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
3203 WARN("HOTPLUG_SECTION",
3204 "Using $1 is unnecessary\n" . $herecurr);
3205 }
3206
9c0ca6f9 3207# Check for potential 'bare' types
2b474a1a
AW
3208 my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
3209 $realline_next);
3e469cdc
AW
3210#print "LINE<$line>\n";
3211 if ($linenr >= $suppress_statement &&
1b5539b1 3212 $realcnt && $sline =~ /.\s*\S/) {
170d3a22 3213 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
f5fe35dd 3214 ctx_statement_block($linenr, $realcnt, 0);
171ae1a4
AW
3215 $stat =~ s/\n./\n /g;
3216 $cond =~ s/\n./\n /g;
3217
3e469cdc
AW
3218#print "linenr<$linenr> <$stat>\n";
3219 # If this statement has no statement boundaries within
3220 # it there is no point in retrying a statement scan
3221 # until we hit end of it.
3222 my $frag = $stat; $frag =~ s/;+\s*$//;
3223 if ($frag !~ /(?:{|;)/) {
3224#print "skip<$line_nr_next>\n";
3225 $suppress_statement = $line_nr_next;
3226 }
f74bd194 3227
2b474a1a
AW
3228 # Find the real next line.
3229 $realline_next = $line_nr_next;
3230 if (defined $realline_next &&
3231 (!defined $lines[$realline_next - 1] ||
3232 substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
3233 $realline_next++;
3234 }
3235
171ae1a4
AW
3236 my $s = $stat;
3237 $s =~ s/{.*$//s;
cf655043 3238
c2fdda0d 3239 # Ignore goto labels.
171ae1a4 3240 if ($s =~ /$Ident:\*$/s) {
c2fdda0d
AW
3241
3242 # Ignore functions being called
171ae1a4 3243 } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
c2fdda0d 3244
463f2864
AW
3245 } elsif ($s =~ /^.\s*else\b/s) {
3246
c45dcabd 3247 # declarations always start with types
d2506586 3248 } 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
3249 my $type = $1;
3250 $type =~ s/\s+/ /g;
3251 possible($type, "A:" . $s);
3252
8905a67c 3253 # definitions in global scope can only start with types
a6a84062 3254 } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
c45dcabd 3255 possible($1, "B:" . $s);
c2fdda0d 3256 }
8905a67c
AW
3257
3258 # any (foo ... *) is a pointer cast, and foo is a type
65863862 3259 while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
c45dcabd 3260 possible($1, "C:" . $s);
8905a67c
AW
3261 }
3262
3263 # Check for any sort of function declaration.
3264 # int foo(something bar, other baz);
3265 # void (*store_gdt)(x86_descr_ptr *);
171ae1a4 3266 if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
8905a67c 3267 my ($name_len) = length($1);
8905a67c 3268
cf655043 3269 my $ctx = $s;
773647a0 3270 substr($ctx, 0, $name_len + 1, '');
8905a67c 3271 $ctx =~ s/\)[^\)]*$//;
cf655043 3272
8905a67c 3273 for my $arg (split(/\s*,\s*/, $ctx)) {
c45dcabd 3274 if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
8905a67c 3275
c45dcabd 3276 possible($1, "D:" . $s);
8905a67c
AW
3277 }
3278 }
9c0ca6f9 3279 }
8905a67c 3280
9c0ca6f9
AW
3281 }
3282
653d4876
AW
3283#
3284# Checks which may be anchored in the context.
3285#
00df344f 3286
653d4876
AW
3287# Check for switch () and associated case and default
3288# statements should be at the same indent.
00df344f
AW
3289 if ($line=~/\bswitch\s*\(.*\)/) {
3290 my $err = '';
3291 my $sep = '';
3292 my @ctx = ctx_block_outer($linenr, $realcnt);
3293 shift(@ctx);
3294 for my $ctx (@ctx) {
3295 my ($clen, $cindent) = line_stats($ctx);
3296 if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
3297 $indent != $cindent) {
3298 $err .= "$sep$ctx\n";
3299 $sep = '';
3300 } else {
3301 $sep = "[...]\n";
3302 }
3303 }
3304 if ($err ne '') {
000d1cc1
JP
3305 ERROR("SWITCH_CASE_INDENT_LEVEL",
3306 "switch and case should be at the same indent\n$hereline$err");
de7d4f0e
AW
3307 }
3308 }
3309
3310# if/while/etc brace do not go on next line, unless defining a do while loop,
3311# or if that brace on the next line is for something else
0fe3dc2b 3312 if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
773647a0
AW
3313 my $pre_ctx = "$1$2";
3314
9c0ca6f9 3315 my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
8eef05dd
JP
3316
3317 if ($line =~ /^\+\t{6,}/) {
3318 WARN("DEEP_INDENTATION",
3319 "Too many leading tabs - consider code refactoring\n" . $herecurr);
3320 }
3321
de7d4f0e
AW
3322 my $ctx_cnt = $realcnt - $#ctx - 1;
3323 my $ctx = join("\n", @ctx);
3324
548596d5
AW
3325 my $ctx_ln = $linenr;
3326 my $ctx_skip = $realcnt;
773647a0 3327
548596d5
AW
3328 while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
3329 defined $lines[$ctx_ln - 1] &&
3330 $lines[$ctx_ln - 1] =~ /^-/)) {
3331 ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n";
3332 $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
de7d4f0e 3333 $ctx_ln++;
de7d4f0e 3334 }
548596d5 3335
53210168
AW
3336 #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n";
3337 #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n";
de7d4f0e 3338
d752fcc8 3339 if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
000d1cc1
JP
3340 ERROR("OPEN_BRACE",
3341 "that open brace { should be on the previous line\n" .
01464f30 3342 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
00df344f 3343 }
773647a0
AW
3344 if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
3345 $ctx =~ /\)\s*\;\s*$/ &&
3346 defined $lines[$ctx_ln - 1])
3347 {
9c0ca6f9
AW
3348 my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
3349 if ($nindent > $indent) {
000d1cc1
JP
3350 WARN("TRAILING_SEMICOLON",
3351 "trailing semicolon indicates no statements, indent implies otherwise\n" .
01464f30 3352 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
9c0ca6f9
AW
3353 }
3354 }
00df344f
AW
3355 }
3356
4d001e4d 3357# Check relative indent for conditionals and blocks.
f6950a73 3358 if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
3e469cdc
AW
3359 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
3360 ctx_statement_block($linenr, $realcnt, 0)
3361 if (!defined $stat);
4d001e4d
AW
3362 my ($s, $c) = ($stat, $cond);
3363
3364 substr($s, 0, length($c), '');
3365
9f5af480
JP
3366 # remove inline comments
3367 $s =~ s/$;/ /g;
3368 $c =~ s/$;/ /g;
4d001e4d
AW
3369
3370 # Find out how long the conditional actually is.
6f779c18
AW
3371 my @newlines = ($c =~ /\n/gs);
3372 my $cond_lines = 1 + $#newlines;
4d001e4d 3373
9f5af480
JP
3374 # Make sure we remove the line prefixes as we have
3375 # none on the first line, and are going to readd them
3376 # where necessary.
3377 $s =~ s/\n./\n/gs;
3378 while ($s =~ /\n\s+\\\n/) {
3379 $cond_lines += $s =~ s/\n\s+\\\n/\n/g;
3380 }
3381
4d001e4d
AW
3382 # We want to check the first line inside the block
3383 # starting at the end of the conditional, so remove:
3384 # 1) any blank line termination
3385 # 2) any opening brace { on end of the line
3386 # 3) any do (...) {
3387 my $continuation = 0;
3388 my $check = 0;
3389 $s =~ s/^.*\bdo\b//;
3390 $s =~ s/^\s*{//;
3391 if ($s =~ s/^\s*\\//) {
3392 $continuation = 1;
3393 }
9bd49efe 3394 if ($s =~ s/^\s*?\n//) {
4d001e4d
AW
3395 $check = 1;
3396 $cond_lines++;
3397 }
3398
3399 # Also ignore a loop construct at the end of a
3400 # preprocessor statement.
3401 if (($prevline =~ /^.\s*#\s*define\s/ ||
3402 $prevline =~ /\\\s*$/) && $continuation == 0) {
3403 $check = 0;
3404 }
3405
9bd49efe 3406 my $cond_ptr = -1;
740504c6 3407 $continuation = 0;
9bd49efe
AW
3408 while ($cond_ptr != $cond_lines) {
3409 $cond_ptr = $cond_lines;
3410
f16fa28f
AW
3411 # If we see an #else/#elif then the code
3412 # is not linear.
3413 if ($s =~ /^\s*\#\s*(?:else|elif)/) {
3414 $check = 0;
3415 }
3416
9bd49efe
AW
3417 # Ignore:
3418 # 1) blank lines, they should be at 0,
3419 # 2) preprocessor lines, and
3420 # 3) labels.
740504c6
AW
3421 if ($continuation ||
3422 $s =~ /^\s*?\n/ ||
9bd49efe
AW
3423 $s =~ /^\s*#\s*?/ ||
3424 $s =~ /^\s*$Ident\s*:/) {
740504c6 3425 $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
30dad6eb
AW
3426 if ($s =~ s/^.*?\n//) {
3427 $cond_lines++;
3428 }
9bd49efe 3429 }
4d001e4d
AW
3430 }
3431
3432 my (undef, $sindent) = line_stats("+" . $s);
3433 my $stat_real = raw_line($linenr, $cond_lines);
3434
3435 # Check if either of these lines are modified, else
3436 # this is not this patch's fault.
3437 if (!defined($stat_real) ||
3438 $stat !~ /^\+/ && $stat_real !~ /^\+/) {
3439 $check = 0;
3440 }
3441 if (defined($stat_real) && $cond_lines > 1) {
3442 $stat_real = "[...]\n$stat_real";
3443 }
3444
9bd49efe 3445 #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 3446
9f5af480
JP
3447 if ($check && $s ne '' &&
3448 (($sindent % 8) != 0 ||
3449 ($sindent < $indent) ||
f6950a73
JP
3450 ($sindent == $indent &&
3451 ($s !~ /^\s*(?:\}|\{|else\b)/)) ||
9f5af480 3452 ($sindent > $indent + 8))) {
000d1cc1
JP
3453 WARN("SUSPECT_CODE_INDENT",
3454 "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
4d001e4d
AW
3455 }
3456 }
3457
6c72ffaa
AW
3458 # Track the 'values' across context and added lines.
3459 my $opline = $line; $opline =~ s/^./ /;
1f65f947
AW
3460 my ($curr_values, $curr_vars) =
3461 annotate_values($opline . "\n", $prev_values);
6c72ffaa 3462 $curr_values = $prev_values . $curr_values;
c2fdda0d
AW
3463 if ($dbg_values) {
3464 my $outline = $opline; $outline =~ s/\t/ /g;
cf655043
AW
3465 print "$linenr > .$outline\n";
3466 print "$linenr > $curr_values\n";
1f65f947 3467 print "$linenr > $curr_vars\n";
c2fdda0d 3468 }
6c72ffaa
AW
3469 $prev_values = substr($curr_values, -1);
3470
00df344f 3471#ignore lines not being added
3705ce5b 3472 next if ($line =~ /^[^\+]/);
00df344f 3473
11ca40a0
JP
3474# check for dereferences that span multiple lines
3475 if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ &&
3476 $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) {
3477 $prevline =~ /($Lval\s*(?:\.|->))\s*$/;
3478 my $ref = $1;
3479 $line =~ /^.\s*($Lval)/;
3480 $ref .= $1;
3481 $ref =~ s/\s//g;
3482 WARN("MULTILINE_DEREFERENCE",
3483 "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev);
3484 }
3485
a1ce18e4 3486# check for declarations of signed or unsigned without int
c8447115 3487 while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
a1ce18e4
JP
3488 my $type = $1;
3489 my $var = $2;
207a8e84
JP
3490 $var = "" if (!defined $var);
3491 if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
a1ce18e4
JP
3492 my $sign = $1;
3493 my $pointer = $2;
3494
3495 $pointer = "" if (!defined $pointer);
3496
3497 if (WARN("UNSPECIFIED_INT",
3498 "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) &&
3499 $fix) {
3500 my $decl = trim($sign) . " int ";
207a8e84
JP
3501 my $comp_pointer = $pointer;
3502 $comp_pointer =~ s/\s//g;
3503 $decl .= $comp_pointer;
3504 $decl = rtrim($decl) if ($var eq "");
3505 $fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;
a1ce18e4
JP
3506 }
3507 }
3508 }
3509
653d4876 3510# TEST: allow direct testing of the type matcher.
7429c690
AW
3511 if ($dbg_type) {
3512 if ($line =~ /^.\s*$Declare\s*$/) {
000d1cc1
JP
3513 ERROR("TEST_TYPE",
3514 "TEST: is type\n" . $herecurr);
7429c690 3515 } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
000d1cc1
JP
3516 ERROR("TEST_NOT_TYPE",
3517 "TEST: is not type ($1 is)\n". $herecurr);
7429c690 3518 }
653d4876
AW
3519 next;
3520 }
a1ef277e
AW
3521# TEST: allow direct testing of the attribute matcher.
3522 if ($dbg_attr) {
9360b0e5 3523 if ($line =~ /^.\s*$Modifier\s*$/) {
000d1cc1
JP
3524 ERROR("TEST_ATTR",
3525 "TEST: is attr\n" . $herecurr);
9360b0e5 3526 } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
000d1cc1
JP
3527 ERROR("TEST_NOT_ATTR",
3528 "TEST: is not attr ($1 is)\n". $herecurr);
a1ef277e
AW
3529 }
3530 next;
3531 }
653d4876 3532
f0a594c1 3533# check for initialisation to aggregates open brace on the next line
99423c20
AW
3534 if ($line =~ /^.\s*{/ &&
3535 $prevline =~ /(?:^|[^=])=\s*$/) {
d752fcc8
JP
3536 if (ERROR("OPEN_BRACE",
3537 "that open brace { should be on the previous line\n" . $hereprev) &&
f2d7e4d4
JP
3538 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
3539 fix_delete_line($fixlinenr - 1, $prevrawline);
3540 fix_delete_line($fixlinenr, $rawline);
d752fcc8
JP
3541 my $fixedline = $prevrawline;
3542 $fixedline =~ s/\s*=\s*$/ = {/;
f2d7e4d4 3543 fix_insert_line($fixlinenr, $fixedline);
d752fcc8
JP
3544 $fixedline = $line;
3545 $fixedline =~ s/^(.\s*){\s*/$1/;
f2d7e4d4 3546 fix_insert_line($fixlinenr, $fixedline);
d752fcc8 3547 }
f0a594c1
AW
3548 }
3549
653d4876
AW
3550#
3551# Checks which are anchored on the added line.
3552#
3553
3554# check for malformed paths in #include statements (uses RAW line)
c45dcabd 3555 if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) {
653d4876
AW
3556 my $path = $1;
3557 if ($path =~ m{//}) {
000d1cc1 3558 ERROR("MALFORMED_INCLUDE",
495e9d84
JP
3559 "malformed #include filename\n" . $herecurr);
3560 }
3561 if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
3562 ERROR("UAPI_INCLUDE",
3563 "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
653d4876 3564 }
653d4876 3565 }
00df344f 3566
0a920b5b 3567# no C99 // comments
00df344f 3568 if ($line =~ m{//}) {
3705ce5b
JP
3569 if (ERROR("C99_COMMENTS",
3570 "do not use C99 // comments\n" . $herecurr) &&
3571 $fix) {
194f66fc 3572 my $line = $fixed[$fixlinenr];
3705ce5b
JP
3573 if ($line =~ /\/\/(.*)$/) {
3574 my $comment = trim($1);
194f66fc 3575 $fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
3705ce5b
JP
3576 }
3577 }
0a920b5b 3578 }
00df344f 3579 # Remove C99 comments.
0a920b5b 3580 $line =~ s@//.*@@;
6c72ffaa 3581 $opline =~ s@//.*@@;
0a920b5b 3582
2b474a1a
AW
3583# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
3584# the whole statement.
3585#print "APW <$lines[$realline_next - 1]>\n";
3586 if (defined $realline_next &&
3587 exists $lines[$realline_next - 1] &&
3588 !defined $suppress_export{$realline_next} &&
3589 ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
3590 $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3cbf62df
AW
3591 # Handle definitions which produce identifiers with
3592 # a prefix:
3593 # XXX(foo);
3594 # EXPORT_SYMBOL(something_foo);
653d4876 3595 my $name = $1;
87a53877 3596 if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
3cbf62df
AW
3597 $name =~ /^${Ident}_$2/) {
3598#print "FOO C name<$name>\n";
3599 $suppress_export{$realline_next} = 1;
3600
3601 } elsif ($stat !~ /(?:
2b474a1a 3602 \n.}\s*$|
48012058
AW
3603 ^.DEFINE_$Ident\(\Q$name\E\)|
3604 ^.DECLARE_$Ident\(\Q$name\E\)|
3605 ^.LIST_HEAD\(\Q$name\E\)|
2b474a1a
AW
3606 ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
3607 \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
48012058 3608 )/x) {
2b474a1a
AW
3609#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n";
3610 $suppress_export{$realline_next} = 2;
3611 } else {
3612 $suppress_export{$realline_next} = 1;
0a920b5b
AW
3613 }
3614 }
2b474a1a
AW
3615 if (!defined $suppress_export{$linenr} &&
3616 $prevline =~ /^.\s*$/ &&
3617 ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
3618 $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
3619#print "FOO B <$lines[$linenr - 1]>\n";
3620 $suppress_export{$linenr} = 2;
3621 }
3622 if (defined $suppress_export{$linenr} &&
3623 $suppress_export{$linenr} == 2) {
000d1cc1
JP
3624 WARN("EXPORT_SYMBOL",
3625 "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
2b474a1a 3626 }
0a920b5b 3627
5150bda4 3628# check for global initialisers.
6d32f7a3 3629 if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) {
d5e616fc 3630 if (ERROR("GLOBAL_INITIALISERS",
6d32f7a3 3631 "do not initialise globals to $1\n" . $herecurr) &&
d5e616fc 3632 $fix) {
6d32f7a3 3633 $fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
d5e616fc 3634 }
f0a594c1 3635 }
653d4876 3636# check for static initialisers.
6d32f7a3 3637 if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
d5e616fc 3638 if (ERROR("INITIALISED_STATIC",
6d32f7a3 3639 "do not initialise statics to $1\n" .
d5e616fc
JP
3640 $herecurr) &&
3641 $fix) {
6d32f7a3 3642 $fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
d5e616fc 3643 }
0a920b5b
AW
3644 }
3645
1813087d
JP
3646# check for misordered declarations of char/short/int/long with signed/unsigned
3647 while ($sline =~ m{(\b$TypeMisordered\b)}g) {
3648 my $tmp = trim($1);
3649 WARN("MISORDERED_TYPE",
3650 "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr);
3651 }
3652
cb710eca
JP
3653# check for static const char * arrays.
3654 if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
000d1cc1
JP
3655 WARN("STATIC_CONST_CHAR_ARRAY",
3656 "static const char * array should probably be static const char * const\n" .
cb710eca
JP
3657 $herecurr);
3658 }
3659
3660# check for static char foo[] = "bar" declarations.
3661 if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
000d1cc1
JP
3662 WARN("STATIC_CONST_CHAR_ARRAY",
3663 "static char array declaration should probably be static const char\n" .
cb710eca
JP
3664 $herecurr);
3665 }
3666
ab7e23f3
JP
3667# check for const <foo> const where <foo> is not a pointer or array type
3668 if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
3669 my $found = $1;
3670 if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {
3671 WARN("CONST_CONST",
3672 "'const $found const *' should probably be 'const $found * const'\n" . $herecurr);
3673 } elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {
3674 WARN("CONST_CONST",
3675 "'const $found const' should probably be 'const $found'\n" . $herecurr);
3676 }
3677 }
3678
9b0fa60d
JP
3679# check for non-global char *foo[] = {"bar", ...} declarations.
3680 if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
3681 WARN("STATIC_CONST_CHAR_ARRAY",
3682 "char * array declaration might be better as static const\n" .
3683 $herecurr);
3684 }
3685
b598b670
JP
3686# check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo)
3687 if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {
3688 my $array = $1;
3689 if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {
3690 my $array_div = $1;
3691 if (WARN("ARRAY_SIZE",
3692 "Prefer ARRAY_SIZE($array)\n" . $herecurr) &&
3693 $fix) {
3694 $fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;
3695 }
3696 }
3697 }
3698
b36190c5
JP
3699# check for function declarations without arguments like "int foo()"
3700 if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
3701 if (ERROR("FUNCTION_WITHOUT_ARGS",
3702 "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
3703 $fix) {
194f66fc 3704 $fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
b36190c5
JP
3705 }
3706 }
3707
653d4876
AW
3708# check for new typedefs, only function parameters and sparse annotations
3709# make sense.
3710 if ($line =~ /\btypedef\s/ &&
8054576d 3711 $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
c45dcabd 3712 $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
8ed22cad 3713 $line !~ /\b$typeTypedefs\b/ &&
46d832f5 3714 $line !~ /\b__bitwise\b/) {
000d1cc1
JP
3715 WARN("NEW_TYPEDEFS",
3716 "do not add new typedefs\n" . $herecurr);
0a920b5b
AW
3717 }
3718
3719# * goes on variable not on type
65863862 3720 # (char*[ const])
bfcb2cc7
AW
3721 while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
3722 #print "AA<$1>\n";
3705ce5b 3723 my ($ident, $from, $to) = ($1, $2, $2);
65863862
AW
3724
3725 # Should start with a space.
3726 $to =~ s/^(\S)/ $1/;
3727 # Should not end with a space.
3728 $to =~ s/\s+$//;
3729 # '*'s should not have spaces between.
f9a0b3d1 3730 while ($to =~ s/\*\s+\*/\*\*/) {
65863862 3731 }
d8aaf121 3732
3705ce5b 3733## print "1: from<$from> to<$to> ident<$ident>\n";
65863862 3734 if ($from ne $to) {
3705ce5b
JP
3735 if (ERROR("POINTER_LOCATION",
3736 "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) &&
3737 $fix) {
3738 my $sub_from = $ident;
3739 my $sub_to = $ident;
3740 $sub_to =~ s/\Q$from\E/$to/;
194f66fc 3741 $fixed[$fixlinenr] =~
3705ce5b
JP
3742 s@\Q$sub_from\E@$sub_to@;
3743 }
65863862 3744 }
bfcb2cc7
AW
3745 }
3746 while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
3747 #print "BB<$1>\n";
3705ce5b 3748 my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
65863862
AW
3749
3750 # Should start with a space.
3751 $to =~ s/^(\S)/ $1/;
3752 # Should not end with a space.
3753 $to =~ s/\s+$//;
3754 # '*'s should not have spaces between.
f9a0b3d1 3755 while ($to =~ s/\*\s+\*/\*\*/) {
65863862
AW
3756 }
3757 # Modifiers should have spaces.
3758 $to =~ s/(\b$Modifier$)/$1 /;
d8aaf121 3759
3705ce5b 3760## print "2: from<$from> to<$to> ident<$ident>\n";
667026e7 3761 if ($from ne $to && $ident !~ /^$Modifier$/) {
3705ce5b
JP
3762 if (ERROR("POINTER_LOCATION",
3763 "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) &&
3764 $fix) {
3765
3766 my $sub_from = $match;
3767 my $sub_to = $match;
3768 $sub_to =~ s/\Q$from\E/$to/;
194f66fc 3769 $fixed[$fixlinenr] =~
3705ce5b
JP
3770 s@\Q$sub_from\E@$sub_to@;
3771 }
65863862 3772 }
0a920b5b
AW
3773 }
3774
9d3e3c70
JP
3775# avoid BUG() or BUG_ON()
3776 if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
3777 my $msg_type = \&WARN;
3778 $msg_type = \&CHK if ($file);
3779 &{$msg_type}("AVOID_BUG",
3780 "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr);
3781 }
0a920b5b 3782
9d3e3c70 3783# avoid LINUX_VERSION_CODE
8905a67c 3784 if ($line =~ /\bLINUX_VERSION_CODE\b/) {
000d1cc1
JP
3785 WARN("LINUX_VERSION_CODE",
3786 "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
8905a67c
AW
3787 }
3788
17441227
JP
3789# check for uses of printk_ratelimit
3790 if ($line =~ /\bprintk_ratelimit\s*\(/) {
000d1cc1 3791 WARN("PRINTK_RATELIMITED",
101ee680 3792 "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
17441227
JP
3793 }
3794
00df344f
AW
3795# printk should use KERN_* levels. Note that follow on printk's on the
3796# same line do not need a level, so we use the current block context
3797# to try and find and validate the current printk. In summary the current
25985edc 3798# printk includes all preceding printk's which have no newline on the end.
00df344f 3799# we assume the first bad printk is the one to report.
f0a594c1 3800 if ($line =~ /\bprintk\((?!KERN_)\s*"/) {
00df344f
AW
3801 my $ok = 0;
3802 for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) {
3803 #print "CHECK<$lines[$ln - 1]\n";
25985edc 3804 # we have a preceding printk if it ends
00df344f
AW
3805 # with "\n" ignore it, else it is to blame
3806 if ($lines[$ln - 1] =~ m{\bprintk\(}) {
3807 if ($rawlines[$ln - 1] !~ m{\\n"}) {
3808 $ok = 1;
3809 }
3810 last;
3811 }
3812 }
3813 if ($ok == 0) {
000d1cc1
JP
3814 WARN("PRINTK_WITHOUT_KERN_LEVEL",
3815 "printk() should include KERN_ facility level\n" . $herecurr);
00df344f 3816 }
0a920b5b
AW
3817 }
3818
243f3803
JP
3819 if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
3820 my $orig = $1;
3821 my $level = lc($orig);
3822 $level = "warn" if ($level eq "warning");
8f26b837
JP
3823 my $level2 = $level;
3824 $level2 = "dbg" if ($level eq "debug");
243f3803 3825 WARN("PREFER_PR_LEVEL",
daa8b059 3826 "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr);
243f3803
JP
3827 }
3828
3829 if ($line =~ /\bpr_warning\s*\(/) {
d5e616fc
JP
3830 if (WARN("PREFER_PR_LEVEL",
3831 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
3832 $fix) {
194f66fc 3833 $fixed[$fixlinenr] =~
d5e616fc
JP
3834 s/\bpr_warning\b/pr_warn/;
3835 }
243f3803
JP
3836 }
3837
dc139313
JP
3838 if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
3839 my $orig = $1;
3840 my $level = lc($orig);
3841 $level = "warn" if ($level eq "warning");
3842 $level = "dbg" if ($level eq "debug");
3843 WARN("PREFER_DEV_LEVEL",
3844 "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
3845 }
3846
91c9afaf
AL
3847# ENOSYS means "bad syscall nr" and nothing else. This will have a small
3848# number of false positives, but assembly files are not checked, so at
3849# least the arch entry code will not trigger this warning.
3850 if ($line =~ /\bENOSYS\b/) {
3851 WARN("ENOSYS",
3852 "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr);
3853 }
3854
653d4876
AW
3855# function brace can't be on same line, except for #defines of do while,
3856# or if closed on same line
8d182478 3857 if (($line=~/$Type\s*$Ident\(.*\).*\s*{/) and
4e5d56bd 3858 !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) {
8d182478
JP
3859 if (ERROR("OPEN_BRACE",
3860 "open brace '{' following function declarations go on the next line\n" . $herecurr) &&
3861 $fix) {
3862 fix_delete_line($fixlinenr, $rawline);
3863 my $fixed_line = $rawline;
3864 $fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/;
3865 my $line1 = $1;
3866 my $line2 = $2;
3867 fix_insert_line($fixlinenr, ltrim($line1));
3868 fix_insert_line($fixlinenr, "\+{");
3869 if ($line2 !~ /^\s*$/) {
3870 fix_insert_line($fixlinenr, "\+\t" . trim($line2));
3871 }
3872 }
0a920b5b 3873 }
653d4876 3874
8905a67c
AW
3875# open braces for enum, union and struct go on the same line.
3876 if ($line =~ /^.\s*{/ &&
3877 $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
8d182478
JP
3878 if (ERROR("OPEN_BRACE",
3879 "open brace '{' following $1 go on the same line\n" . $hereprev) &&
3880 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
3881 fix_delete_line($fixlinenr - 1, $prevrawline);
3882 fix_delete_line($fixlinenr, $rawline);
3883 my $fixedline = rtrim($prevrawline) . " {";
3884 fix_insert_line($fixlinenr, $fixedline);
3885 $fixedline = $rawline;
3886 $fixedline =~ s/^(.\s*){\s*/$1\t/;
3887 if ($fixedline !~ /^\+\s*$/) {
3888 fix_insert_line($fixlinenr, $fixedline);
3889 }
3890 }
8905a67c
AW
3891 }
3892
0c73b4eb 3893# missing space after union, struct or enum definition
3705ce5b
JP
3894 if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
3895 if (WARN("SPACING",
3896 "missing space after $1 definition\n" . $herecurr) &&
3897 $fix) {
194f66fc 3898 $fixed[$fixlinenr] =~
3705ce5b
JP
3899 s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
3900 }
0c73b4eb
AW
3901 }
3902
31070b5d
JP
3903# Function pointer declarations
3904# check spacing between type, funcptr, and args
3905# canonical declaration is "type (*funcptr)(args...)"
91f72e9c 3906 if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
31070b5d
JP
3907 my $declare = $1;
3908 my $pre_pointer_space = $2;
3909 my $post_pointer_space = $3;
3910 my $funcname = $4;
3911 my $post_funcname_space = $5;
3912 my $pre_args_space = $6;
3913
91f72e9c
JP
3914# the $Declare variable will capture all spaces after the type
3915# so check it for a missing trailing missing space but pointer return types
3916# don't need a space so don't warn for those.
3917 my $post_declare_space = "";
3918 if ($declare =~ /(\s+)$/) {
3919 $post_declare_space = $1;
3920 $declare = rtrim($declare);
3921 }
3922 if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
31070b5d
JP
3923 WARN("SPACING",
3924 "missing space after return type\n" . $herecurr);
91f72e9c 3925 $post_declare_space = " ";
31070b5d
JP
3926 }
3927
3928# unnecessary space "type (*funcptr)(args...)"
91f72e9c
JP
3929# This test is not currently implemented because these declarations are
3930# equivalent to
3931# int foo(int bar, ...)
3932# and this is form shouldn't/doesn't generate a checkpatch warning.
3933#
3934# elsif ($declare =~ /\s{2,}$/) {
3935# WARN("SPACING",
3936# "Multiple spaces after return type\n" . $herecurr);
3937# }
31070b5d
JP
3938
3939# unnecessary space "type ( *funcptr)(args...)"
3940 if (defined $pre_pointer_space &&
3941 $pre_pointer_space =~ /^\s/) {
3942 WARN("SPACING",
3943 "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
3944 }
3945
3946# unnecessary space "type (* funcptr)(args...)"
3947 if (defined $post_pointer_space &&
3948 $post_pointer_space =~ /^\s/) {
3949 WARN("SPACING",
3950 "Unnecessary space before function pointer name\n" . $herecurr);
3951 }
3952
3953# unnecessary space "type (*funcptr )(args...)"
3954 if (defined $post_funcname_space &&
3955 $post_funcname_space =~ /^\s/) {
3956 WARN("SPACING",
3957 "Unnecessary space after function pointer name\n" . $herecurr);
3958 }
3959
3960# unnecessary space "type (*funcptr) (args...)"
3961 if (defined $pre_args_space &&
3962 $pre_args_space =~ /^\s/) {
3963 WARN("SPACING",
3964 "Unnecessary space before function pointer arguments\n" . $herecurr);
3965 }
3966
3967 if (show_type("SPACING") && $fix) {
194f66fc 3968 $fixed[$fixlinenr] =~
91f72e9c 3969 s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
31070b5d
JP
3970 }
3971 }
3972
8d31cfce
AW
3973# check for spacing round square brackets; allowed:
3974# 1. with a type on the left -- int [] a;
fe2a7dbc
AW
3975# 2. at the beginning of a line for slice initialisers -- [0...10] = 5,
3976# 3. inside a curly brace -- = { [0...10] = 5 }
8d31cfce
AW
3977 while ($line =~ /(.*?\s)\[/g) {
3978 my ($where, $prefix) = ($-[1], $1);
3979 if ($prefix !~ /$Type\s+$/ &&
fe2a7dbc 3980 ($where != 0 || $prefix !~ /^.\s+$/) &&
daebc534 3981 $prefix !~ /[{,]\s+$/) {
3705ce5b
JP
3982 if (ERROR("BRACKET_SPACE",
3983 "space prohibited before open square bracket '['\n" . $herecurr) &&
3984 $fix) {
194f66fc 3985 $fixed[$fixlinenr] =~
3705ce5b
JP
3986 s/^(\+.*?)\s+\[/$1\[/;
3987 }
8d31cfce
AW
3988 }
3989 }
3990
f0a594c1 3991# check for spaces between functions and their parentheses.
6c72ffaa 3992 while ($line =~ /($Ident)\s+\(/g) {
c2fdda0d 3993 my $name = $1;
773647a0
AW
3994 my $ctx_before = substr($line, 0, $-[1]);
3995 my $ctx = "$ctx_before$name";
c2fdda0d
AW
3996
3997 # Ignore those directives where spaces _are_ permitted.
773647a0
AW
3998 if ($name =~ /^(?:
3999 if|for|while|switch|return|case|
4000 volatile|__volatile__|
4001 __attribute__|format|__extension__|
4002 asm|__asm__)$/x)
4003 {
c2fdda0d
AW
4004 # cpp #define statements have non-optional spaces, ie
4005 # if there is a space between the name and the open
4006 # parenthesis it is simply not a parameter group.
c45dcabd 4007 } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
773647a0
AW
4008
4009 # cpp #elif statement condition may start with a (
c45dcabd 4010 } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
c2fdda0d
AW
4011
4012 # If this whole things ends with a type its most
4013 # likely a typedef for a function.
773647a0 4014 } elsif ($ctx =~ /$Type$/) {
c2fdda0d
AW
4015
4016 } else {
3705ce5b
JP
4017 if (WARN("SPACING",
4018 "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
4019 $fix) {
194f66fc 4020 $fixed[$fixlinenr] =~
3705ce5b
JP
4021 s/\b$name\s+\(/$name\(/;
4022 }
6c72ffaa 4023 }
f0a594c1 4024 }
9a4cad4e 4025
653d4876 4026# Check operator spacing.
0a920b5b 4027 if (!($line=~/\#\s*include/)) {
3705ce5b
JP
4028 my $fixed_line = "";
4029 my $line_fixed = 0;
4030
9c0ca6f9
AW
4031 my $ops = qr{
4032 <<=|>>=|<=|>=|==|!=|
4033 \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
4034 =>|->|<<|>>|<|>|=|!|~|
1f65f947 4035 &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
84731623 4036 \?:|\?|:
9c0ca6f9 4037 }x;
cf655043 4038 my @elements = split(/($ops|;)/, $opline);
3705ce5b
JP
4039
4040## print("element count: <" . $#elements . ">\n");
4041## foreach my $el (@elements) {
4042## print("el: <$el>\n");
4043## }
4044
4045 my @fix_elements = ();
00df344f 4046 my $off = 0;
6c72ffaa 4047
3705ce5b
JP
4048 foreach my $el (@elements) {
4049 push(@fix_elements, substr($rawline, $off, length($el)));
4050 $off += length($el);
4051 }
4052
4053 $off = 0;
4054
6c72ffaa 4055 my $blank = copy_spacing($opline);
b34c648b 4056 my $last_after = -1;
6c72ffaa 4057
0a920b5b 4058 for (my $n = 0; $n < $#elements; $n += 2) {
3705ce5b
JP
4059
4060 my $good = $fix_elements[$n] . $fix_elements[$n + 1];
4061
4062## print("n: <$n> good: <$good>\n");
4063
4a0df2ef
AW
4064 $off += length($elements[$n]);
4065
25985edc 4066 # Pick up the preceding and succeeding characters.
773647a0
AW
4067 my $ca = substr($opline, 0, $off);
4068 my $cc = '';
4069 if (length($opline) >= ($off + length($elements[$n + 1]))) {
4070 $cc = substr($opline, $off + length($elements[$n + 1]));
4071 }
4072 my $cb = "$ca$;$cc";
4073
4a0df2ef
AW
4074 my $a = '';
4075 $a = 'V' if ($elements[$n] ne '');
4076 $a = 'W' if ($elements[$n] =~ /\s$/);
cf655043 4077 $a = 'C' if ($elements[$n] =~ /$;$/);
4a0df2ef
AW
4078 $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
4079 $a = 'O' if ($elements[$n] eq '');
773647a0 4080 $a = 'E' if ($ca =~ /^\s*$/);
4a0df2ef 4081
0a920b5b 4082 my $op = $elements[$n + 1];
4a0df2ef
AW
4083
4084 my $c = '';
0a920b5b 4085 if (defined $elements[$n + 2]) {
4a0df2ef
AW
4086 $c = 'V' if ($elements[$n + 2] ne '');
4087 $c = 'W' if ($elements[$n + 2] =~ /^\s/);
cf655043 4088 $c = 'C' if ($elements[$n + 2] =~ /^$;/);
4a0df2ef
AW
4089 $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
4090 $c = 'O' if ($elements[$n + 2] eq '');
8b1b3378 4091 $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
4a0df2ef
AW
4092 } else {
4093 $c = 'E';
0a920b5b
AW
4094 }
4095
4a0df2ef
AW
4096 my $ctx = "${a}x${c}";
4097
4098 my $at = "(ctx:$ctx)";
4099
6c72ffaa 4100 my $ptr = substr($blank, 0, $off) . "^";
de7d4f0e 4101 my $hereptr = "$hereline$ptr\n";
0a920b5b 4102
74048ed8 4103 # Pull out the value of this operator.
6c72ffaa 4104 my $op_type = substr($curr_values, $off + 1, 1);
0a920b5b 4105
1f65f947
AW
4106 # Get the full operator variant.
4107 my $opv = $op . substr($curr_vars, $off, 1);
4108
13214adf
AW
4109 # Ignore operators passed as parameters.
4110 if ($op_type ne 'V' &&
d7fe8065 4111 $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) {
13214adf 4112
cf655043
AW
4113# # Ignore comments
4114# } elsif ($op =~ /^$;+$/) {
13214adf 4115
d8aaf121 4116 # ; should have either the end of line or a space or \ after it
13214adf 4117 } elsif ($op eq ';') {
cf655043
AW
4118 if ($ctx !~ /.x[WEBC]/ &&
4119 $cc !~ /^\\/ && $cc !~ /^;/) {
3705ce5b
JP
4120 if (ERROR("SPACING",
4121 "space required after that '$op' $at\n" . $hereptr)) {
b34c648b 4122 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5b
JP
4123 $line_fixed = 1;
4124 }
d8aaf121
AW
4125 }
4126
4127 # // is a comment
4128 } elsif ($op eq '//') {
0a920b5b 4129
b00e4814
JP
4130 # : when part of a bitfield
4131 } elsif ($opv eq ':B') {
4132 # skip the bitfield test for now
4133
1f65f947
AW
4134 # No spaces for:
4135 # ->
b00e4814 4136 } elsif ($op eq '->') {
4a0df2ef 4137 if ($ctx =~ /Wx.|.xW/) {
3705ce5b
JP
4138 if (ERROR("SPACING",
4139 "spaces prohibited around that '$op' $at\n" . $hereptr)) {
b34c648b 4140 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5b
JP
4141 if (defined $fix_elements[$n + 2]) {
4142 $fix_elements[$n + 2] =~ s/^\s+//;
4143 }
b34c648b 4144 $line_fixed = 1;
3705ce5b 4145 }
0a920b5b
AW
4146 }
4147
2381097b 4148 # , must not have a space before and must have a space on the right.
0a920b5b 4149 } elsif ($op eq ',') {
2381097b
JP
4150 my $rtrim_before = 0;
4151 my $space_after = 0;
4152 if ($ctx =~ /Wx./) {
4153 if (ERROR("SPACING",
4154 "space prohibited before that '$op' $at\n" . $hereptr)) {
4155 $line_fixed = 1;
4156 $rtrim_before = 1;
4157 }
4158 }
cf655043 4159 if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) {
3705ce5b
JP
4160 if (ERROR("SPACING",
4161 "space required after that '$op' $at\n" . $hereptr)) {
3705ce5b 4162 $line_fixed = 1;
b34c648b 4163 $last_after = $n;
2381097b
JP
4164 $space_after = 1;
4165 }
4166 }
4167 if ($rtrim_before || $space_after) {
4168 if ($rtrim_before) {
4169 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
4170 } else {
4171 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
4172 }
4173 if ($space_after) {
4174 $good .= " ";
3705ce5b 4175 }
0a920b5b
AW
4176 }
4177
9c0ca6f9 4178 # '*' as part of a type definition -- reported already.
74048ed8 4179 } elsif ($opv eq '*_') {
9c0ca6f9
AW
4180 #warn "'*' is part of type\n";
4181
4182 # unary operators should have a space before and
4183 # none after. May be left adjacent to another
4184 # unary operator, or a cast
4185 } elsif ($op eq '!' || $op eq '~' ||
74048ed8 4186 $opv eq '*U' || $opv eq '-U' ||
0d413866 4187 $opv eq '&U' || $opv eq '&&U') {
cf655043 4188 if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
3705ce5b
JP
4189 if (ERROR("SPACING",
4190 "space required before that '$op' $at\n" . $hereptr)) {
b34c648b
JP
4191 if ($n != $last_after + 2) {
4192 $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
4193 $line_fixed = 1;
4194 }
3705ce5b 4195 }
0a920b5b 4196 }
a3340b35 4197 if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
171ae1a4
AW
4198 # A unary '*' may be const
4199
4200 } elsif ($ctx =~ /.xW/) {
3705ce5b
JP
4201 if (ERROR("SPACING",
4202 "space prohibited after that '$op' $at\n" . $hereptr)) {
b34c648b 4203 $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
3705ce5b
JP
4204 if (defined $fix_elements[$n + 2]) {
4205 $fix_elements[$n + 2] =~ s/^\s+//;
4206 }
b34c648b 4207 $line_fixed = 1;
3705ce5b 4208 }
0a920b5b
AW
4209 }
4210
4211 # unary ++ and unary -- are allowed no space on one side.
4212 } elsif ($op eq '++' or $op eq '--') {
773647a0 4213 if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
3705ce5b
JP
4214 if (ERROR("SPACING",
4215 "space required one side of that '$op' $at\n" . $hereptr)) {
b34c648b 4216 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
3705ce5b
JP
4217 $line_fixed = 1;
4218 }
773647a0
AW
4219 }
4220 if ($ctx =~ /Wx[BE]/ ||
4221 ($ctx =~ /Wx./ && $cc =~ /^;/)) {
3705ce5b
JP
4222 if (ERROR("SPACING",
4223 "space prohibited before that '$op' $at\n" . $hereptr)) {
b34c648b 4224 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5b
JP
4225 $line_fixed = 1;
4226 }
0a920b5b 4227 }
773647a0 4228 if ($ctx =~ /ExW/) {
3705ce5b
JP
4229 if (ERROR("SPACING",
4230 "space prohibited after that '$op' $at\n" . $hereptr)) {
b34c648b 4231 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
3705ce5b
JP
4232 if (defined $fix_elements[$n + 2]) {
4233 $fix_elements[$n + 2] =~ s/^\s+//;
4234 }
b34c648b 4235 $line_fixed = 1;
3705ce5b 4236 }
653d4876 4237 }
0a920b5b 4238
0a920b5b 4239 # << and >> may either have or not have spaces both sides
9c0ca6f9
AW
4240 } elsif ($op eq '<<' or $op eq '>>' or
4241 $op eq '&' or $op eq '^' or $op eq '|' or
4242 $op eq '+' or $op eq '-' or
c2fdda0d
AW
4243 $op eq '*' or $op eq '/' or
4244 $op eq '%')
0a920b5b 4245 {
d2e025f3
JP
4246 if ($check) {
4247 if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {
4248 if (CHK("SPACING",
4249 "spaces preferred around that '$op' $at\n" . $hereptr)) {
4250 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4251 $fix_elements[$n + 2] =~ s/^\s+//;
4252 $line_fixed = 1;
4253 }
4254 } elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {
4255 if (CHK("SPACING",
4256 "space preferred before that '$op' $at\n" . $hereptr)) {
4257 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);
4258 $line_fixed = 1;
4259 }
4260 }
4261 } elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
3705ce5b
JP
4262 if (ERROR("SPACING",
4263 "need consistent spacing around '$op' $at\n" . $hereptr)) {
b34c648b
JP
4264 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4265 if (defined $fix_elements[$n + 2]) {
4266 $fix_elements[$n + 2] =~ s/^\s+//;
4267 }
3705ce5b
JP
4268 $line_fixed = 1;
4269 }
0a920b5b
AW
4270 }
4271
1f65f947
AW
4272 # A colon needs no spaces before when it is
4273 # terminating a case value or a label.
4274 } elsif ($opv eq ':C' || $opv eq ':L') {
4275 if ($ctx =~ /Wx./) {
3705ce5b
JP
4276 if (ERROR("SPACING",
4277 "space prohibited before that '$op' $at\n" . $hereptr)) {
b34c648b 4278 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
3705ce5b
JP
4279 $line_fixed = 1;
4280 }
1f65f947
AW
4281 }
4282
0a920b5b 4283 # All the others need spaces both sides.
cf655043 4284 } elsif ($ctx !~ /[EWC]x[CWE]/) {
1f65f947
AW
4285 my $ok = 0;
4286
22f2a2ef 4287 # Ignore email addresses <foo@bar>
1f65f947
AW
4288 if (($op eq '<' &&
4289 $cc =~ /^\S+\@\S+>/) ||
4290 ($op eq '>' &&
4291 $ca =~ /<\S+\@\S+$/))
4292 {
4293 $ok = 1;
4294 }
4295
e0df7e1f
JP
4296 # for asm volatile statements
4297 # ignore a colon with another
4298 # colon immediately before or after
4299 if (($op eq ':') &&
4300 ($ca =~ /:$/ || $cc =~ /^:/)) {
4301 $ok = 1;
4302 }
4303
84731623 4304 # messages are ERROR, but ?: are CHK
1f65f947 4305 if ($ok == 0) {
84731623
JP
4306 my $msg_type = \&ERROR;
4307 $msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
4308
4309 if (&{$msg_type}("SPACING",
4310 "spaces required around that '$op' $at\n" . $hereptr)) {
b34c648b
JP
4311 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
4312 if (defined $fix_elements[$n + 2]) {
4313 $fix_elements[$n + 2] =~ s/^\s+//;
4314 }
3705ce5b
JP
4315 $line_fixed = 1;
4316 }
22f2a2ef 4317 }
0a920b5b 4318 }
4a0df2ef 4319 $off += length($elements[$n + 1]);
3705ce5b
JP
4320
4321## print("n: <$n> GOOD: <$good>\n");
4322
4323 $fixed_line = $fixed_line . $good;
4324 }
4325
4326 if (($#elements % 2) == 0) {
4327 $fixed_line = $fixed_line . $fix_elements[$#elements];
0a920b5b 4328 }
3705ce5b 4329
194f66fc
JP
4330 if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
4331 $fixed[$fixlinenr] = $fixed_line;
3705ce5b
JP
4332 }
4333
4334
0a920b5b
AW
4335 }
4336
786b6326 4337# check for whitespace before a non-naked semicolon
d2e248e7 4338 if ($line =~ /^\+.*\S\s+;\s*$/) {
786b6326
JP
4339 if (WARN("SPACING",
4340 "space prohibited before semicolon\n" . $herecurr) &&
4341 $fix) {
194f66fc 4342 1 while $fixed[$fixlinenr] =~
786b6326
JP
4343 s/^(\+.*\S)\s+;/$1;/;
4344 }
4345 }
4346
f0a594c1
AW
4347# check for multiple assignments
4348 if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
000d1cc1
JP
4349 CHK("MULTIPLE_ASSIGNMENTS",
4350 "multiple assignments should be avoided\n" . $herecurr);
f0a594c1
AW
4351 }
4352
22f2a2ef
AW
4353## # check for multiple declarations, allowing for a function declaration
4354## # continuation.
4355## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ &&
4356## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) {
4357##
4358## # Remove any bracketed sections to ensure we do not
4359## # falsly report the parameters of functions.
4360## my $ln = $line;
4361## while ($ln =~ s/\([^\(\)]*\)//g) {
4362## }
4363## if ($ln =~ /,/) {
000d1cc1
JP
4364## WARN("MULTIPLE_DECLARATION",
4365## "declaring multiple variables together should be avoided\n" . $herecurr);
22f2a2ef
AW
4366## }
4367## }
f0a594c1 4368
0a920b5b 4369#need space before brace following if, while, etc
6b8c69e4 4370 if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
4e5d56bd 4371 $line =~ /do\{/) {
3705ce5b
JP
4372 if (ERROR("SPACING",
4373 "space required before the open brace '{'\n" . $herecurr) &&
4374 $fix) {
194f66fc 4375 $fixed[$fixlinenr] =~ s/^(\+.*(?:do|\))){/$1 {/;
3705ce5b 4376 }
de7d4f0e
AW
4377 }
4378
c4a62ef9
JP
4379## # check for blank lines before declarations
4380## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ &&
4381## $prevrawline =~ /^.\s*$/) {
4382## WARN("SPACING",
4383## "No blank lines before declarations\n" . $hereprev);
4384## }
4385##
4386
de7d4f0e
AW
4387# closing brace should have a space following it when it has anything
4388# on the line
4389 if ($line =~ /}(?!(?:,|;|\)))\S/) {
d5e616fc
JP
4390 if (ERROR("SPACING",
4391 "space required after that close brace '}'\n" . $herecurr) &&
4392 $fix) {
194f66fc 4393 $fixed[$fixlinenr] =~
d5e616fc
JP
4394 s/}((?!(?:,|;|\)))\S)/} $1/;
4395 }
0a920b5b
AW
4396 }
4397
22f2a2ef
AW
4398# check spacing on square brackets
4399 if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
3705ce5b
JP
4400 if (ERROR("SPACING",
4401 "space prohibited after that open square bracket '['\n" . $herecurr) &&
4402 $fix) {
194f66fc 4403 $fixed[$fixlinenr] =~
3705ce5b
JP
4404 s/\[\s+/\[/;
4405 }
22f2a2ef
AW
4406 }
4407 if ($line =~ /\s\]/) {
3705ce5b
JP
4408 if (ERROR("SPACING",
4409 "space prohibited before that close square bracket ']'\n" . $herecurr) &&
4410 $fix) {
194f66fc 4411 $fixed[$fixlinenr] =~
3705ce5b
JP
4412 s/\s+\]/\]/;
4413 }
22f2a2ef
AW
4414 }
4415
c45dcabd 4416# check spacing on parentheses
9c0ca6f9
AW
4417 if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
4418 $line !~ /for\s*\(\s+;/) {
3705ce5b
JP
4419 if (ERROR("SPACING",
4420 "space prohibited after that open parenthesis '('\n" . $herecurr) &&
4421 $fix) {
194f66fc 4422 $fixed[$fixlinenr] =~
3705ce5b
JP
4423 s/\(\s+/\(/;
4424 }
22f2a2ef 4425 }
13214adf 4426 if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
c45dcabd
AW
4427 $line !~ /for\s*\(.*;\s+\)/ &&
4428 $line !~ /:\s+\)/) {
3705ce5b
JP
4429 if (ERROR("SPACING",
4430 "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
4431 $fix) {
194f66fc 4432 $fixed[$fixlinenr] =~
3705ce5b
JP
4433 s/\s+\)/\)/;
4434 }
22f2a2ef
AW
4435 }
4436
e2826fd0
JP
4437# check unnecessary parentheses around addressof/dereference single $Lvals
4438# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar
4439
4440 while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
ea4acbb1
JP
4441 my $var = $1;
4442 if (CHK("UNNECESSARY_PARENTHESES",
4443 "Unnecessary parentheses around $var\n" . $herecurr) &&
4444 $fix) {
4445 $fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;
4446 }
4447 }
4448
4449# check for unnecessary parentheses around function pointer uses
4450# ie: (foo->bar)(); should be foo->bar();
4451# but not "if (foo->bar) (" to avoid some false positives
4452 if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {
4453 my $var = $2;
4454 if (CHK("UNNECESSARY_PARENTHESES",
4455 "Unnecessary parentheses around function pointer $var\n" . $herecurr) &&
4456 $fix) {
4457 my $var2 = deparenthesize($var);
4458 $var2 =~ s/\s//g;
4459 $fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;
4460 }
4461 }
e2826fd0 4462
0a920b5b 4463#goto labels aren't indented, allow a single space however
4a0df2ef 4464 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
0a920b5b 4465 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
3705ce5b
JP
4466 if (WARN("INDENTED_LABEL",
4467 "labels should not be indented\n" . $herecurr) &&
4468 $fix) {
194f66fc 4469 $fixed[$fixlinenr] =~
3705ce5b
JP
4470 s/^(.)\s+/$1/;
4471 }
0a920b5b
AW
4472 }
4473
5b9553ab 4474# return is not a function
507e5141 4475 if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
c45dcabd 4476 my $spacing = $1;
507e5141 4477 if ($^V && $^V ge 5.10.0 &&
5b9553ab
JP
4478 $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
4479 my $value = $1;
4480 $value = deparenthesize($value);
4481 if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
4482 ERROR("RETURN_PARENTHESES",
4483 "return is not a function, parentheses are not required\n" . $herecurr);
4484 }
c45dcabd 4485 } elsif ($spacing !~ /\s+/) {
000d1cc1
JP
4486 ERROR("SPACING",
4487 "space required before the open parenthesis '('\n" . $herecurr);
c45dcabd
AW
4488 }
4489 }
507e5141 4490
b43ae21b
JP
4491# unnecessary return in a void function
4492# at end-of-function, with the previous line a single leading tab, then return;
4493# and the line before that not a goto label target like "out:"
4494 if ($sline =~ /^[ \+]}\s*$/ &&
4495 $prevline =~ /^\+\treturn\s*;\s*$/ &&
4496 $linenr >= 3 &&
4497 $lines[$linenr - 3] =~ /^[ +]/ &&
4498 $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
9819cf25 4499 WARN("RETURN_VOID",
b43ae21b
JP
4500 "void function return statements are not generally useful\n" . $hereprev);
4501 }
9819cf25 4502
189248d8
JP
4503# if statements using unnecessary parentheses - ie: if ((foo == bar))
4504 if ($^V && $^V ge 5.10.0 &&
4505 $line =~ /\bif\s*((?:\(\s*){2,})/) {
4506 my $openparens = $1;
4507 my $count = $openparens =~ tr@\(@\(@;
4508 my $msg = "";
4509 if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
4510 my $comp = $4; #Not $1 because of $LvalOrFunc
4511 $msg = " - maybe == should be = ?" if ($comp eq "==");
4512 WARN("UNNECESSARY_PARENTHESES",
4513 "Unnecessary parentheses$msg\n" . $herecurr);
4514 }
4515 }
4516
c5595fa2
JP
4517# comparisons with a constant or upper case identifier on the left
4518# avoid cases like "foo + BAR < baz"
4519# only fix matches surrounded by parentheses to avoid incorrect
4520# conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5"
4521 if ($^V && $^V ge 5.10.0 &&
4522 $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {
4523 my $lead = $1;
4524 my $const = $2;
4525 my $comp = $3;
4526 my $to = $4;
4527 my $newcomp = $comp;
f39e1769 4528 if ($lead !~ /(?:$Operators|\.)\s*$/ &&
c5595fa2
JP
4529 $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
4530 WARN("CONSTANT_COMPARISON",
4531 "Comparisons should place the constant on the right side of the test\n" . $herecurr) &&
4532 $fix) {
4533 if ($comp eq "<") {
4534 $newcomp = ">";
4535 } elsif ($comp eq "<=") {
4536 $newcomp = ">=";
4537 } elsif ($comp eq ">") {
4538 $newcomp = "<";
4539 } elsif ($comp eq ">=") {
4540 $newcomp = "<=";
4541 }
4542 $fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/;
4543 }
4544 }
4545
f34e4a4f
JP
4546# Return of what appears to be an errno should normally be negative
4547 if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
53a3c448
AW
4548 my $name = $1;
4549 if ($name ne 'EOF' && $name ne 'ERROR') {
000d1cc1 4550 WARN("USE_NEGATIVE_ERRNO",
f34e4a4f 4551 "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
53a3c448
AW
4552 }
4553 }
c45dcabd 4554
0a920b5b 4555# Need a space before open parenthesis after if, while etc
3705ce5b
JP
4556 if ($line =~ /\b(if|while|for|switch)\(/) {
4557 if (ERROR("SPACING",
4558 "space required before the open parenthesis '('\n" . $herecurr) &&
4559 $fix) {
194f66fc 4560 $fixed[$fixlinenr] =~
3705ce5b
JP
4561 s/\b(if|while|for|switch)\(/$1 \(/;
4562 }
0a920b5b
AW
4563 }
4564
f5fe35dd
AW
4565# Check for illegal assignment in if conditional -- and check for trailing
4566# statements after the conditional.
170d3a22 4567 if ($line =~ /do\s*(?!{)/) {
3e469cdc
AW
4568 ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
4569 ctx_statement_block($linenr, $realcnt, 0)
4570 if (!defined $stat);
170d3a22
AW
4571 my ($stat_next) = ctx_statement_block($line_nr_next,
4572 $remain_next, $off_next);
4573 $stat_next =~ s/\n./\n /g;
4574 ##print "stat<$stat> stat_next<$stat_next>\n";
4575
4576 if ($stat_next =~ /^\s*while\b/) {
4577 # If the statement carries leading newlines,
4578 # then count those as offsets.
4579 my ($whitespace) =
4580 ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
4581 my $offset =
4582 statement_rawlines($whitespace) - 1;
4583
4584 $suppress_whiletrailers{$line_nr_next +
4585 $offset} = 1;
4586 }
4587 }
4588 if (!defined $suppress_whiletrailers{$linenr} &&
c11230f4 4589 defined($stat) && defined($cond) &&
170d3a22 4590 $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
171ae1a4 4591 my ($s, $c) = ($stat, $cond);
8905a67c 4592
b53c8e10 4593 if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
000d1cc1
JP
4594 ERROR("ASSIGN_IN_IF",
4595 "do not use assignment in if condition\n" . $herecurr);
8905a67c
AW
4596 }
4597
4598 # Find out what is on the end of the line after the
4599 # conditional.
773647a0 4600 substr($s, 0, length($c), '');
8905a67c 4601 $s =~ s/\n.*//g;
13214adf 4602 $s =~ s/$;//g; # Remove any comments
53210168
AW
4603 if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
4604 $c !~ /}\s*while\s*/)
773647a0 4605 {
bb44ad39
AW
4606 # Find out how long the conditional actually is.
4607 my @newlines = ($c =~ /\n/gs);
4608 my $cond_lines = 1 + $#newlines;
42bdf74c 4609 my $stat_real = '';
bb44ad39 4610
42bdf74c
HS
4611 $stat_real = raw_line($linenr, $cond_lines)
4612 . "\n" if ($cond_lines);
bb44ad39
AW
4613 if (defined($stat_real) && $cond_lines > 1) {
4614 $stat_real = "[...]\n$stat_real";
4615 }
4616
000d1cc1
JP
4617 ERROR("TRAILING_STATEMENTS",
4618 "trailing statements should be on next line\n" . $herecurr . $stat_real);
8905a67c
AW
4619 }
4620 }
4621
13214adf
AW
4622# Check for bitwise tests written as boolean
4623 if ($line =~ /
4624 (?:
4625 (?:\[|\(|\&\&|\|\|)
4626 \s*0[xX][0-9]+\s*
4627 (?:\&\&|\|\|)
4628 |
4629 (?:\&\&|\|\|)
4630 \s*0[xX][0-9]+\s*
4631 (?:\&\&|\|\||\)|\])
4632 )/x)
4633 {
000d1cc1
JP
4634 WARN("HEXADECIMAL_BOOLEAN_TEST",
4635 "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
13214adf
AW
4636 }
4637
8905a67c 4638# if and else should not have general statements after it
13214adf
AW
4639 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
4640 my $s = $1;
4641 $s =~ s/$;//g; # Remove any comments
4642 if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
000d1cc1
JP
4643 ERROR("TRAILING_STATEMENTS",
4644 "trailing statements should be on next line\n" . $herecurr);
13214adf 4645 }
0a920b5b 4646 }
39667782
AW
4647# if should not continue a brace
4648 if ($line =~ /}\s*if\b/) {
000d1cc1 4649 ERROR("TRAILING_STATEMENTS",
048b123f 4650 "trailing statements should be on next line (or did you mean 'else if'?)\n" .
39667782
AW
4651 $herecurr);
4652 }
a1080bf8
AW
4653# case and default should not have general statements after them
4654 if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
4655 $line !~ /\G(?:
3fef12d6 4656 (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
a1080bf8
AW
4657 \s*return\s+
4658 )/xg)
4659 {
000d1cc1
JP
4660 ERROR("TRAILING_STATEMENTS",
4661 "trailing statements should be on next line\n" . $herecurr);
a1080bf8 4662 }
0a920b5b
AW
4663
4664 # Check for }<nl>else {, these must be at the same
4665 # indent level to be relevant to each other.
8b8856f4
JP
4666 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
4667 $previndent == $indent) {
4668 if (ERROR("ELSE_AFTER_BRACE",
4669 "else should follow close brace '}'\n" . $hereprev) &&
4670 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
4671 fix_delete_line($fixlinenr - 1, $prevrawline);
4672 fix_delete_line($fixlinenr, $rawline);
4673 my $fixedline = $prevrawline;
4674 $fixedline =~ s/}\s*$//;
4675 if ($fixedline !~ /^\+\s*$/) {
4676 fix_insert_line($fixlinenr, $fixedline);
4677 }
4678 $fixedline = $rawline;
4679 $fixedline =~ s/^(.\s*)else/$1} else/;
4680 fix_insert_line($fixlinenr, $fixedline);
4681 }
0a920b5b
AW
4682 }
4683
8b8856f4
JP
4684 if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
4685 $previndent == $indent) {
c2fdda0d
AW
4686 my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
4687
4688 # Find out what is on the end of the line after the
4689 # conditional.
773647a0 4690 substr($s, 0, length($c), '');
c2fdda0d
AW
4691 $s =~ s/\n.*//g;
4692
4693 if ($s =~ /^\s*;/) {
8b8856f4
JP
4694 if (ERROR("WHILE_AFTER_BRACE",
4695 "while should follow close brace '}'\n" . $hereprev) &&
4696 $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
4697 fix_delete_line($fixlinenr - 1, $prevrawline);
4698 fix_delete_line($fixlinenr, $rawline);
4699 my $fixedline = $prevrawline;
4700 my $trailing = $rawline;
4701 $trailing =~ s/^\+//;
4702 $trailing = trim($trailing);
4703 $fixedline =~ s/}\s*$/} $trailing/;
4704 fix_insert_line($fixlinenr, $fixedline);
4705 }
c2fdda0d
AW
4706 }
4707 }
4708
95e2c602 4709#Specific variable tests
323c1260
JP
4710 while ($line =~ m{($Constant|$Lval)}g) {
4711 my $var = $1;
95e2c602
JP
4712
4713#gcc binary extension
4714 if ($var =~ /^$Binary$/) {
d5e616fc
JP
4715 if (WARN("GCC_BINARY_CONSTANT",
4716 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
4717 $fix) {
4718 my $hexval = sprintf("0x%x", oct($var));
194f66fc 4719 $fixed[$fixlinenr] =~
d5e616fc
JP
4720 s/\b$var\b/$hexval/;
4721 }
95e2c602
JP
4722 }
4723
4724#CamelCase
807bd26c 4725 if ($var !~ /^$Constant$/ &&
be79794b 4726 $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
22735ce8 4727#Ignore Page<foo> variants
807bd26c 4728 $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
22735ce8 4729#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
f5123576
JW
4730 $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ &&
4731#Ignore some three character SI units explicitly, like MiB and KHz
4732 $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
7e781f67
JP
4733 while ($var =~ m{($Ident)}g) {
4734 my $word = $1;
4735 next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
d8b07710
JP
4736 if ($check) {
4737 seed_camelcase_includes();
4738 if (!$file && !$camelcase_file_seeded) {
4739 seed_camelcase_file($realfile);
4740 $camelcase_file_seeded = 1;
4741 }
4742 }
7e781f67
JP
4743 if (!defined $camelcase{$word}) {
4744 $camelcase{$word} = 1;
4745 CHK("CAMELCASE",
4746 "Avoid CamelCase: <$word>\n" . $herecurr);
4747 }
3445686a 4748 }
323c1260
JP
4749 }
4750 }
0a920b5b
AW
4751
4752#no spaces allowed after \ in define
d5e616fc
JP
4753 if ($line =~ /\#\s*define.*\\\s+$/) {
4754 if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
4755 "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
4756 $fix) {
194f66fc 4757 $fixed[$fixlinenr] =~ s/\s+$//;
d5e616fc 4758 }
0a920b5b
AW
4759 }
4760
0e212e0a
FF
4761# warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes
4762# itself <asm/foo.h> (uses RAW line)
c45dcabd 4763 if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) {
e09dec48
AW
4764 my $file = "$1.h";
4765 my $checkfile = "include/linux/$file";
4766 if (-f "$root/$checkfile" &&
4767 $realfile ne $checkfile &&
7840a94c 4768 $1 !~ /$allowed_asm_includes/)
c45dcabd 4769 {
0e212e0a
FF
4770 my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`;
4771 if ($asminclude > 0) {
4772 if ($realfile =~ m{^arch/}) {
4773 CHK("ARCH_INCLUDE_LINUX",
4774 "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
4775 } else {
4776 WARN("INCLUDE_LINUX",
4777 "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
4778 }
e09dec48 4779 }
0a920b5b
AW
4780 }
4781 }
4782
653d4876
AW
4783# multi-statement macros should be enclosed in a do while loop, grab the
4784# first statement and ensure its the whole macro if its not enclosed
cf655043 4785# in a known good container
b8f96a31
AW
4786 if ($realfile !~ m@/vmlinux.lds.h$@ &&
4787 $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
d8aaf121
AW
4788 my $ln = $linenr;
4789 my $cnt = $realcnt;
c45dcabd
AW
4790 my ($off, $dstat, $dcond, $rest);
4791 my $ctx = '';
08a2843e
JP
4792 my $has_flow_statement = 0;
4793 my $has_arg_concat = 0;
c45dcabd 4794 ($dstat, $dcond, $ln, $cnt, $off) =
f74bd194
AW
4795 ctx_statement_block($linenr, $realcnt, 0);
4796 $ctx = $dstat;
c45dcabd 4797 #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n";
a3bb97a7 4798 #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n";
c45dcabd 4799
08a2843e 4800 $has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
62e15a6d 4801 $has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/);
08a2843e 4802
f59b64bf
JP
4803 $dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//;
4804 my $define_args = $1;
4805 my $define_stmt = $dstat;
4806 my @def_args = ();
4807
4808 if (defined $define_args && $define_args ne "") {
4809 $define_args = substr($define_args, 1, length($define_args) - 2);
4810 $define_args =~ s/\s*//g;
4811 @def_args = split(",", $define_args);
4812 }
4813
292f1a9b 4814 $dstat =~ s/$;//g;
c45dcabd
AW
4815 $dstat =~ s/\\\n.//g;
4816 $dstat =~ s/^\s*//s;
4817 $dstat =~ s/\s*$//s;
de7d4f0e 4818
c45dcabd 4819 # Flatten any parentheses and braces
bf30d6ed
AW
4820 while ($dstat =~ s/\([^\(\)]*\)/1/ ||
4821 $dstat =~ s/\{[^\{\}]*\}/1/ ||
6b10df42 4822 $dstat =~ s/.\[[^\[\]]*\]/1/)
bf30d6ed 4823 {
de7d4f0e 4824 }
d8aaf121 4825
e45bab8e 4826 # Flatten any obvious string concatentation.
33acb54a
JP
4827 while ($dstat =~ s/($String)\s*$Ident/$1/ ||
4828 $dstat =~ s/$Ident\s*($String)/$1/)
e45bab8e
AW
4829 {
4830 }
4831
42e15293
JP
4832 # Make asm volatile uses seem like a generic function
4833 $dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
4834
c45dcabd
AW
4835 my $exceptions = qr{
4836 $Declare|
4837 module_param_named|
a0a0a7a9 4838 MODULE_PARM_DESC|
c45dcabd
AW
4839 DECLARE_PER_CPU|
4840 DEFINE_PER_CPU|
383099fd 4841 __typeof__\(|
22fd2d3e
SS
4842 union|
4843 struct|
ea71a0a0 4844 \.$Ident\s*=\s*|
6b10df42
VZ
4845 ^\"|\"$|
4846 ^\[
c45dcabd 4847 }x;
5eaa20b9 4848 #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n";
f59b64bf
JP
4849
4850 $ctx =~ s/\n*$//;
4851 my $herectx = $here . "\n";
4852 my $stmt_cnt = statement_rawlines($ctx);
4853
4854 for (my $n = 0; $n < $stmt_cnt; $n++) {
4855 $herectx .= raw_line($linenr, $n) . "\n";
4856 }
4857
f74bd194
AW
4858 if ($dstat ne '' &&
4859 $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(),
4860 $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo();
3cc4b1c3 4861 $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz
356fd398 4862 $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ && # character constants
f74bd194
AW
4863 $dstat !~ /$exceptions/ &&
4864 $dstat !~ /^\.$Ident\s*=/ && # .foo =
e942e2c3 4865 $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo
72f115f9 4866 $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...)
f74bd194
AW
4867 $dstat !~ /^for\s*$Constant$/ && # for (...)
4868 $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar()
4869 $dstat !~ /^do\s*{/ && # do {...
4e5d56bd 4870 $dstat !~ /^\(\{/ && # ({...
f95a7e6a 4871 $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
f74bd194 4872 {
e795556a
JP
4873 if ($dstat =~ /^\s*if\b/) {
4874 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
4875 "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx");
4876 } elsif ($dstat =~ /;/) {
f74bd194
AW
4877 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
4878 "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
4879 } else {
000d1cc1 4880 ERROR("COMPLEX_MACRO",
388982b5 4881 "Macros with complex values should be enclosed in parentheses\n" . "$herectx");
d8aaf121 4882 }
f59b64bf
JP
4883
4884 }
5207649b
JP
4885
4886 # Make $define_stmt single line, comment-free, etc
4887 my @stmt_array = split('\n', $define_stmt);
4888 my $first = 1;
4889 $define_stmt = "";
4890 foreach my $l (@stmt_array) {
4891 $l =~ s/\\$//;
4892 if ($first) {
4893 $define_stmt = $l;
4894 $first = 0;
4895 } elsif ($l =~ /^[\+ ]/) {
4896 $define_stmt .= substr($l, 1);
4897 }
4898 }
4899 $define_stmt =~ s/$;//g;
4900 $define_stmt =~ s/\s+/ /g;
4901 $define_stmt = trim($define_stmt);
4902
f59b64bf
JP
4903# check if any macro arguments are reused (ignore '...' and 'type')
4904 foreach my $arg (@def_args) {
4905 next if ($arg =~ /\.\.\./);
9192d41a 4906 next if ($arg =~ /^type$/i);
f59b64bf
JP
4907 my $tmp = $define_stmt;
4908 $tmp =~ s/\b(typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
5207649b 4909 $tmp =~ s/\#+\s*$arg\b//g;
f59b64bf
JP
4910 $tmp =~ s/\b$arg\s*\#\#//g;
4911 my $use_cnt = $tmp =~ s/\b$arg\b//g;
4912 if ($use_cnt > 1) {
4913 CHK("MACRO_ARG_REUSE",
4914 "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");
9192d41a
JP
4915 }
4916# check if any macro arguments may have other precedence issues
4917 if ($define_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
4918 ((defined($1) && $1 ne ',') ||
4919 (defined($2) && $2 ne ','))) {
4920 CHK("MACRO_ARG_PRECEDENCE",
4921 "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx");
f59b64bf 4922 }
653d4876 4923 }
5023d347 4924
08a2843e
JP
4925# check for macros with flow control, but without ## concatenation
4926# ## concatenation is commonly a macro that defines a function so ignore those
4927 if ($has_flow_statement && !$has_arg_concat) {
4928 my $herectx = $here . "\n";
4929 my $cnt = statement_rawlines($ctx);
4930
4931 for (my $n = 0; $n < $cnt; $n++) {
4932 $herectx .= raw_line($linenr, $n) . "\n";
4933 }
4934 WARN("MACRO_WITH_FLOW_CONTROL",
4935 "Macros with flow control statements should be avoided\n" . "$herectx");
4936 }
4937
481eb486 4938# check for line continuations outside of #defines, preprocessor #, and asm
5023d347
JP
4939
4940 } else {
4941 if ($prevline !~ /^..*\\$/ &&
481eb486
JP
4942 $line !~ /^\+\s*\#.*\\$/ && # preprocessor
4943 $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm
5023d347
JP
4944 $line =~ /^\+.*\\$/) {
4945 WARN("LINE_CONTINUATIONS",
4946 "Avoid unnecessary line continuations\n" . $herecurr);
4947 }
0a920b5b
AW
4948 }
4949
b13edf7f
JP
4950# do {} while (0) macro tests:
4951# single-statement macros do not need to be enclosed in do while (0) loop,
4952# macro should not end with a semicolon
4953 if ($^V && $^V ge 5.10.0 &&
4954 $realfile !~ m@/vmlinux.lds.h$@ &&
4955 $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
4956 my $ln = $linenr;
4957 my $cnt = $realcnt;
4958 my ($off, $dstat, $dcond, $rest);
4959 my $ctx = '';
4960 ($dstat, $dcond, $ln, $cnt, $off) =
4961 ctx_statement_block($linenr, $realcnt, 0);
4962 $ctx = $dstat;
4963
4964 $dstat =~ s/\\\n.//g;
1b36b201 4965 $dstat =~ s/$;/ /g;
b13edf7f
JP
4966
4967 if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
4968 my $stmts = $2;
4969 my $semis = $3;
4970
4971 $ctx =~ s/\n*$//;
4972 my $cnt = statement_rawlines($ctx);
4973 my $herectx = $here . "\n";
4974
4975 for (my $n = 0; $n < $cnt; $n++) {
4976 $herectx .= raw_line($linenr, $n) . "\n";
4977 }
4978
ac8e97f8
JP
4979 if (($stmts =~ tr/;/;/) == 1 &&
4980 $stmts !~ /^\s*(if|while|for|switch)\b/) {
b13edf7f
JP
4981 WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
4982 "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
4983 }
4984 if (defined $semis && $semis ne "") {
4985 WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
4986 "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
4987 }
f5ef95b1
JP
4988 } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
4989 $ctx =~ s/\n*$//;
4990 my $cnt = statement_rawlines($ctx);
4991 my $herectx = $here . "\n";
4992
4993 for (my $n = 0; $n < $cnt; $n++) {
4994 $herectx .= raw_line($linenr, $n) . "\n";
4995 }
4996
4997 WARN("TRAILING_SEMICOLON",
4998 "macros should not use a trailing semicolon\n" . "$herectx");
b13edf7f
JP
4999 }
5000 }
5001
080ba929
MF
5002# make sure symbols are always wrapped with VMLINUX_SYMBOL() ...
5003# all assignments may have only one of the following with an assignment:
5004# .
5005# ALIGN(...)
5006# VMLINUX_SYMBOL(...)
5007 if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) {
000d1cc1
JP
5008 WARN("MISSING_VMLINUX_SYMBOL",
5009 "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr);
080ba929
MF
5010 }
5011
f0a594c1 5012# check for redundant bracing round if etc
13214adf
AW
5013 if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
5014 my ($level, $endln, @chunks) =
cf655043 5015 ctx_statement_full($linenr, $realcnt, 1);
13214adf 5016 #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n";
cf655043
AW
5017 #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n";
5018 if ($#chunks > 0 && $level == 0) {
aad4f614
JP
5019 my @allowed = ();
5020 my $allow = 0;
13214adf 5021 my $seen = 0;
773647a0 5022 my $herectx = $here . "\n";
cf655043 5023 my $ln = $linenr - 1;
13214adf
AW
5024 for my $chunk (@chunks) {
5025 my ($cond, $block) = @{$chunk};
5026
773647a0
AW
5027 # If the condition carries leading newlines, then count those as offsets.
5028 my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
5029 my $offset = statement_rawlines($whitespace) - 1;
5030
aad4f614 5031 $allowed[$allow] = 0;
773647a0
AW
5032 #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n";
5033
5034 # We have looked at and allowed this specific line.
5035 $suppress_ifbraces{$ln + $offset} = 1;
5036
5037 $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
cf655043
AW
5038 $ln += statement_rawlines($block) - 1;
5039
773647a0 5040 substr($block, 0, length($cond), '');
13214adf
AW
5041
5042 $seen++ if ($block =~ /^\s*{/);
5043
aad4f614 5044 #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n";
cf655043
AW
5045 if (statement_lines($cond) > 1) {
5046 #print "APW: ALLOWED: cond<$cond>\n";
aad4f614 5047 $allowed[$allow] = 1;
13214adf
AW
5048 }
5049 if ($block =~/\b(?:if|for|while)\b/) {
cf655043 5050 #print "APW: ALLOWED: block<$block>\n";
aad4f614 5051 $allowed[$allow] = 1;
13214adf 5052 }
cf655043
AW
5053 if (statement_block_size($block) > 1) {
5054 #print "APW: ALLOWED: lines block<$block>\n";
aad4f614 5055 $allowed[$allow] = 1;
13214adf 5056 }
aad4f614 5057 $allow++;
13214adf 5058 }
aad4f614
JP
5059 if ($seen) {
5060 my $sum_allowed = 0;
5061 foreach (@allowed) {
5062 $sum_allowed += $_;
5063 }
5064 if ($sum_allowed == 0) {
5065 WARN("BRACES",
5066 "braces {} are not necessary for any arm of this statement\n" . $herectx);
5067 } elsif ($sum_allowed != $allow &&
5068 $seen != $allow) {
5069 CHK("BRACES",
5070 "braces {} should be used on all arms of this statement\n" . $herectx);
5071 }
13214adf
AW
5072 }
5073 }
5074 }
773647a0 5075 if (!defined $suppress_ifbraces{$linenr - 1} &&
13214adf 5076 $line =~ /\b(if|while|for|else)\b/) {
cf655043
AW
5077 my $allowed = 0;
5078
5079 # Check the pre-context.
5080 if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
5081 #print "APW: ALLOWED: pre<$1>\n";
5082 $allowed = 1;
5083 }
773647a0
AW
5084
5085 my ($level, $endln, @chunks) =
5086 ctx_statement_full($linenr, $realcnt, $-[0]);
5087
cf655043
AW
5088 # Check the condition.
5089 my ($cond, $block) = @{$chunks[0]};
773647a0 5090 #print "CHECKING<$linenr> cond<$cond> block<$block>\n";
cf655043 5091 if (defined $cond) {
773647a0 5092 substr($block, 0, length($cond), '');
cf655043
AW
5093 }
5094 if (statement_lines($cond) > 1) {
5095 #print "APW: ALLOWED: cond<$cond>\n";
5096 $allowed = 1;
5097 }
5098 if ($block =~/\b(?:if|for|while)\b/) {
5099 #print "APW: ALLOWED: block<$block>\n";
5100 $allowed = 1;
5101 }
5102 if (statement_block_size($block) > 1) {
5103 #print "APW: ALLOWED: lines block<$block>\n";
5104 $allowed = 1;
5105 }
5106 # Check the post-context.
5107 if (defined $chunks[1]) {
5108 my ($cond, $block) = @{$chunks[1]};
5109 if (defined $cond) {
773647a0 5110 substr($block, 0, length($cond), '');
cf655043
AW
5111 }
5112 if ($block =~ /^\s*\{/) {
5113 #print "APW: ALLOWED: chunk-1 block<$block>\n";
5114 $allowed = 1;
5115 }
5116 }
5117 if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
69932487 5118 my $herectx = $here . "\n";
f055663c 5119 my $cnt = statement_rawlines($block);
cf655043 5120
f055663c 5121 for (my $n = 0; $n < $cnt; $n++) {
69932487 5122 $herectx .= raw_line($linenr, $n) . "\n";
f0a594c1 5123 }
cf655043 5124
000d1cc1
JP
5125 WARN("BRACES",
5126 "braces {} are not necessary for single statement blocks\n" . $herectx);
f0a594c1
AW
5127 }
5128 }
5129
e4c5babd 5130# check for single line unbalanced braces
95330473
SE
5131 if ($sline =~ /^.\s*\}\s*else\s*$/ ||
5132 $sline =~ /^.\s*else\s*\{\s*$/) {
e4c5babd
JP
5133 CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr);
5134 }
5135
0979ae66 5136# check for unnecessary blank lines around braces
77b9a53a 5137 if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
f8e58219
JP
5138 if (CHK("BRACES",
5139 "Blank lines aren't necessary before a close brace '}'\n" . $hereprev) &&
5140 $fix && $prevrawline =~ /^\+/) {
5141 fix_delete_line($fixlinenr - 1, $prevrawline);
5142 }
0979ae66 5143 }
77b9a53a 5144 if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
f8e58219
JP
5145 if (CHK("BRACES",
5146 "Blank lines aren't necessary after an open brace '{'\n" . $hereprev) &&
5147 $fix) {
5148 fix_delete_line($fixlinenr, $rawline);
5149 }
0979ae66
JP
5150 }
5151
4a0df2ef 5152# no volatiles please
6c72ffaa
AW
5153 my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
5154 if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
000d1cc1 5155 WARN("VOLATILE",
8c27ceff 5156 "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr);
4a0df2ef
AW
5157 }
5158
5e4f6ba5
JP
5159# Check for user-visible strings broken across lines, which breaks the ability
5160# to grep for the string. Make exceptions when the previous string ends in a
5161# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{'
5162# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value
33acb54a 5163 if ($line =~ /^\+\s*$String/ &&
5e4f6ba5
JP
5164 $prevline =~ /"\s*$/ &&
5165 $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
5166 if (WARN("SPLIT_STRING",
5167 "quoted string split across lines\n" . $hereprev) &&
5168 $fix &&
5169 $prevrawline =~ /^\+.*"\s*$/ &&
5170 $last_coalesced_string_linenr != $linenr - 1) {
5171 my $extracted_string = get_quoted_string($line, $rawline);
5172 my $comma_close = "";
5173 if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) {
5174 $comma_close = $1;
5175 }
5176
5177 fix_delete_line($fixlinenr - 1, $prevrawline);
5178 fix_delete_line($fixlinenr, $rawline);
5179 my $fixedline = $prevrawline;
5180 $fixedline =~ s/"\s*$//;
5181 $fixedline .= substr($extracted_string, 1) . trim($comma_close);
5182 fix_insert_line($fixlinenr - 1, $fixedline);
5183 $fixedline = $rawline;
5184 $fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//;
5185 if ($fixedline !~ /\+\s*$/) {
5186 fix_insert_line($fixlinenr, $fixedline);
5187 }
5188 $last_coalesced_string_linenr = $linenr;
5189 }
5190 }
5191
5192# check for missing a space in a string concatenation
5193 if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
5194 WARN('MISSING_SPACE',
5195 "break quoted strings at a space character\n" . $hereprev);
5196 }
5197
e4b7d309
JP
5198# check for an embedded function name in a string when the function is known
5199# This does not work very well for -f --file checking as it depends on patch
5200# context providing the function name or a single line form for in-file
5201# function declarations
77cb8546
JP
5202 if ($line =~ /^\+.*$String/ &&
5203 defined($context_function) &&
e4b7d309
JP
5204 get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
5205 length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
77cb8546 5206 WARN("EMBEDDED_FUNCTION_NAME",
e4b7d309 5207 "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr);
77cb8546
JP
5208 }
5209
5e4f6ba5
JP
5210# check for spaces before a quoted newline
5211 if ($rawline =~ /^.*\".*\s\\n/) {
5212 if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
5213 "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
5214 $fix) {
5215 $fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
5216 }
5217
5218 }
5219
f17dba4f 5220# concatenated string without spaces between elements
33acb54a 5221 if ($line =~ /$String[A-Z_]/ || $line =~ /[A-Za-z0-9_]$String/) {
f17dba4f
JP
5222 CHK("CONCATENATED_STRING",
5223 "Concatenated strings should use spaces between elements\n" . $herecurr);
5224 }
5225
90ad30e5 5226# uncoalesced string fragments
33acb54a 5227 if ($line =~ /$String\s*"/) {
90ad30e5
JP
5228 WARN("STRING_FRAGMENTS",
5229 "Consecutive strings are generally better as a single string\n" . $herecurr);
5230 }
5231
522b837c
AD
5232# check for non-standard and hex prefixed decimal printf formats
5233 my $show_L = 1; #don't show the same defect twice
5234 my $show_Z = 1;
5e4f6ba5 5235 while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
522b837c 5236 my $string = substr($rawline, $-[1], $+[1] - $-[1]);
5e4f6ba5 5237 $string =~ s/%%/__/g;
522b837c
AD
5238 # check for %L
5239 if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
5e4f6ba5 5240 WARN("PRINTF_L",
522b837c
AD
5241 "\%L$1 is non-standard C, use %ll$1\n" . $herecurr);
5242 $show_L = 0;
5243 }
5244 # check for %Z
5245 if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) {
5246 WARN("PRINTF_Z",
5247 "%Z$1 is non-standard C, use %z$1\n" . $herecurr);
5248 $show_Z = 0;
5249 }
5250 # check for 0x<decimal>
5251 if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) {
5252 ERROR("PRINTF_0XDECIMAL",
6e300757
JP
5253 "Prefixing 0x with decimal output is defective\n" . $herecurr);
5254 }
5e4f6ba5
JP
5255 }
5256
5257# check for line continuations in quoted strings with odd counts of "
5258 if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) {
5259 WARN("LINE_CONTINUATIONS",
5260 "Avoid line continuations in quoted strings\n" . $herecurr);
5261 }
5262
00df344f 5263# warn about #if 0
c45dcabd 5264 if ($line =~ /^.\s*\#\s*if\s+0\b/) {
000d1cc1
JP
5265 CHK("REDUNDANT_CODE",
5266 "if this code is redundant consider removing it\n" .
de7d4f0e 5267 $herecurr);
4a0df2ef
AW
5268 }
5269
03df4b51
AW
5270# check for needless "if (<foo>) fn(<foo>)" uses
5271 if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
100425de
JP
5272 my $tested = quotemeta($1);
5273 my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;';
5274 if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) {
5275 my $func = $1;
5276 if (WARN('NEEDLESS_IF',
5277 "$func(NULL) is safe and this check is probably not required\n" . $hereprev) &&
5278 $fix) {
5279 my $do_fix = 1;
5280 my $leading_tabs = "";
5281 my $new_leading_tabs = "";
5282 if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) {
5283 $leading_tabs = $1;
5284 } else {
5285 $do_fix = 0;
5286 }
5287 if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) {
5288 $new_leading_tabs = $1;
5289 if (length($leading_tabs) + 1 ne length($new_leading_tabs)) {
5290 $do_fix = 0;
5291 }
5292 } else {
5293 $do_fix = 0;
5294 }
5295 if ($do_fix) {
5296 fix_delete_line($fixlinenr - 1, $prevrawline);
5297 $fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/;
5298 }
5299 }
4c432a8f
GKH
5300 }
5301 }
f0a594c1 5302
ebfdc409
JP
5303# check for unnecessary "Out of Memory" messages
5304 if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
5305 $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
5306 (defined $1 || defined $3) &&
5307 $linenr > 3) {
5308 my $testval = $2;
5309 my $testline = $lines[$linenr - 3];
5310
5311 my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
5312# print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
5313
5314 if ($c =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|(?:dev_)?alloc_skb)/) {
5315 WARN("OOM_MESSAGE",
5316 "Possible unnecessary 'out of memory' message\n" . $hereprev);
5317 }
5318 }
5319
f78d98f6 5320# check for logging functions with KERN_<LEVEL>
dcaf1123 5321 if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
f78d98f6
JP
5322 $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) {
5323 my $level = $1;
5324 if (WARN("UNNECESSARY_KERN_LEVEL",
5325 "Possible unnecessary $level\n" . $herecurr) &&
5326 $fix) {
5327 $fixed[$fixlinenr] =~ s/\s*$level\s*//;
5328 }
5329 }
5330
45c55e92
JP
5331# check for logging continuations
5332 if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) {
5333 WARN("LOGGING_CONTINUATION",
5334 "Avoid logging continuation uses where feasible\n" . $herecurr);
5335 }
5336
abb08a53
JP
5337# check for mask then right shift without a parentheses
5338 if ($^V && $^V ge 5.10.0 &&
5339 $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
5340 $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so
5341 WARN("MASK_THEN_SHIFT",
5342 "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr);
5343 }
5344
b75ac618
JP
5345# check for pointer comparisons to NULL
5346 if ($^V && $^V ge 5.10.0) {
5347 while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) {
5348 my $val = $1;
5349 my $equal = "!";
5350 $equal = "" if ($4 eq "!=");
5351 if (CHK("COMPARISON_TO_NULL",
5352 "Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) &&
5353 $fix) {
5354 $fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/;
5355 }
5356 }
5357 }
5358
8716de38
JP
5359# check for bad placement of section $InitAttribute (e.g.: __initdata)
5360 if ($line =~ /(\b$InitAttribute\b)/) {
5361 my $attr = $1;
5362 if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
5363 my $ptr = $1;
5364 my $var = $2;
5365 if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
5366 ERROR("MISPLACED_INIT",
5367 "$attr should be placed after $var\n" . $herecurr)) ||
5368 ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
5369 WARN("MISPLACED_INIT",
5370 "$attr should be placed after $var\n" . $herecurr))) &&
5371 $fix) {
194f66fc 5372 $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
5373 }
5374 }
5375 }
5376
e970b884
JP
5377# check for $InitAttributeData (ie: __initdata) with const
5378 if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
5379 my $attr = $1;
5380 $attr =~ /($InitAttributePrefix)(.*)/;
5381 my $attr_prefix = $1;
5382 my $attr_type = $2;
5383 if (ERROR("INIT_ATTRIBUTE",
5384 "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
5385 $fix) {
194f66fc 5386 $fixed[$fixlinenr] =~
e970b884
JP
5387 s/$InitAttributeData/${attr_prefix}initconst/;
5388 }
5389 }
5390
5391# check for $InitAttributeConst (ie: __initconst) without const
5392 if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
5393 my $attr = $1;
5394 if (ERROR("INIT_ATTRIBUTE",
5395 "Use of $attr requires a separate use of const\n" . $herecurr) &&
5396 $fix) {
194f66fc 5397 my $lead = $fixed[$fixlinenr] =~
e970b884
JP
5398 /(^\+\s*(?:static\s+))/;
5399 $lead = rtrim($1);
5400 $lead = "$lead " if ($lead !~ /^\+$/);
5401 $lead = "${lead}const ";
194f66fc 5402 $fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
e970b884
JP
5403 }
5404 }
5405
c17893c7
JP
5406# check for __read_mostly with const non-pointer (should just be const)
5407 if ($line =~ /\b__read_mostly\b/ &&
5408 $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) {
5409 if (ERROR("CONST_READ_MOSTLY",
5410 "Invalid use of __read_mostly with const type\n" . $herecurr) &&
5411 $fix) {
5412 $fixed[$fixlinenr] =~ s/\s+__read_mostly\b//;
5413 }
5414 }
5415
fbdb8138
JP
5416# don't use __constant_<foo> functions outside of include/uapi/
5417 if ($realfile !~ m@^include/uapi/@ &&
5418 $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
5419 my $constant_func = $1;
5420 my $func = $constant_func;
5421 $func =~ s/^__constant_//;
5422 if (WARN("CONSTANT_CONVERSION",
5423 "$constant_func should be $func\n" . $herecurr) &&
5424 $fix) {
194f66fc 5425 $fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
fbdb8138
JP
5426 }
5427 }
5428
1a15a250 5429# prefer usleep_range over udelay
37581c28 5430 if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
43c1d77c 5431 my $delay = $1;
1a15a250 5432 # ignore udelay's < 10, however
43c1d77c 5433 if (! ($delay < 10) ) {
000d1cc1 5434 CHK("USLEEP_RANGE",
43c1d77c
JP
5435 "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);
5436 }
5437 if ($delay > 2000) {
5438 WARN("LONG_UDELAY",
5439 "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
1a15a250
PP
5440 }
5441 }
5442
09ef8725
PP
5443# warn about unexpectedly long msleep's
5444 if ($line =~ /\bmsleep\s*\((\d+)\);/) {
5445 if ($1 < 20) {
000d1cc1 5446 WARN("MSLEEP",
43c1d77c 5447 "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);
09ef8725
PP
5448 }
5449 }
5450
36ec1939
JP
5451# check for comparisons of jiffies
5452 if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
5453 WARN("JIFFIES_COMPARISON",
5454 "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
5455 }
5456
9d7a34a5
JP
5457# check for comparisons of get_jiffies_64()
5458 if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
5459 WARN("JIFFIES_COMPARISON",
5460 "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
5461 }
5462
00df344f 5463# warn about #ifdefs in C files
c45dcabd 5464# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) {
00df344f
AW
5465# print "#ifdef in C files should be avoided\n";
5466# print "$herecurr";
5467# $clean = 0;
5468# }
5469
22f2a2ef 5470# warn about spacing in #ifdefs
c45dcabd 5471 if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
3705ce5b
JP
5472 if (ERROR("SPACING",
5473 "exactly one space required after that #$1\n" . $herecurr) &&
5474 $fix) {
194f66fc 5475 $fixed[$fixlinenr] =~
3705ce5b
JP
5476 s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
5477 }
5478
22f2a2ef
AW
5479 }
5480
4a0df2ef 5481# check for spinlock_t definitions without a comment.
171ae1a4
AW
5482 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
5483 $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
4a0df2ef
AW
5484 my $which = $1;
5485 if (!ctx_has_comment($first_line, $linenr)) {
000d1cc1
JP
5486 CHK("UNCOMMENTED_DEFINITION",
5487 "$1 definition without comment\n" . $herecurr);
4a0df2ef
AW
5488 }
5489 }
5490# check for memory barriers without a comment.
402c2553
MT
5491
5492 my $barriers = qr{
5493 mb|
5494 rmb|
5495 wmb|
5496 read_barrier_depends
5497 }x;
5498 my $barrier_stems = qr{
5499 mb__before_atomic|
5500 mb__after_atomic|
5501 store_release|
5502 load_acquire|
5503 store_mb|
5504 (?:$barriers)
5505 }x;
5506 my $all_barriers = qr{
5507 (?:$barriers)|
43e361f2
MT
5508 smp_(?:$barrier_stems)|
5509 virt_(?:$barrier_stems)
402c2553
MT
5510 }x;
5511
5512 if ($line =~ /\b(?:$all_barriers)\s*\(/) {
4a0df2ef 5513 if (!ctx_has_comment($first_line, $linenr)) {
c1fd7bb9
JP
5514 WARN("MEMORY_BARRIER",
5515 "memory barrier without comment\n" . $herecurr);
4a0df2ef
AW
5516 }
5517 }
3ad81779 5518
f4073b0f
MT
5519 my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x;
5520
5521 if ($realfile !~ m@^include/asm-generic/@ &&
5522 $realfile !~ m@/barrier\.h$@ &&
5523 $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ &&
5524 $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) {
5525 WARN("MEMORY_BARRIER",
5526 "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr);
5527 }
5528
cb426e99
JP
5529# check for waitqueue_active without a comment.
5530 if ($line =~ /\bwaitqueue_active\s*\(/) {
5531 if (!ctx_has_comment($first_line, $linenr)) {
5532 WARN("WAITQUEUE_ACTIVE",
5533 "waitqueue_active without comment\n" . $herecurr);
5534 }
5535 }
3ad81779
PM
5536
5537# Check for expedited grace periods that interrupt non-idle non-nohz
5538# online CPUs. These expedited can therefore degrade real-time response
5539# if used carelessly, and should be avoided where not absolutely
5540# needed. It is always OK to use synchronize_rcu_expedited() and
5541# synchronize_sched_expedited() at boot time (before real-time applications
5542# start) and in error situations where real-time response is compromised in
5543# any case. Note that synchronize_srcu_expedited() does -not- interrupt
5544# other CPUs, so don't warn on uses of synchronize_srcu_expedited().
5545# Of course, nothing comes for free, and srcu_read_lock() and
5546# srcu_read_unlock() do contain full memory barriers in payment for
5547# synchronize_srcu_expedited() non-interruption properties.
5548 if ($line =~ /\b(synchronize_rcu_expedited|synchronize_sched_expedited)\(/) {
5549 WARN("EXPEDITED_RCU_GRACE_PERIOD",
5550 "expedited RCU grace periods should be avoided where they can degrade real-time response\n" . $herecurr);
5551
5552 }
5553
4a0df2ef 5554# check of hardware specific defines
c45dcabd 5555 if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
000d1cc1
JP
5556 CHK("ARCH_DEFINES",
5557 "architecture specific defines should be avoided\n" . $herecurr);
0a920b5b 5558 }
653d4876 5559
d4977c78
TK
5560# Check that the storage class is at the beginning of a declaration
5561 if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
000d1cc1
JP
5562 WARN("STORAGE_CLASS",
5563 "storage class should be at the beginning of the declaration\n" . $herecurr)
d4977c78
TK
5564 }
5565
de7d4f0e
AW
5566# check the location of the inline attribute, that it is between
5567# storage class and type.
9c0ca6f9
AW
5568 if ($line =~ /\b$Type\s+$Inline\b/ ||
5569 $line =~ /\b$Inline\s+$Storage\b/) {
000d1cc1
JP
5570 ERROR("INLINE_LOCATION",
5571 "inline keyword should sit between storage class and type\n" . $herecurr);
de7d4f0e
AW
5572 }
5573
8905a67c 5574# Check for __inline__ and __inline, prefer inline
2b7ab453
JP
5575 if ($realfile !~ m@\binclude/uapi/@ &&
5576 $line =~ /\b(__inline__|__inline)\b/) {
d5e616fc
JP
5577 if (WARN("INLINE",
5578 "plain inline is preferred over $1\n" . $herecurr) &&
5579 $fix) {
194f66fc 5580 $fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
d5e616fc
JP
5581
5582 }
8905a67c
AW
5583 }
5584
3d130fd0 5585# Check for __attribute__ packed, prefer __packed
2b7ab453
JP
5586 if ($realfile !~ m@\binclude/uapi/@ &&
5587 $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
000d1cc1
JP
5588 WARN("PREFER_PACKED",
5589 "__packed is preferred over __attribute__((packed))\n" . $herecurr);
3d130fd0
JP
5590 }
5591
39b7e287 5592# Check for __attribute__ aligned, prefer __aligned
2b7ab453
JP
5593 if ($realfile !~ m@\binclude/uapi/@ &&
5594 $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
000d1cc1
JP
5595 WARN("PREFER_ALIGNED",
5596 "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
39b7e287
JP
5597 }
5598
5f14d3bd 5599# Check for __attribute__ format(printf, prefer __printf
2b7ab453
JP
5600 if ($realfile !~ m@\binclude/uapi/@ &&
5601 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
d5e616fc
JP
5602 if (WARN("PREFER_PRINTF",
5603 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
5604 $fix) {
194f66fc 5605 $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
d5e616fc
JP
5606
5607 }
5f14d3bd
JP
5608 }
5609
6061d949 5610# Check for __attribute__ format(scanf, prefer __scanf
2b7ab453
JP
5611 if ($realfile !~ m@\binclude/uapi/@ &&
5612 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
d5e616fc
JP
5613 if (WARN("PREFER_SCANF",
5614 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
5615 $fix) {
194f66fc 5616 $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
d5e616fc 5617 }
6061d949
JP
5618 }
5619
619a908a
JP
5620# Check for __attribute__ weak, or __weak declarations (may have link issues)
5621 if ($^V && $^V ge 5.10.0 &&
5622 $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ &&
5623 ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ ||
5624 $line =~ /\b__weak\b/)) {
5625 ERROR("WEAK_DECLARATION",
5626 "Using weak declarations can have unintended link defects\n" . $herecurr);
5627 }
5628
fd39f904 5629# check for c99 types like uint8_t used outside of uapi/ and tools/
e6176fa4 5630 if ($realfile !~ m@\binclude/uapi/@ &&
fd39f904 5631 $realfile !~ m@\btools/@ &&
e6176fa4
JP
5632 $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) {
5633 my $type = $1;
5634 if ($type =~ /\b($typeC99Typedefs)\b/) {
5635 $type = $1;
5636 my $kernel_type = 'u';
5637 $kernel_type = 's' if ($type =~ /^_*[si]/);
5638 $type =~ /(\d+)/;
5639 $kernel_type .= $1;
5640 if (CHK("PREFER_KERNEL_TYPES",
5641 "Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) &&
5642 $fix) {
5643 $fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/;
5644 }
5645 }
5646 }
5647
938224b5
JP
5648# check for cast of C90 native int or longer types constants
5649 if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) {
5650 my $cast = $1;
5651 my $const = $2;
5652 if (WARN("TYPECAST_INT_CONSTANT",
5653 "Unnecessary typecast of c90 int constant\n" . $herecurr) &&
5654 $fix) {
5655 my $suffix = "";
5656 my $newconst = $const;
5657 $newconst =~ s/${Int_type}$//;
5658 $suffix .= 'U' if ($cast =~ /\bunsigned\b/);
5659 if ($cast =~ /\blong\s+long\b/) {
5660 $suffix .= 'LL';
5661 } elsif ($cast =~ /\blong\b/) {
5662 $suffix .= 'L';
5663 }
5664 $fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/;
5665 }
5666 }
5667
8f53a9b8
JP
5668# check for sizeof(&)
5669 if ($line =~ /\bsizeof\s*\(\s*\&/) {
000d1cc1
JP
5670 WARN("SIZEOF_ADDRESS",
5671 "sizeof(& should be avoided\n" . $herecurr);
8f53a9b8
JP
5672 }
5673
66c80b60
JP
5674# check for sizeof without parenthesis
5675 if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
d5e616fc
JP
5676 if (WARN("SIZEOF_PARENTHESIS",
5677 "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
5678 $fix) {
194f66fc 5679 $fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
d5e616fc 5680 }
66c80b60
JP
5681 }
5682
88982fea
JP
5683# check for struct spinlock declarations
5684 if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
5685 WARN("USE_SPINLOCK_T",
5686 "struct spinlock should be spinlock_t\n" . $herecurr);
5687 }
5688
a6962d72 5689# check for seq_printf uses that could be seq_puts
06668727 5690 if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
a6962d72 5691 my $fmt = get_quoted_string($line, $rawline);
caac1d5f
HA
5692 $fmt =~ s/%%//g;
5693 if ($fmt !~ /%/) {
d5e616fc
JP
5694 if (WARN("PREFER_SEQ_PUTS",
5695 "Prefer seq_puts to seq_printf\n" . $herecurr) &&
5696 $fix) {
194f66fc 5697 $fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
d5e616fc 5698 }
a6962d72
JP
5699 }
5700 }
5701
0b523769
JP
5702 # check for vsprintf extension %p<foo> misuses
5703 if ($^V && $^V ge 5.10.0 &&
5704 defined $stat &&
5705 $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
5706 $1 !~ /^_*volatile_*$/) {
5707 my $bad_extension = "";
5708 my $lc = $stat =~ tr@\n@@;
5709 $lc = $lc + $linenr;
5710 for (my $count = $linenr; $count <= $lc; $count++) {
5711 my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
5712 $fmt =~ s/%%//g;
5713 if ($fmt =~ /(\%[\*\d\.]*p(?![\WFfSsBKRraEhMmIiUDdgVCbGN]).)/) {
5714 $bad_extension = $1;
5715 last;
5716 }
5717 }
5718 if ($bad_extension ne "") {
5719 my $stat_real = raw_line($linenr, 0);
5720 for (my $count = $linenr + 1; $count <= $lc; $count++) {
5721 $stat_real = $stat_real . "\n" . raw_line($count, 0);
5722 }
5723 WARN("VSPRINTF_POINTER_EXTENSION",
5724 "Invalid vsprintf pointer extension '$bad_extension'\n" . "$here\n$stat_real\n");
5725 }
5726 }
5727
554e165c 5728# Check for misused memsets
d1fe9c09
JP
5729 if ($^V && $^V ge 5.10.0 &&
5730 defined $stat &&
9e20a853 5731 $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
d7c76ba7
JP
5732
5733 my $ms_addr = $2;
d1fe9c09
JP
5734 my $ms_val = $7;
5735 my $ms_size = $12;
554e165c 5736
554e165c
AW
5737 if ($ms_size =~ /^(0x|)0$/i) {
5738 ERROR("MEMSET",
d7c76ba7 5739 "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
554e165c
AW
5740 } elsif ($ms_size =~ /^(0x|)1$/i) {
5741 WARN("MEMSET",
d7c76ba7
JP
5742 "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
5743 }
5744 }
5745
98a9bba5 5746# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar)
f333195d
JP
5747# if ($^V && $^V ge 5.10.0 &&
5748# defined $stat &&
5749# $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
5750# if (WARN("PREFER_ETHER_ADDR_COPY",
5751# "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") &&
5752# $fix) {
5753# $fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/;
5754# }
5755# }
98a9bba5 5756
b6117d17 5757# Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar)
f333195d
JP
5758# if ($^V && $^V ge 5.10.0 &&
5759# defined $stat &&
5760# $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
5761# WARN("PREFER_ETHER_ADDR_EQUAL",
5762# "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n")
5763# }
b6117d17 5764
8617cd09
MK
5765# check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr
5766# check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr
f333195d
JP
5767# if ($^V && $^V ge 5.10.0 &&
5768# defined $stat &&
5769# $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) {
5770#
5771# my $ms_val = $7;
5772#
5773# if ($ms_val =~ /^(?:0x|)0+$/i) {
5774# if (WARN("PREFER_ETH_ZERO_ADDR",
5775# "Prefer eth_zero_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_zero_addr($2)/;
5778# }
5779# } elsif ($ms_val =~ /^(?:0xff|255)$/i) {
5780# if (WARN("PREFER_ETH_BROADCAST_ADDR",
5781# "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") &&
5782# $fix) {
5783# $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/;
5784# }
5785# }
5786# }
8617cd09 5787
d7c76ba7 5788# typecasts on min/max could be min_t/max_t
d1fe9c09
JP
5789 if ($^V && $^V ge 5.10.0 &&
5790 defined $stat &&
d7c76ba7 5791 $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
d1fe9c09 5792 if (defined $2 || defined $7) {
d7c76ba7
JP
5793 my $call = $1;
5794 my $cast1 = deparenthesize($2);
5795 my $arg1 = $3;
d1fe9c09
JP
5796 my $cast2 = deparenthesize($7);
5797 my $arg2 = $8;
d7c76ba7
JP
5798 my $cast;
5799
d1fe9c09 5800 if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
d7c76ba7
JP
5801 $cast = "$cast1 or $cast2";
5802 } elsif ($cast1 ne "") {
5803 $cast = $cast1;
5804 } else {
5805 $cast = $cast2;
5806 }
5807 WARN("MINMAX",
5808 "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
554e165c
AW
5809 }
5810 }
5811
4a273195
JP
5812# check usleep_range arguments
5813 if ($^V && $^V ge 5.10.0 &&
5814 defined $stat &&
5815 $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
5816 my $min = $1;
5817 my $max = $7;
5818 if ($min eq $max) {
5819 WARN("USLEEP_RANGE",
5820 "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
5821 } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
5822 $min > $max) {
5823 WARN("USLEEP_RANGE",
5824 "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
5825 }
5826 }
5827
823b794c
JP
5828# check for naked sscanf
5829 if ($^V && $^V ge 5.10.0 &&
5830 defined $stat &&
6c8bd707 5831 $line =~ /\bsscanf\b/ &&
823b794c
JP
5832 ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
5833 $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
5834 $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
5835 my $lc = $stat =~ tr@\n@@;
5836 $lc = $lc + $linenr;
5837 my $stat_real = raw_line($linenr, 0);
5838 for (my $count = $linenr + 1; $count <= $lc; $count++) {
5839 $stat_real = $stat_real . "\n" . raw_line($count, 0);
5840 }
5841 WARN("NAKED_SSCANF",
5842 "unchecked sscanf return value\n" . "$here\n$stat_real\n");
5843 }
5844
afc819ab
JP
5845# check for simple sscanf that should be kstrto<foo>
5846 if ($^V && $^V ge 5.10.0 &&
5847 defined $stat &&
5848 $line =~ /\bsscanf\b/) {
5849 my $lc = $stat =~ tr@\n@@;
5850 $lc = $lc + $linenr;
5851 my $stat_real = raw_line($linenr, 0);
5852 for (my $count = $linenr + 1; $count <= $lc; $count++) {
5853 $stat_real = $stat_real . "\n" . raw_line($count, 0);
5854 }
5855 if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
5856 my $format = $6;
5857 my $count = $format =~ tr@%@%@;
5858 if ($count == 1 &&
5859 $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
5860 WARN("SSCANF_TO_KSTRTO",
5861 "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
5862 }
5863 }
5864 }
5865
70dc8a48
JP
5866# check for new externs in .h files.
5867 if ($realfile =~ /\.h$/ &&
5868 $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
d1d85780
JP
5869 if (CHK("AVOID_EXTERNS",
5870 "extern prototypes should be avoided in .h files\n" . $herecurr) &&
70dc8a48 5871 $fix) {
194f66fc 5872 $fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
70dc8a48
JP
5873 }
5874 }
5875
de7d4f0e 5876# check for new externs in .c files.
171ae1a4 5877 if ($realfile =~ /\.c$/ && defined $stat &&
c45dcabd 5878 $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
171ae1a4 5879 {
c45dcabd
AW
5880 my $function_name = $1;
5881 my $paren_space = $2;
171ae1a4
AW
5882
5883 my $s = $stat;
5884 if (defined $cond) {
5885 substr($s, 0, length($cond), '');
5886 }
c45dcabd
AW
5887 if ($s =~ /^\s*;/ &&
5888 $function_name ne 'uninitialized_var')
5889 {
000d1cc1
JP
5890 WARN("AVOID_EXTERNS",
5891 "externs should be avoided in .c files\n" . $herecurr);
171ae1a4
AW
5892 }
5893
5894 if ($paren_space =~ /\n/) {
000d1cc1
JP
5895 WARN("FUNCTION_ARGUMENTS",
5896 "arguments for function declarations should follow identifier\n" . $herecurr);
171ae1a4 5897 }
9c9ba34e
AW
5898
5899 } elsif ($realfile =~ /\.c$/ && defined $stat &&
5900 $stat =~ /^.\s*extern\s+/)
5901 {
000d1cc1
JP
5902 WARN("AVOID_EXTERNS",
5903 "externs should be avoided in .c files\n" . $herecurr);
de7d4f0e
AW
5904 }
5905
ca0d8929
JP
5906 if ($realfile =~ /\.[ch]$/ && defined $stat &&
5907 $stat =~ /^.\s*(?:extern\s+)?$Type\s*$Ident\s*\(\s*([^{]+)\s*\)\s*;/s &&
5908 $1 ne "void") {
5909 my $args = trim($1);
5910 while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
5911 my $arg = trim($1);
5912 if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
5913 WARN("FUNCTION_ARGUMENTS",
5914 "function definition argument '$arg' should also have an identifier name\n" . $herecurr);
5915 }
5916 }
5917 }
5918
de7d4f0e
AW
5919# checks for new __setup's
5920 if ($rawline =~ /\b__setup\("([^"]*)"/) {
5921 my $name = $1;
5922
5923 if (!grep(/$name/, @setup_docs)) {
000d1cc1 5924 CHK("UNDOCUMENTED_SETUP",
8c27ceff 5925 "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.rst\n" . $herecurr);
de7d4f0e 5926 }
653d4876 5927 }
9c0ca6f9
AW
5928
5929# check for pointless casting of kmalloc return
caf2a54f 5930 if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
000d1cc1
JP
5931 WARN("UNNECESSARY_CASTS",
5932 "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
9c0ca6f9 5933 }
13214adf 5934
a640d25c
JP
5935# alloc style
5936# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
5937 if ($^V && $^V ge 5.10.0 &&
5938 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
5939 CHK("ALLOC_SIZEOF_STRUCT",
5940 "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
5941 }
5942
60a55369
JP
5943# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
5944 if ($^V && $^V ge 5.10.0 &&
1b4a2ed4
JP
5945 defined $stat &&
5946 $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
60a55369
JP
5947 my $oldfunc = $3;
5948 my $a1 = $4;
5949 my $a2 = $10;
5950 my $newfunc = "kmalloc_array";
5951 $newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
e367455a
JP
5952 my $r1 = $a1;
5953 my $r2 = $a2;
5954 if ($a1 =~ /^sizeof\s*\S/) {
5955 $r1 = $a2;
5956 $r2 = $a1;
5957 }
5958 if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
5959 !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
1b4a2ed4
JP
5960 my $ctx = '';
5961 my $herectx = $here . "\n";
5962 my $cnt = statement_rawlines($stat);
5963 for (my $n = 0; $n < $cnt; $n++) {
5964 $herectx .= raw_line($linenr, $n) . "\n";
5965 }
60a55369 5966 if (WARN("ALLOC_WITH_MULTIPLY",
1b4a2ed4
JP
5967 "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&
5968 $cnt == 1 &&
60a55369 5969 $fix) {
194f66fc 5970 $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
5971 }
5972 }
5973 }
5974
972fdea2
JP
5975# check for krealloc arg reuse
5976 if ($^V && $^V ge 5.10.0 &&
5977 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) {
5978 WARN("KREALLOC_ARG_REUSE",
5979 "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
5980 }
5981
5ce59ae0
JP
5982# check for alloc argument mismatch
5983 if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
5984 WARN("ALLOC_ARRAY_ARGS",
5985 "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
5986 }
5987
caf2a54f
JP
5988# check for multiple semicolons
5989 if ($line =~ /;\s*;\s*$/) {
d5e616fc
JP
5990 if (WARN("ONE_SEMICOLON",
5991 "Statements terminations use 1 semicolon\n" . $herecurr) &&
5992 $fix) {
194f66fc 5993 $fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
d5e616fc 5994 }
d1e2ad07
JP
5995 }
5996
cec3aaa5
TW
5997# check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi
5998 if ($realfile !~ m@^include/uapi/@ &&
5999 $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
0ab90191
JP
6000 my $ull = "";
6001 $ull = "_ULL" if (defined($1) && $1 =~ /ll/i);
6002 if (CHK("BIT_MACRO",
6003 "Prefer using the BIT$ull macro\n" . $herecurr) &&
6004 $fix) {
6005 $fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/;
6006 }
6007 }
6008
2d632745
JP
6009# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE
6010 if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
6011 my $config = $1;
6012 if (WARN("PREFER_IS_ENABLED",
6013 "Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE\n" . $herecurr) &&
6014 $fix) {
6015 $fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
6016 }
6017 }
6018
e81f239b 6019# check for case / default statements not preceded by break/fallthrough/switch
c34c09a8
JP
6020 if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) {
6021 my $has_break = 0;
6022 my $has_statement = 0;
6023 my $count = 0;
6024 my $prevline = $linenr;
e81f239b 6025 while ($prevline > 1 && ($file || $count < 3) && !$has_break) {
c34c09a8
JP
6026 $prevline--;
6027 my $rline = $rawlines[$prevline - 1];
6028 my $fline = $lines[$prevline - 1];
6029 last if ($fline =~ /^\@\@/);
6030 next if ($fline =~ /^\-/);
6031 next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/);
6032 $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i);
6033 next if ($fline =~ /^.[\s$;]*$/);
6034 $has_statement = 1;
6035 $count++;
6036 $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/);
6037 }
6038 if (!$has_break && $has_statement) {
6039 WARN("MISSING_BREAK",
224236d9 6040 "Possible switch case/default not preceded by break or fallthrough comment\n" . $herecurr);
c34c09a8
JP
6041 }
6042 }
6043
d1e2ad07
JP
6044# check for switch/default statements without a break;
6045 if ($^V && $^V ge 5.10.0 &&
6046 defined $stat &&
6047 $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
6048 my $ctx = '';
6049 my $herectx = $here . "\n";
6050 my $cnt = statement_rawlines($stat);
6051 for (my $n = 0; $n < $cnt; $n++) {
6052 $herectx .= raw_line($linenr, $n) . "\n";
6053 }
6054 WARN("DEFAULT_NO_BREAK",
6055 "switch default: should use break\n" . $herectx);
caf2a54f
JP
6056 }
6057
13214adf 6058# check for gcc specific __FUNCTION__
d5e616fc
JP
6059 if ($line =~ /\b__FUNCTION__\b/) {
6060 if (WARN("USE_FUNC",
6061 "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) &&
6062 $fix) {
194f66fc 6063 $fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
d5e616fc 6064 }
13214adf 6065 }
773647a0 6066
62ec818f
JP
6067# check for uses of __DATE__, __TIME__, __TIMESTAMP__
6068 while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) {
6069 ERROR("DATE_TIME",
6070 "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr);
6071 }
6072
2c92488a
JP
6073# check for use of yield()
6074 if ($line =~ /\byield\s*\(\s*\)/) {
6075 WARN("YIELD",
6076 "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr);
6077 }
6078
179f8f40
JP
6079# check for comparisons against true and false
6080 if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
6081 my $lead = $1;
6082 my $arg = $2;
6083 my $test = $3;
6084 my $otype = $4;
6085 my $trail = $5;
6086 my $op = "!";
6087
6088 ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
6089
6090 my $type = lc($otype);
6091 if ($type =~ /^(?:true|false)$/) {
6092 if (("$test" eq "==" && "$type" eq "true") ||
6093 ("$test" eq "!=" && "$type" eq "false")) {
6094 $op = "";
6095 }
6096
6097 CHK("BOOL_COMPARISON",
6098 "Using comparison to $otype is error prone\n" . $herecurr);
6099
6100## maybe suggesting a correct construct would better
6101## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr);
6102
6103 }
6104 }
6105
4882720b
TG
6106# check for semaphores initialized locked
6107 if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
000d1cc1
JP
6108 WARN("CONSIDER_COMPLETION",
6109 "consider using a completion\n" . $herecurr);
773647a0 6110 }
6712d858 6111
67d0a075
JP
6112# recommend kstrto* over simple_strto* and strict_strto*
6113 if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
000d1cc1 6114 WARN("CONSIDER_KSTRTO",
67d0a075 6115 "$1 is obsolete, use k$3 instead\n" . $herecurr);
773647a0 6116 }
6712d858 6117
ae3ccc46 6118# check for __initcall(), use device_initcall() explicitly or more appropriate function please
f3db6639 6119 if ($line =~ /^.\s*__initcall\s*\(/) {
000d1cc1 6120 WARN("USE_DEVICE_INITCALL",
ae3ccc46 6121 "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
f3db6639 6122 }
6712d858 6123
0f3c5aab 6124# check for various structs that are normally const (ops, kgdb, device_tree)
d9190e4e 6125# and avoid what seem like struct definitions 'struct foo {'
6903ffb2 6126 if ($line !~ /\bconst\b/ &&
d9190e4e 6127 $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
000d1cc1 6128 WARN("CONST_STRUCT",
d9190e4e 6129 "struct $1 should normally be const\n" . $herecurr);
2b6db5cb 6130 }
773647a0
AW
6131
6132# use of NR_CPUS is usually wrong
6133# ignore definitions of NR_CPUS and usage to define arrays as likely right
6134 if ($line =~ /\bNR_CPUS\b/ &&
c45dcabd
AW
6135 $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
6136 $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
171ae1a4
AW
6137 $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
6138 $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
6139 $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
773647a0 6140 {
000d1cc1
JP
6141 WARN("NR_CPUS",
6142 "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
773647a0 6143 }
9c9ba34e 6144
52ea8506
JP
6145# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong.
6146 if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
6147 ERROR("DEFINE_ARCH_HAS",
6148 "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
6149 }
6150
acd9362c
JP
6151# likely/unlikely comparisons similar to "(likely(foo) > 0)"
6152 if ($^V && $^V ge 5.10.0 &&
6153 $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
6154 WARN("LIKELY_MISUSE",
6155 "Using $1 should generally have parentheses around the comparison\n" . $herecurr);
6156 }
6157
691d77b6
AW
6158# whine mightly about in_atomic
6159 if ($line =~ /\bin_atomic\s*\(/) {
6160 if ($realfile =~ m@^drivers/@) {
000d1cc1
JP
6161 ERROR("IN_ATOMIC",
6162 "do not use in_atomic in drivers\n" . $herecurr);
f4a87736 6163 } elsif ($realfile !~ m@^kernel/@) {
000d1cc1
JP
6164 WARN("IN_ATOMIC",
6165 "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
691d77b6
AW
6166 }
6167 }
1704f47b 6168
481aea5c
JP
6169# whine about ACCESS_ONCE
6170 if ($^V && $^V ge 5.10.0 &&
6171 $line =~ /\bACCESS_ONCE\s*$balanced_parens\s*(=(?!=))?\s*($FuncArg)?/) {
6172 my $par = $1;
6173 my $eq = $2;
6174 my $fun = $3;
6175 $par =~ s/^\(\s*(.*)\s*\)$/$1/;
6176 if (defined($eq)) {
6177 if (WARN("PREFER_WRITE_ONCE",
6178 "Prefer WRITE_ONCE(<FOO>, <BAR>) over ACCESS_ONCE(<FOO>) = <BAR>\n" . $herecurr) &&
6179 $fix) {
6180 $fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)\s*$eq\s*\Q$fun\E/WRITE_ONCE($par, $fun)/;
6181 }
6182 } else {
6183 if (WARN("PREFER_READ_ONCE",
6184 "Prefer READ_ONCE(<FOO>) over ACCESS_ONCE(<FOO>)\n" . $herecurr) &&
6185 $fix) {
6186 $fixed[$fixlinenr] =~ s/\bACCESS_ONCE\s*\(\s*\Q$par\E\s*\)/READ_ONCE($par)/;
6187 }
6188 }
6189 }
6190
0f5225b0
PZ
6191# check for mutex_trylock_recursive usage
6192 if ($line =~ /mutex_trylock_recursive/) {
6193 ERROR("LOCKING",
6194 "recursive locking is bad, do not use this ever.\n" . $herecurr);
6195 }
6196
1704f47b
PZ
6197# check for lockdep_set_novalidate_class
6198 if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
6199 $line =~ /__lockdep_no_validate__\s*\)/ ) {
6200 if ($realfile !~ m@^kernel/lockdep@ &&
6201 $realfile !~ m@^include/linux/lockdep@ &&
6202 $realfile !~ m@^drivers/base/core@) {
000d1cc1
JP
6203 ERROR("LOCKDEP",
6204 "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
1704f47b
PZ
6205 }
6206 }
88f8831c 6207
b392c64f
JP
6208 if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ ||
6209 $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) {
000d1cc1
JP
6210 WARN("EXPORTED_WORLD_WRITABLE",
6211 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
88f8831c 6212 }
2435880f 6213
515a235e
JP
6214# Mode permission misuses where it seems decimal should be octal
6215# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
6216 if ($^V && $^V ge 5.10.0 &&
459cf0ae 6217 defined $stat &&
515a235e
JP
6218 $line =~ /$mode_perms_search/) {
6219 foreach my $entry (@mode_permission_funcs) {
6220 my $func = $entry->[0];
6221 my $arg_pos = $entry->[1];
6222
459cf0ae
JP
6223 my $lc = $stat =~ tr@\n@@;
6224 $lc = $lc + $linenr;
6225 my $stat_real = raw_line($linenr, 0);
6226 for (my $count = $linenr + 1; $count <= $lc; $count++) {
6227 $stat_real = $stat_real . "\n" . raw_line($count, 0);
6228 }
6229
515a235e
JP
6230 my $skip_args = "";
6231 if ($arg_pos > 1) {
6232 $arg_pos--;
6233 $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
6234 }
f90774e1 6235 my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
459cf0ae 6236 if ($stat =~ /$test/) {
515a235e
JP
6237 my $val = $1;
6238 $val = $6 if ($skip_args ne "");
f90774e1
JP
6239 if (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
6240 ($val =~ /^$Octal$/ && length($val) ne 4)) {
515a235e 6241 ERROR("NON_OCTAL_PERMISSIONS",
459cf0ae 6242 "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real);
f90774e1
JP
6243 }
6244 if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
c0a5c898 6245 ERROR("EXPORTED_WORLD_WRITABLE",
459cf0ae 6246 "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real);
f90774e1 6247 }
2435880f
JP
6248 }
6249 }
6250 }
5a6d20ce 6251
459cf0ae
JP
6252# check for uses of S_<PERMS> that could be octal for readability
6253 if ($line =~ /\b$mode_perms_string_search\b/) {
6254 my $val = "";
6255 my $oval = "";
6256 my $to = 0;
6257 my $curpos = 0;
6258 my $lastpos = 0;
6259 while ($line =~ /\b(($mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
6260 $curpos = pos($line);
6261 my $match = $2;
6262 my $omatch = $1;
6263 last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
6264 $lastpos = $curpos;
6265 $to |= $mode_permission_string_types{$match};
6266 $val .= '\s*\|\s*' if ($val ne "");
6267 $val .= $match;
6268 $oval .= $omatch;
6269 }
6270 $oval =~ s/^\s*\|\s*//;
6271 $oval =~ s/\s*\|\s*$//;
6272 my $octal = sprintf("%04o", $to);
6273 if (WARN("SYMBOLIC_PERMS",
6274 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) &&
6275 $fix) {
6276 $fixed[$fixlinenr] =~ s/$val/$octal/;
6277 }
6278 }
6279
5a6d20ce
BA
6280# validate content of MODULE_LICENSE against list from include/linux/module.h
6281 if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) {
6282 my $extracted_string = get_quoted_string($line, $rawline);
6283 my $valid_licenses = qr{
6284 GPL|
6285 GPL\ v2|
6286 GPL\ and\ additional\ rights|
6287 Dual\ BSD/GPL|
6288 Dual\ MIT/GPL|
6289 Dual\ MPL/GPL|
6290 Proprietary
6291 }x;
6292 if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) {
6293 WARN("MODULE_LICENSE",
6294 "unknown module license " . $extracted_string . "\n" . $herecurr);
6295 }
6296 }
13214adf
AW
6297 }
6298
6299 # If we have no input at all, then there is nothing to report on
6300 # so just keep quiet.
6301 if ($#rawlines == -1) {
6302 exit(0);
0a920b5b
AW
6303 }
6304
8905a67c
AW
6305 # In mailback mode only produce a report in the negative, for
6306 # things that appear to be patches.
6307 if ($mailback && ($clean == 1 || !$is_patch)) {
6308 exit(0);
6309 }
6310
6311 # This is not a patch, and we are are in 'no-patch' mode so
6312 # just keep quiet.
6313 if (!$chk_patch && !$is_patch) {
6314 exit(0);
6315 }
6316
06330fc4 6317 if (!$is_patch && $file !~ /cover-letter\.patch$/) {
000d1cc1
JP
6318 ERROR("NOT_UNIFIED_DIFF",
6319 "Does not appear to be a unified-diff format patch\n");
0a920b5b 6320 }
ed43c4e5 6321 if ($is_patch && $has_commit_log && $chk_signoff && $signoff == 0) {
000d1cc1
JP
6322 ERROR("MISSING_SIGN_OFF",
6323 "Missing Signed-off-by: line(s)\n");
0a920b5b
AW
6324 }
6325
8905a67c 6326 print report_dump();
13214adf
AW
6327 if ($summary && !($clean == 1 && $quiet == 1)) {
6328 print "$filename " if ($summary_file);
8905a67c
AW
6329 print "total: $cnt_error errors, $cnt_warn warnings, " .
6330 (($check)? "$cnt_chk checks, " : "") .
6331 "$cnt_lines lines checked\n";
f0a594c1 6332 }
8905a67c 6333
d2c0a235 6334 if ($quiet == 0) {
ef212196
JP
6335 # If there were any defects found and not already fixing them
6336 if (!$clean and !$fix) {
6337 print << "EOM"
6338
6339NOTE: For some of the reported defects, checkpatch may be able to
6340 mechanically convert to the typical style using --fix or --fix-inplace.
6341EOM
6342 }
d2c0a235
AW
6343 # If there were whitespace errors which cleanpatch can fix
6344 # then suggest that.
6345 if ($rpt_cleaners) {
b0781216 6346 $rpt_cleaners = 0;
d8469f16
JP
6347 print << "EOM"
6348
6349NOTE: Whitespace errors detected.
6350 You may wish to use scripts/cleanpatch or scripts/cleanfile
6351EOM
d2c0a235
AW
6352 }
6353 }
6354
d752fcc8
JP
6355 if ($clean == 0 && $fix &&
6356 ("@rawlines" ne "@fixed" ||
6357 $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
9624b8d6
JP
6358 my $newfile = $filename;
6359 $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
3705ce5b
JP
6360 my $linecount = 0;
6361 my $f;
6362
d752fcc8
JP
6363 @fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
6364
3705ce5b
JP
6365 open($f, '>', $newfile)
6366 or die "$P: Can't open $newfile for write\n";
6367 foreach my $fixed_line (@fixed) {
6368 $linecount++;
6369 if ($file) {
6370 if ($linecount > 3) {
6371 $fixed_line =~ s/^\+//;
d752fcc8 6372 print $f $fixed_line . "\n";
3705ce5b
JP
6373 }
6374 } else {
6375 print $f $fixed_line . "\n";
6376 }
6377 }
6378 close($f);
6379
6380 if (!$quiet) {
6381 print << "EOM";
d8469f16 6382
3705ce5b
JP
6383Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
6384
6385Do _NOT_ trust the results written to this file.
6386Do _NOT_ submit these changes without inspecting them for correctness.
6387
6388This EXPERIMENTAL file is simply a convenience to help rewrite patches.
6389No warranties, expressed or implied...
3705ce5b
JP
6390EOM
6391 }
6392 }
6393
d8469f16
JP
6394 if ($quiet == 0) {
6395 print "\n";
6396 if ($clean == 1) {
6397 print "$vname has no obvious style problems and is ready for submission.\n";
6398 } else {
6399 print "$vname has style problems, please review.\n";
6400 }
0a920b5b
AW
6401 }
6402 return $clean;
6403}