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