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