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