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