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