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