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