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