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