2 # (c) 2001, Dave Jones. (the file handling bit)
3 # (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
4 # (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
5 # (c) 2008-2010 Andy Whitcroft <apw@canonical.com>
6 # Licensed under the terms of the GNU GPL License version 2
13 use Term::ANSIColor qw(:constants);
16 my $D = dirname(abs_path($P));
20 use Getopt::Long qw(:config no_auto_abbrev);
50 my $configuration_file = ".checkpatch.conf";
51 my $max_line_length = 80;
52 my $ignore_perl_version = 0;
53 my $minimum_perl_version = 5.10.0;
54 my $min_conf_desc_length = 4;
55 my $spelling_file = "$D/spelling.txt";
57 my $codespellfile = "/usr/share/codespell/dictionary.txt";
58 my $conststructsfile = "$D/const_structs.checkpatch";
59 my $typedefsfile = "";
61 my $allow_c99_comments = 1;
67 Usage: $P [OPTION]... [FILE]...
72 --no-tree run without a kernel tree
73 --no-signoff do not check for 'Signed-off-by' line
74 --patch treat FILE as patchfile (default)
75 --emacs emacs compile window format
76 --terse one line per report
77 --showfile emit diffed file position, not input file position
78 -g, --git treat FILE as a single commit or git revision range
79 single git commit with:
83 multiple git commits with:
87 git merges are ignored
88 -f, --file treat FILE as regular source file
89 --subjective, --strict enable more subjective tests
90 --list-types list the possible message types
91 --types TYPE(,TYPE2...) show only these comma separated message types
92 --ignore TYPE(,TYPE2...) ignore various comma separated message types
93 --show-types show the specific message type in the output
94 --max-line-length=n set the maximum line length, if exceeded, warn
95 --min-conf-desc-length=n set the min description length, if shorter, warn
96 --root=PATH PATH to the kernel tree root
97 --no-summary suppress the per-file summary
98 --mailback only produce a report in case of warnings/errors
99 --summary-file include the filename in summary
100 --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of
101 'values', 'possible', 'type', and 'attr' (default
103 --test-only=WORD report only warnings/errors containing WORD
105 --fix EXPERIMENTAL - may create horrible results
106 If correctable single-line errors exist, create
107 "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
108 with potential errors corrected to the preferred
110 --fix-inplace EXPERIMENTAL - may create horrible results
111 Is the same as --fix, but overwrites the input
112 file. It's your fault if there's no backup or git
113 --ignore-perl-version override checking of perl version. expect
115 --codespell Use the codespell dictionary for spelling/typos
116 (default:/usr/share/codespell/dictionary.txt)
117 --codespellfile Use this codespell dictionary
118 --typedefsfile Read additional types from this file
119 --color[=WHEN] Use colors 'always', 'never', or only when output
120 is a terminal ('auto'). Default is 'auto'.
121 -h, --help, --version display this help and exit
123 When FILE is - read standard input.
131 return grep { !$seen{$_}++ } @_;
141 open(my $script, '<', abs_path($P)) or
142 die "$P: Can't read '$P' $!\n";
144 my $text = <$script>;
148 # Also catch when type or level is passed through a variable
149 for ($text =~ /(?:(?:\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) {
152 @types = sort(uniq(@types));
153 print("#\tMessage type\n\n");
154 foreach my $type (@types) {
155 print(++$count . "\t" . $type . "\n");
161 my $conf = which_conf($configuration_file);
164 open(my $conffile, '<', "$conf")
165 or warn "$P: Can't find a readable $configuration_file file $!\n";
167 while (<$conffile>) {
170 $line =~ s/\s*\n?$//g;
174 next if ($line =~ m/^\s*#/);
175 next if ($line =~ m/^\s*$/);
177 my @words = split(" ", $line);
178 foreach my $word (@words) {
179 last if ($word =~ m/^#/);
180 push (@conf_args, $word);
184 unshift(@ARGV, @conf_args) if @conf_args;
187 # Perl's Getopt::Long allows options to take optional arguments after a space.
188 # Prevent --color by itself from consuming other arguments
190 if ($_ eq "--color" || $_ eq "-color") {
191 $_ = "--color=$color";
196 'q|quiet+' => \$quiet,
198 'signoff!' => \$chk_signoff,
199 'patch!' => \$chk_patch,
202 'showfile!' => \$showfile,
205 'subjective!' => \$check,
206 'strict!' => \$check,
207 'ignore=s' => \@ignore,
209 'show-types!' => \$show_types,
210 'list-types!' => \$list_types,
211 'max-line-length=i' => \$max_line_length,
212 'min-conf-desc-length=i' => \$min_conf_desc_length,
214 'summary!' => \$summary,
215 'mailback!' => \$mailback,
216 'summary-file!' => \$summary_file,
218 'fix-inplace!' => \$fix_inplace,
219 'ignore-perl-version!' => \$ignore_perl_version,
220 'debug=s' => \%debug,
221 'test-only=s' => \$tst_only,
222 'codespell!' => \$codespell,
223 'codespellfile=s' => \$codespellfile,
224 'typedefsfile=s' => \$typedefsfile,
225 'color=s' => \$color,
226 'no-color' => \$color, #keep old behaviors of -nocolor
227 'nocolor' => \$color, #keep old behaviors of -nocolor
234 list_types(0) if ($list_types);
236 $fix = 1 if ($fix_inplace);
237 $check_orig = $check;
241 if ($^V && $^V lt $minimum_perl_version) {
242 printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
243 if (!$ignore_perl_version) {
248 #if no filenames are given, push '-' to read patch from stdin
253 if ($color =~ /^[01]$/) {
255 } elsif ($color =~ /^always$/i) {
257 } elsif ($color =~ /^never$/i) {
259 } elsif ($color =~ /^auto$/i) {
260 $color = (-t STDOUT);
262 die "Invalid color mode: $color\n";
265 sub hash_save_array_words {
266 my ($hashRef, $arrayRef) = @_;
268 my @array = split(/,/, join(',', @$arrayRef));
269 foreach my $word (@array) {
270 $word =~ s/\s*\n?$//g;
273 $word =~ tr/[a-z]/[A-Z]/;
275 next if ($word =~ m/^\s*#/);
276 next if ($word =~ m/^\s*$/);
282 sub hash_show_words {
283 my ($hashRef, $prefix) = @_;
285 if (keys %$hashRef) {
286 print "\nNOTE: $prefix message types:";
287 foreach my $word (sort keys %$hashRef) {
294 hash_save_array_words(\%ignore_type, \@ignore);
295 hash_save_array_words(\%use_type, \@use);
298 my $dbg_possible = 0;
301 for my $key (keys %debug) {
303 eval "\${dbg_$key} = '$debug{$key}';";
307 my $rpt_cleaners = 0;
316 if (!top_of_kernel_tree($root)) {
317 die "$P: $root: --root does not point at a valid tree\n";
320 if (top_of_kernel_tree('.')) {
322 } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
323 top_of_kernel_tree($1)) {
328 if (!defined $root) {
329 print "Must be run from the top-level dir. of a kernel tree\n";
334 my $emitted_corrupt = 0;
337 [A-Za-z_][A-Za-z\d_]*
338 (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
340 our $Storage = qr{extern|static|asmlinkage};
353 our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
354 our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
355 our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
356 our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
357 our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
359 # Notes to $Attribute:
360 # We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
381 ____cacheline_aligned|
382 ____cacheline_aligned_in_smp|
383 ____cacheline_internodealigned_in_smp|
387 our $Inline = qr{inline|__always_inline|noinline|__inline|__inline__};
388 our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
389 our $Lval = qr{$Ident(?:$Member)*};
391 our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u};
392 our $Binary = qr{(?i)0b[01]+$Int_type?};
393 our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?};
394 our $Int = qr{[0-9]+$Int_type?};
395 our $Octal = qr{0[0-7]+$Int_type?};
396 our $String = qr{"[X\t]*"};
397 our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
398 our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
399 our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
400 our $Float = qr{$Float_hex|$Float_dec|$Float_int};
401 our $Constant = qr{$Float|$Binary|$Octal|$Hex|$Int};
402 our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
403 our $Compare = qr{<=|>=|==|!=|<|(?<!-)>};
404 our $Arithmetic = qr{\+|-|\*|\/|%};
408 &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
411 our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
415 our $NonptrTypeMisordered;
416 our $NonptrTypeWithAttr;
420 our $DeclareMisordered;
422 our $NON_ASCII_UTF8 = qr{
423 [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
424 | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
425 | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
426 | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
427 | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
428 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
429 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
433 [\x09\x0A\x0D\x20-\x7E] # ASCII
437 our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t};
438 our $typeOtherOSTypedefs = qr{(?x:
439 u_(?:char|short|int|long) | # bsd
440 u(?:nchar|short|int|long) # sysv
442 our $typeKernelTypedefs = qr{(?x:
443 (?:__)?(?:u|s|be|le)(?:8|16|32|64)|
446 our $typeTypedefs = qr{(?x:
448 $typeOtherOSTypedefs\b|
449 $typeKernelTypedefs\b
452 our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
454 our $logFunctions = qr{(?x:
455 printk(?:_ratelimited|_once|_deferred_once|_deferred|)|
456 (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
458 WARN(?:_RATELIMIT|_ONCE|)|
461 seq_vprintf|seq_printf|seq_puts
464 our $signature_tags = qr{(?xi:
475 our @typeListMisordered = (
476 qr{char\s+(?:un)?signed},
477 qr{int\s+(?:(?:un)?signed\s+)?short\s},
478 qr{int\s+short(?:\s+(?:un)?signed)},
479 qr{short\s+int(?:\s+(?:un)?signed)},
480 qr{(?:un)?signed\s+int\s+short},
481 qr{short\s+(?:un)?signed},
482 qr{long\s+int\s+(?:un)?signed},
483 qr{int\s+long\s+(?:un)?signed},
484 qr{long\s+(?:un)?signed\s+int},
485 qr{int\s+(?:un)?signed\s+long},
486 qr{int\s+(?:un)?signed},
487 qr{int\s+long\s+long\s+(?:un)?signed},
488 qr{long\s+long\s+int\s+(?:un)?signed},
489 qr{long\s+long\s+(?:un)?signed\s+int},
490 qr{long\s+long\s+(?:un)?signed},
491 qr{long\s+(?:un)?signed},
496 qr{(?:(?:un)?signed\s+)?char},
497 qr{(?:(?:un)?signed\s+)?short\s+int},
498 qr{(?:(?:un)?signed\s+)?short},
499 qr{(?:(?:un)?signed\s+)?int},
500 qr{(?:(?:un)?signed\s+)?long\s+int},
501 qr{(?:(?:un)?signed\s+)?long\s+long\s+int},
502 qr{(?:(?:un)?signed\s+)?long\s+long},
503 qr{(?:(?:un)?signed\s+)?long},
512 qr{${Ident}_handler},
513 qr{${Ident}_handler_fn},
517 our $C90_int_types = qr{(?x:
518 long\s+long\s+int\s+(?:un)?signed|
519 long\s+long\s+(?:un)?signed\s+int|
520 long\s+long\s+(?:un)?signed|
521 (?:(?:un)?signed\s+)?long\s+long\s+int|
522 (?:(?:un)?signed\s+)?long\s+long|
523 int\s+long\s+long\s+(?:un)?signed|
524 int\s+(?:(?:un)?signed\s+)?long\s+long|
526 long\s+int\s+(?:un)?signed|
527 long\s+(?:un)?signed\s+int|
528 long\s+(?:un)?signed|
529 (?:(?:un)?signed\s+)?long\s+int|
530 (?:(?:un)?signed\s+)?long|
531 int\s+long\s+(?:un)?signed|
532 int\s+(?:(?:un)?signed\s+)?long|
535 (?:(?:un)?signed\s+)?int
538 our @typeListFile = ();
539 our @typeListWithAttr = (
541 qr{struct\s+$InitAttribute\s+$Ident},
542 qr{union\s+$InitAttribute\s+$Ident},
545 our @modifierList = (
548 our @modifierListFile = ();
550 our @mode_permission_funcs = (
552 ["module_param_(?:array|named|string)", 4],
553 ["module_param_array_named", 5],
554 ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
555 ["proc_create(?:_data|)", 2],
556 ["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2],
557 ["IIO_DEV_ATTR_[A-Z_]+", 1],
558 ["SENSOR_(?:DEVICE_|)ATTR_2", 2],
559 ["SENSOR_TEMPLATE(?:_2|)", 3],
563 #Create a search pattern for all these functions to speed up a loop below
564 our $mode_perms_search = "";
565 foreach my $entry (@mode_permission_funcs) {
566 $mode_perms_search .= '|' if ($mode_perms_search ne "");
567 $mode_perms_search .= $entry->[0];
569 $mode_perms_search = "(?:${mode_perms_search})";
571 our $mode_perms_world_writable = qr{
579 our %mode_permission_string_types = (
598 #Create a search pattern for all these strings to speed up a loop below
599 our $mode_perms_string_search = "";
600 foreach my $entry (keys %mode_permission_string_types) {
601 $mode_perms_string_search .= '|' if ($mode_perms_string_search ne "");
602 $mode_perms_string_search .= $entry;
604 our $single_mode_perms_string_search = "(?:${mode_perms_string_search})";
605 our $multi_mode_perms_string_search = qr{
606 ${single_mode_perms_string_search}
607 (?:\s*\|\s*${single_mode_perms_string_search})*
613 return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/);
620 while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
621 $curpos = pos($string);
624 last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
626 $to |= $mode_permission_string_types{$match};
627 $val .= '\s*\|\s*' if ($val ne "");
631 $oval =~ s/^\s*\|\s*//;
632 $oval =~ s/\s*\|\s*$//;
633 return sprintf("%04o", $to);
636 our $allowed_asm_includes = qr{(?x:
642 # memory.h: ARM has a custom one
644 # Load common spelling mistakes and build regular expression list.
648 if (open(my $spelling, '<', $spelling_file)) {
649 while (<$spelling>) {
652 $line =~ s/\s*\n?$//g;
655 next if ($line =~ m/^\s*#/);
656 next if ($line =~ m/^\s*$/);
658 my ($suspect, $fix) = split(/\|\|/, $line);
660 $spelling_fix{$suspect} = $fix;
664 warn "No typos will be found - file '$spelling_file': $!\n";
668 if (open(my $spelling, '<', $codespellfile)) {
669 while (<$spelling>) {
672 $line =~ s/\s*\n?$//g;
675 next if ($line =~ m/^\s*#/);
676 next if ($line =~ m/^\s*$/);
677 next if ($line =~ m/, disabled/i);
681 my ($suspect, $fix) = split(/->/, $line);
683 $spelling_fix{$suspect} = $fix;
687 warn "No codespell typos will be found - file '$codespellfile': $!\n";
691 $misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
694 my ($wordsRef, $file) = @_;
696 if (open(my $words, '<', $file)) {
700 $line =~ s/\s*\n?$//g;
703 next if ($line =~ m/^\s*#/);
704 next if ($line =~ m/^\s*$/);
706 print("$file: '$line' invalid - ignored\n");
710 $$wordsRef .= '|' if ($$wordsRef ne "");
720 my $const_structs = "";
721 read_words(\$const_structs, $conststructsfile)
722 or warn "No structs that should be const will be found - file '$conststructsfile': $!\n";
724 my $typeOtherTypedefs = "";
725 if (length($typedefsfile)) {
726 read_words(\$typeOtherTypedefs, $typedefsfile)
727 or warn "No additional types will be considered - file '$typedefsfile': $!\n";
729 $typeTypedefs .= '|' . $typeOtherTypedefs if ($typeOtherTypedefs ne "");
732 my $mods = "(?x: \n" . join("|\n ", (@modifierList, @modifierListFile)) . "\n)";
733 my $all = "(?x: \n" . join("|\n ", (@typeList, @typeListFile)) . "\n)";
734 my $Misordered = "(?x: \n" . join("|\n ", @typeListMisordered) . "\n)";
735 my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)";
736 $Modifier = qr{(?:$Attribute|$Sparse|$mods)};
742 (?:$Modifier\s+|const\s+)*
744 (?:typeof|__typeof__)\s*\([^\)]*\)|
748 (?:\s+$Modifier|\s+const)*
750 $NonptrTypeMisordered = qr{
751 (?:$Modifier\s+|const\s+)*
755 (?:\s+$Modifier|\s+const)*
757 $NonptrTypeWithAttr = qr{
758 (?:$Modifier\s+|const\s+)*
760 (?:typeof|__typeof__)\s*\([^\)]*\)|
764 (?:\s+$Modifier|\s+const)*
768 (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
769 (?:\s+$Inline|\s+$Modifier)*
771 $TypeMisordered = qr{
772 $NonptrTypeMisordered
773 (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
774 (?:\s+$Inline|\s+$Modifier)*
776 $Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
777 $DeclareMisordered = qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
781 our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
783 # Using $balanced_parens, $LvalOrFunc, or $FuncArg
784 # requires at least perl version v5.10.0
785 # Any use must be runtime checked with $^V
787 our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
788 our $LvalOrFunc = qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
789 our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
791 our $declaration_macros = qr{(?x:
792 (?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
793 (?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
794 (?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(|
795 (?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(
800 return "" if (!defined($string));
802 while ($string =~ /^\s*\(.*\)\s*$/) {
803 $string =~ s@^\s*\(\s*@@;
804 $string =~ s@\s*\)\s*$@@;
807 $string =~ s@\s+@ @g;
812 sub seed_camelcase_file {
815 return if (!(-f $file));
819 open(my $include_file, '<', "$file")
820 or warn "$P: Can't read '$file' $!\n";
821 my $text = <$include_file>;
822 close($include_file);
824 my @lines = split('\n', $text);
826 foreach my $line (@lines) {
827 next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
828 if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
830 } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
832 } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
838 sub is_maintained_obsolete {
841 return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
843 my $status = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
845 return $status =~ /obsolete/i;
848 my $camelcase_seeded = 0;
849 sub seed_camelcase_includes {
850 return if ($camelcase_seeded);
853 my $camelcase_cache = "";
854 my @include_files = ();
856 $camelcase_seeded = 1;
859 my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
860 chomp $git_last_include_commit;
861 $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
863 my $last_mod_date = 0;
864 $files = `find $root/include -name "*.h"`;
865 @include_files = split('\n', $files);
866 foreach my $file (@include_files) {
867 my $date = POSIX::strftime("%Y%m%d%H%M",
868 localtime((stat $file)[9]));
869 $last_mod_date = $date if ($last_mod_date < $date);
871 $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
874 if ($camelcase_cache ne "" && -f $camelcase_cache) {
875 open(my $camelcase_file, '<', "$camelcase_cache")
876 or warn "$P: Can't read '$camelcase_cache' $!\n";
877 while (<$camelcase_file>) {
881 close($camelcase_file);
887 $files = `git ls-files "include/*.h"`;
888 @include_files = split('\n', $files);
891 foreach my $file (@include_files) {
892 seed_camelcase_file($file);
895 if ($camelcase_cache ne "") {
896 unlink glob ".checkpatch-camelcase.*";
897 open(my $camelcase_file, '>', "$camelcase_cache")
898 or warn "$P: Can't write '$camelcase_cache' $!\n";
899 foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
900 print $camelcase_file ("$_\n");
902 close($camelcase_file);
906 sub git_commit_info {
907 my ($commit, $id, $desc) = @_;
909 return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
911 my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
912 $output =~ s/^\s*//gm;
913 my @lines = split("\n", $output);
915 return ($id, $desc) if ($#lines < 0);
917 if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
918 # Maybe one day convert this block of bash into something that returns
919 # all matching commit ids, but it's very slow...
921 # echo "checking commits $1..."
922 # git rev-list --remotes | grep -i "^$1" |
923 # while read line ; do
924 # git log --format='%H %s' -1 $line |
925 # echo "commit $(cut -c 1-12,41-)"
927 } elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
930 $id = substr($lines[0], 0, 12);
931 $desc = substr($lines[0], 41);
937 $chk_signoff = 0 if ($file);
942 my @fixed_inserted = ();
943 my @fixed_deleted = ();
946 # If input is git commits, extract all commits from the commit expressions.
947 # For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
948 die "$P: No git repository found\n" if ($git && !-e ".git");
952 foreach my $commit_expr (@ARGV) {
954 if ($commit_expr =~ m/^(.*)-(\d+)$/) {
955 $git_range = "-$2 $1";
956 } elsif ($commit_expr =~ m/\.\./) {
957 $git_range = "$commit_expr";
959 $git_range = "-1 $commit_expr";
961 my $lines = `git log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
962 foreach my $line (split(/\n/, $lines)) {
963 $line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
964 next if (!defined($1) || !defined($2));
967 unshift(@commits, $sha1);
968 $git_commits{$sha1} = $subject;
971 die "$P: no git commits after extraction!\n" if (@commits == 0);
976 for my $filename (@ARGV) {
979 open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
980 die "$P: $filename: git format-patch failed - $!\n";
982 open($FILE, '-|', "diff -u /dev/null $filename") ||
983 die "$P: $filename: diff failed - $!\n";
984 } elsif ($filename eq '-') {
985 open($FILE, '<&STDIN');
987 open($FILE, '<', "$filename") ||
988 die "$P: $filename: open failed - $!\n";
990 if ($filename eq '-') {
991 $vname = 'Your patch';
993 $vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
1003 if ($#ARGV > 0 && $quiet == 0) {
1004 print '-' x length($vname) . "\n";
1006 print '-' x length($vname) . "\n";
1009 if (!process($filename)) {
1015 @fixed_inserted = ();
1016 @fixed_deleted = ();
1018 @modifierListFile = ();
1024 hash_show_words(\%use_type, "Used");
1025 hash_show_words(\%ignore_type, "Ignored");
1027 if ($^V lt 5.10.0) {
1030 NOTE: perl $^V is not modern enough to detect all possible issues.
1031 An upgrade to at least perl v5.10.0 is suggested.
1037 NOTE: If any of the errors are false positives, please report
1038 them to the maintainer, see CHECKPATCH in MAINTAINERS.
1045 sub top_of_kernel_tree {
1049 "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile",
1050 "README", "Documentation", "arch", "include", "drivers",
1051 "fs", "init", "ipc", "kernel", "lib", "scripts",
1054 foreach my $check (@tree_check) {
1055 if (! -e $root . '/' . $check) {
1063 my ($formatted_email) = @_;
1069 if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
1072 $comment = $3 if defined $3;
1073 } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
1075 $comment = $2 if defined $2;
1076 } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
1078 $comment = $2 if defined $2;
1079 $formatted_email =~ s/\Q$address\E.*$//;
1080 $name = $formatted_email;
1081 $name = trim($name);
1082 $name =~ s/^\"|\"$//g;
1083 # If there's a name left after stripping spaces and
1084 # leading quotes, and the address doesn't have both
1085 # leading and trailing angle brackets, the address
1087 # "joe smith joe@smith.com" bad
1088 # "joe smith <joe@smith.com" bad
1089 if ($name ne "" && $address !~ /^<[^>]+>$/) {
1096 $name = trim($name);
1097 $name =~ s/^\"|\"$//g;
1098 $address = trim($address);
1099 $address =~ s/^\<|\>$//g;
1101 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
1102 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
1103 $name = "\"$name\"";
1106 return ($name, $address, $comment);
1110 my ($name, $address) = @_;
1112 my $formatted_email;
1114 $name = trim($name);
1115 $name =~ s/^\"|\"$//g;
1116 $address = trim($address);
1118 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars
1119 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes
1120 $name = "\"$name\"";
1123 if ("$name" eq "") {
1124 $formatted_email = "$address";
1126 $formatted_email = "$name <$address>";
1129 return $formatted_email;
1135 foreach my $path (split(/:/, $ENV{PATH})) {
1136 if (-e "$path/$bin") {
1137 return "$path/$bin";
1147 foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
1148 if (-e "$path/$conf") {
1149 return "$path/$conf";
1161 for my $c (split(//, $str)) {
1165 for (; ($n % 8) != 0; $n++) {
1177 (my $res = shift) =~ tr/\t/ /c;
1184 # Drop the diff line leader and expand tabs
1186 $line = expand_tabs($line);
1188 # Pick the indent from the front of the line.
1189 my ($white) = ($line =~ /^(\s*)/);
1191 return (length($line), length($white));
1194 my $sanitise_quote = '';
1196 sub sanitise_line_reset {
1197 my ($in_comment) = @_;
1200 $sanitise_quote = '*/';
1202 $sanitise_quote = '';
1215 # Always copy over the diff marker.
1216 $res = substr($line, 0, 1);
1218 for ($off = 1; $off < length($line); $off++) {
1219 $c = substr($line, $off, 1);
1221 # Comments we are whacking completely including the begin
1222 # and end, all to $;.
1223 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
1224 $sanitise_quote = '*/';
1226 substr($res, $off, 2, "$;$;");
1230 if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
1231 $sanitise_quote = '';
1232 substr($res, $off, 2, "$;$;");
1236 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
1237 $sanitise_quote = '//';
1239 substr($res, $off, 2, $sanitise_quote);
1244 # A \ in a string means ignore the next character.
1245 if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
1247 substr($res, $off, 2, 'XX');
1252 if ($c eq "'" || $c eq '"') {
1253 if ($sanitise_quote eq '') {
1254 $sanitise_quote = $c;
1256 substr($res, $off, 1, $c);
1258 } elsif ($sanitise_quote eq $c) {
1259 $sanitise_quote = '';
1263 #print "c<$c> SQ<$sanitise_quote>\n";
1264 if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
1265 substr($res, $off, 1, $;);
1266 } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
1267 substr($res, $off, 1, $;);
1268 } elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
1269 substr($res, $off, 1, 'X');
1271 substr($res, $off, 1, $c);
1275 if ($sanitise_quote eq '//') {
1276 $sanitise_quote = '';
1279 # The pathname on a #include may be surrounded by '<' and '>'.
1280 if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
1281 my $clean = 'X' x length($1);
1282 $res =~ s@\<.*\>@<$clean>@;
1284 # The whole of a #error is a string.
1285 } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
1286 my $clean = 'X' x length($1);
1287 $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@;
1290 if ($allow_c99_comments && $res =~ m@(//.*$)@) {
1292 $res =~ s/\Q$match\E/"$;" x length($match)/e;
1298 sub get_quoted_string {
1299 my ($line, $rawline) = @_;
1301 return "" if (!defined($line) || !defined($rawline));
1302 return "" if ($line !~ m/($String)/g);
1303 return substr($rawline, $-[0], $+[0] - $-[0]);
1306 sub ctx_statement_block {
1307 my ($linenr, $remain, $off) = @_;
1308 my $line = $linenr - 1;
1311 my $coff = $off - 1;
1325 @stack = (['', 0]) if ($#stack == -1);
1327 #warn "CSB: blk<$blk> remain<$remain>\n";
1328 # If we are about to drop off the end, pull in more
1331 for (; $remain > 0; $line++) {
1332 last if (!defined $lines[$line]);
1333 next if ($lines[$line] =~ /^-/);
1336 $blk .= $lines[$line] . "\n";
1337 $len = length($blk);
1341 # Bail if there is no further context.
1342 #warn "CSB: blk<$blk> off<$off> len<$len>\n";
1346 if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
1352 $c = substr($blk, $off, 1);
1353 $remainder = substr($blk, $off);
1355 #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n";
1357 # Handle nested #if/#else.
1358 if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
1359 push(@stack, [ $type, $level ]);
1360 } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
1361 ($type, $level) = @{$stack[$#stack - 1]};
1362 } elsif ($remainder =~ /^#\s*endif\b/) {
1363 ($type, $level) = @{pop(@stack)};
1366 # Statement ends at the ';' or a close '}' at the
1368 if ($level == 0 && $c eq ';') {
1372 # An else is really a conditional as long as its not else if
1373 if ($level == 0 && $coff_set == 0 &&
1374 (!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
1375 $remainder =~ /^(else)(?:\s|{)/ &&
1376 $remainder !~ /^else\s+if\b/) {
1377 $coff = $off + length($1) - 1;
1379 #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n";
1380 #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n";
1383 if (($type eq '' || $type eq '(') && $c eq '(') {
1387 if ($type eq '(' && $c eq ')') {
1389 $type = ($level != 0)? '(' : '';
1391 if ($level == 0 && $coff < $soff) {
1394 #warn "CSB: mark coff<$coff>\n";
1397 if (($type eq '' || $type eq '{') && $c eq '{') {
1401 if ($type eq '{' && $c eq '}') {
1403 $type = ($level != 0)? '{' : '';
1406 if (substr($blk, $off + 1, 1) eq ';') {
1412 # Preprocessor commands end at the newline unless escaped.
1413 if ($type eq '#' && $c eq "\n" && $p ne "\\") {
1421 # We are truly at the end, so shuffle to the next line.
1428 my $statement = substr($blk, $soff, $off - $soff + 1);
1429 my $condition = substr($blk, $soff, $coff - $soff + 1);
1431 #warn "STATEMENT<$statement>\n";
1432 #warn "CONDITION<$condition>\n";
1434 #print "coff<$coff> soff<$off> loff<$loff>\n";
1436 return ($statement, $condition,
1437 $line, $remain + 1, $off - $loff + 1, $level);
1440 sub statement_lines {
1443 # Strip the diff line prefixes and rip blank lines at start and end.
1444 $stmt =~ s/(^|\n)./$1/g;
1448 my @stmt_lines = ($stmt =~ /\n/g);
1450 return $#stmt_lines + 2;
1453 sub statement_rawlines {
1456 my @stmt_lines = ($stmt =~ /\n/g);
1458 return $#stmt_lines + 2;
1461 sub statement_block_size {
1464 $stmt =~ s/(^|\n)./$1/g;
1470 my @stmt_lines = ($stmt =~ /\n/g);
1471 my @stmt_statements = ($stmt =~ /;/g);
1473 my $stmt_lines = $#stmt_lines + 2;
1474 my $stmt_statements = $#stmt_statements + 1;
1476 if ($stmt_lines > $stmt_statements) {
1479 return $stmt_statements;
1483 sub ctx_statement_full {
1484 my ($linenr, $remain, $off) = @_;
1485 my ($statement, $condition, $level);
1489 # Grab the first conditional/block pair.
1490 ($statement, $condition, $linenr, $remain, $off, $level) =
1491 ctx_statement_block($linenr, $remain, $off);
1492 #print "F: c<$condition> s<$statement> remain<$remain>\n";
1493 push(@chunks, [ $condition, $statement ]);
1494 if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
1495 return ($level, $linenr, @chunks);
1498 # Pull in the following conditional/block pairs and see if they
1499 # could continue the statement.
1501 ($statement, $condition, $linenr, $remain, $off, $level) =
1502 ctx_statement_block($linenr, $remain, $off);
1503 #print "C: c<$condition> s<$statement> remain<$remain>\n";
1504 last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
1506 push(@chunks, [ $condition, $statement ]);
1509 return ($level, $linenr, @chunks);
1513 my ($linenr, $remain, $outer, $open, $close, $off) = @_;
1515 my $start = $linenr - 1;
1522 my @stack = ($level);
1523 for ($line = $start; $remain > 0; $line++) {
1524 next if ($rawlines[$line] =~ /^-/);
1527 $blk .= $rawlines[$line];
1529 # Handle nested #if/#else.
1530 if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
1531 push(@stack, $level);
1532 } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
1533 $level = $stack[$#stack - 1];
1534 } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
1535 $level = pop(@stack);
1538 foreach my $c (split(//, $lines[$line])) {
1539 ##print "C<$c>L<$level><$open$close>O<$off>\n";
1545 if ($c eq $close && $level > 0) {
1547 last if ($level == 0);
1548 } elsif ($c eq $open) {
1553 if (!$outer || $level <= 1) {
1554 push(@res, $rawlines[$line]);
1557 last if ($level == 0);
1560 return ($level, @res);
1562 sub ctx_block_outer {
1563 my ($linenr, $remain) = @_;
1565 my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
1569 my ($linenr, $remain) = @_;
1571 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1575 my ($linenr, $remain, $off) = @_;
1577 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1580 sub ctx_block_level {
1581 my ($linenr, $remain) = @_;
1583 return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
1585 sub ctx_statement_level {
1586 my ($linenr, $remain, $off) = @_;
1588 return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
1591 sub ctx_locate_comment {
1592 my ($first_line, $end_line) = @_;
1594 # Catch a comment on the end of the line itself.
1595 my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
1596 return $current_comment if (defined $current_comment);
1598 # Look through the context and try and figure out if there is a
1601 $current_comment = '';
1602 for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
1603 my $line = $rawlines[$linenr - 1];
1605 if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
1608 if ($line =~ m@/\*@) {
1611 if (!$in_comment && $current_comment ne '') {
1612 $current_comment = '';
1614 $current_comment .= $line . "\n" if ($in_comment);
1615 if ($line =~ m@\*/@) {
1620 chomp($current_comment);
1621 return($current_comment);
1623 sub ctx_has_comment {
1624 my ($first_line, $end_line) = @_;
1625 my $cmt = ctx_locate_comment($first_line, $end_line);
1627 ##print "LINE: $rawlines[$end_line - 1 ]\n";
1628 ##print "CMMT: $cmt\n";
1630 return ($cmt ne '');
1634 my ($linenr, $cnt) = @_;
1636 my $offset = $linenr - 1;
1641 $line = $rawlines[$offset++];
1642 next if (defined($line) && $line =~ /^-/);
1650 my ($linenr, $lc) = @_;
1652 my $stat_real = raw_line($linenr, 0);
1653 for (my $count = $linenr + 1; $count <= $lc; $count++) {
1654 $stat_real = $stat_real . "\n" . raw_line($count, 0);
1661 my ($linenr, $cnt, $here) = @_;
1663 my $herectx = $here . "\n";
1664 for (my $n = 0; $n < $cnt; $n++) {
1665 $herectx .= raw_line($linenr, $n) . "\n";
1676 while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
1679 $coded = sprintf("^%c", unpack('C', $2) + 64);
1688 my $av_preprocessor = 0;
1693 sub annotate_reset {
1694 $av_preprocessor = 0;
1696 @av_paren_type = ('E');
1697 $av_pend_colon = 'O';
1700 sub annotate_values {
1701 my ($stream, $type) = @_;
1704 my $var = '_' x length($stream);
1707 print "$stream\n" if ($dbg_values > 1);
1709 while (length($cur)) {
1710 @av_paren_type = ('E') if ($#av_paren_type < 0);
1711 print " <" . join('', @av_paren_type) .
1712 "> <$type> <$av_pending>" if ($dbg_values > 1);
1713 if ($cur =~ /^(\s+)/o) {
1714 print "WS($1)\n" if ($dbg_values > 1);
1715 if ($1 =~ /\n/ && $av_preprocessor) {
1716 $type = pop(@av_paren_type);
1717 $av_preprocessor = 0;
1720 } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
1721 print "CAST($1)\n" if ($dbg_values > 1);
1722 push(@av_paren_type, $type);
1725 } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
1726 print "DECLARE($1)\n" if ($dbg_values > 1);
1729 } elsif ($cur =~ /^($Modifier)\s*/) {
1730 print "MODIFIER($1)\n" if ($dbg_values > 1);
1733 } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
1734 print "DEFINE($1,$2)\n" if ($dbg_values > 1);
1735 $av_preprocessor = 1;
1736 push(@av_paren_type, $type);
1742 } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
1743 print "UNDEF($1)\n" if ($dbg_values > 1);
1744 $av_preprocessor = 1;
1745 push(@av_paren_type, $type);
1747 } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
1748 print "PRE_START($1)\n" if ($dbg_values > 1);
1749 $av_preprocessor = 1;
1751 push(@av_paren_type, $type);
1752 push(@av_paren_type, $type);
1755 } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
1756 print "PRE_RESTART($1)\n" if ($dbg_values > 1);
1757 $av_preprocessor = 1;
1759 push(@av_paren_type, $av_paren_type[$#av_paren_type]);
1763 } elsif ($cur =~ /^(\#\s*(?:endif))/o) {
1764 print "PRE_END($1)\n" if ($dbg_values > 1);
1766 $av_preprocessor = 1;
1768 # Assume all arms of the conditional end as this
1769 # one does, and continue as if the #endif was not here.
1770 pop(@av_paren_type);
1771 push(@av_paren_type, $type);
1774 } elsif ($cur =~ /^(\\\n)/o) {
1775 print "PRECONT($1)\n" if ($dbg_values > 1);
1777 } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
1778 print "ATTR($1)\n" if ($dbg_values > 1);
1779 $av_pending = $type;
1782 } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
1783 print "SIZEOF($1)\n" if ($dbg_values > 1);
1789 } elsif ($cur =~ /^(if|while|for)\b/o) {
1790 print "COND($1)\n" if ($dbg_values > 1);
1794 } elsif ($cur =~/^(case)/o) {
1795 print "CASE($1)\n" if ($dbg_values > 1);
1796 $av_pend_colon = 'C';
1799 } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
1800 print "KEYWORD($1)\n" if ($dbg_values > 1);
1803 } elsif ($cur =~ /^(\()/o) {
1804 print "PAREN('$1')\n" if ($dbg_values > 1);
1805 push(@av_paren_type, $av_pending);
1809 } elsif ($cur =~ /^(\))/o) {
1810 my $new_type = pop(@av_paren_type);
1811 if ($new_type ne '_') {
1813 print "PAREN('$1') -> $type\n"
1814 if ($dbg_values > 1);
1816 print "PAREN('$1')\n" if ($dbg_values > 1);
1819 } elsif ($cur =~ /^($Ident)\s*\(/o) {
1820 print "FUNC($1)\n" if ($dbg_values > 1);
1824 } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
1825 if (defined $2 && $type eq 'C' || $type eq 'T') {
1826 $av_pend_colon = 'B';
1827 } elsif ($type eq 'E') {
1828 $av_pend_colon = 'L';
1830 print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
1833 } elsif ($cur =~ /^($Ident|$Constant)/o) {
1834 print "IDENT($1)\n" if ($dbg_values > 1);
1837 } elsif ($cur =~ /^($Assignment)/o) {
1838 print "ASSIGN($1)\n" if ($dbg_values > 1);
1841 } elsif ($cur =~/^(;|{|})/) {
1842 print "END($1)\n" if ($dbg_values > 1);
1844 $av_pend_colon = 'O';
1846 } elsif ($cur =~/^(,)/) {
1847 print "COMMA($1)\n" if ($dbg_values > 1);
1850 } elsif ($cur =~ /^(\?)/o) {
1851 print "QUESTION($1)\n" if ($dbg_values > 1);
1854 } elsif ($cur =~ /^(:)/o) {
1855 print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
1857 substr($var, length($res), 1, $av_pend_colon);
1858 if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
1863 $av_pend_colon = 'O';
1865 } elsif ($cur =~ /^(\[)/o) {
1866 print "CLOSE($1)\n" if ($dbg_values > 1);
1869 } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
1872 print "OPV($1)\n" if ($dbg_values > 1);
1879 substr($var, length($res), 1, $variant);
1882 } elsif ($cur =~ /^($Operators)/o) {
1883 print "OP($1)\n" if ($dbg_values > 1);
1884 if ($1 ne '++' && $1 ne '--') {
1888 } elsif ($cur =~ /(^.)/o) {
1889 print "C($1)\n" if ($dbg_values > 1);
1892 $cur = substr($cur, length($1));
1893 $res .= $type x length($1);
1897 return ($res, $var);
1901 my ($possible, $line) = @_;
1902 my $notPermitted = qr{(?:
1919 ^(?:typedef|struct|enum)\b
1921 warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
1922 if ($possible !~ $notPermitted) {
1923 # Check for modifiers.
1924 $possible =~ s/\s*$Storage\s*//g;
1925 $possible =~ s/\s*$Sparse\s*//g;
1926 if ($possible =~ /^\s*$/) {
1928 } elsif ($possible =~ /\s/) {
1929 $possible =~ s/\s*$Type\s*//g;
1930 for my $modifier (split(' ', $possible)) {
1931 if ($modifier !~ $notPermitted) {
1932 warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
1933 push(@modifierListFile, $modifier);
1938 warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
1939 push(@typeListFile, $possible);
1943 warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
1952 $type =~ tr/[a-z]/[A-Z]/;
1954 return defined $use_type{$type} if (scalar keys %use_type > 0);
1956 return !defined $ignore_type{$type};
1960 my ($level, $type, $msg) = @_;
1962 if (!show_type($type) ||
1963 (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
1968 if ($level eq 'ERROR') {
1970 } elsif ($level eq 'WARNING') {
1976 $output .= $prefix . $level . ':';
1978 $output .= BLUE if ($color);
1979 $output .= "$type:";
1981 $output .= RESET if ($color);
1982 $output .= ' ' . $msg . "\n";
1985 my @lines = split("\n", $output, -1);
1986 splice(@lines, 1, 1);
1987 $output = join("\n", @lines);
1989 $output = (split('\n', $output))[0] . "\n" if ($terse);
1991 push(our @report, $output);
2000 sub fixup_current_range {
2001 my ($lineRef, $offset, $length) = @_;
2003 if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) {
2006 my $no = $o + $offset;
2007 my $nl = $l + $length;
2008 $$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/;
2012 sub fix_inserted_deleted_lines {
2013 my ($linesRef, $insertedRef, $deletedRef) = @_;
2015 my $range_last_linenr = 0;
2016 my $delta_offset = 0;
2021 my $next_insert = 0;
2022 my $next_delete = 0;
2026 my $inserted = @{$insertedRef}[$next_insert++];
2027 my $deleted = @{$deletedRef}[$next_delete++];
2029 foreach my $old_line (@{$linesRef}) {
2031 my $line = $old_line; #don't modify the array
2032 if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) { #new filename
2034 } elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) { #new hunk
2035 $range_last_linenr = $new_linenr;
2036 fixup_current_range(\$line, $delta_offset, 0);
2039 while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) {
2040 $deleted = @{$deletedRef}[$next_delete++];
2042 fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1);
2045 while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) {
2046 push(@lines, ${$inserted}{'LINE'});
2047 $inserted = @{$insertedRef}[$next_insert++];
2049 fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1);
2053 push(@lines, $line);
2063 sub fix_insert_line {
2064 my ($linenr, $line) = @_;
2070 push(@fixed_inserted, $inserted);
2073 sub fix_delete_line {
2074 my ($linenr, $line) = @_;
2081 push(@fixed_deleted, $deleted);
2085 my ($type, $msg) = @_;
2087 if (report("ERROR", $type, $msg)) {
2095 my ($type, $msg) = @_;
2097 if (report("WARNING", $type, $msg)) {
2105 my ($type, $msg) = @_;
2107 if ($check && report("CHECK", $type, $msg)) {
2115 sub check_absolute_file {
2116 my ($absolute, $herecurr) = @_;
2117 my $file = $absolute;
2119 ##print "absolute<$absolute>\n";
2121 # See if any suffix of this path is a path within the tree.
2122 while ($file =~ s@^[^/]*/@@) {
2123 if (-f "$root/$file") {
2124 ##print "file<$file>\n";
2132 # It is, so see if the prefix is acceptable.
2133 my $prefix = $absolute;
2134 substr($prefix, -length($file)) = '';
2136 ##print "prefix<$prefix>\n";
2137 if ($prefix ne ".../") {
2138 WARN("USE_RELATIVE_PATH",
2139 "use relative pathname instead of absolute in changelog text\n" . $herecurr);
2146 $string =~ s/^\s+|\s+$//g;
2154 $string =~ s/^\s+//;
2162 $string =~ s/\s+$//;
2167 sub string_find_replace {
2168 my ($string, $find, $replace) = @_;
2170 $string =~ s/$find/$replace/g;
2178 my $source_indent = 8;
2179 my $max_spaces_before_tab = $source_indent - 1;
2180 my $spaces_to_tab = " " x $source_indent;
2182 #convert leading spaces to tabs
2183 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
2184 #Remove spaces before a tab
2185 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
2190 sub pos_last_openparen {
2195 my $opens = $line =~ tr/\(/\(/;
2196 my $closes = $line =~ tr/\)/\)/;
2198 my $last_openparen = 0;
2200 if (($opens == 0) || ($closes >= $opens)) {
2204 my $len = length($line);
2206 for ($pos = 0; $pos < $len; $pos++) {
2207 my $string = substr($line, $pos);
2208 if ($string =~ /^($FuncArg|$balanced_parens)/) {
2209 $pos += length($1) - 1;
2210 } elsif (substr($line, $pos, 1) eq '(') {
2211 $last_openparen = $pos;
2212 } elsif (index($string, '(') == -1) {
2217 return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
2221 my $filename = shift;
2227 my $stashrawline="";
2237 my $in_header_lines = $file ? 0 : 1;
2238 my $in_commit_log = 0; #Scanning lines before patch
2239 my $has_commit_log = 0; #Encountered lines before patch
2240 my $commit_log_possible_stack_dump = 0;
2241 my $commit_log_long_line = 0;
2242 my $commit_log_has_diff = 0;
2243 my $reported_maintainer_file = 0;
2244 my $non_utf8_charset = 0;
2246 my $last_blank_line = 0;
2247 my $last_coalesced_string_linenr = -1;
2255 # Trace the real file/line as we go.
2260 my $context_function; #undef'd unless there's a known function
2262 my $comment_edge = 0;
2266 my $prev_values = 'E';
2269 my %suppress_ifbraces;
2270 my %suppress_whiletrailers;
2271 my %suppress_export;
2272 my $suppress_statement = 0;
2274 my %signatures = ();
2276 # Pre-scan the patch sanitizing the lines.
2277 # Pre-scan the patch looking for any __setup documentation.
2279 my @setup_docs = ();
2282 my $camelcase_file_seeded = 0;
2284 my $checklicenseline = 1;
2286 sanitise_line_reset();
2288 foreach my $rawline (@rawlines) {
2292 push(@fixed, $rawline) if ($fix);
2294 if ($rawline=~/^\+\+\+\s+(\S+)/) {
2296 if ($1 =~ m@Documentation/admin-guide/kernel-parameters.rst$@) {
2301 if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
2310 # Guestimate if this is a continuing comment. Run
2311 # the context looking for a comment "edge". If this
2312 # edge is a close comment then we must be in a comment
2316 for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
2317 next if (defined $rawlines[$ln - 1] &&
2318 $rawlines[$ln - 1] =~ /^-/);
2320 #print "RAW<$rawlines[$ln - 1]>\n";
2321 last if (!defined $rawlines[$ln - 1]);
2322 if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
2323 $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
2328 if (defined $edge && $edge eq '*/') {
2332 # Guestimate if this is a continuing comment. If this
2333 # is the start of a diff block and this line starts
2334 # ' *' then it is very likely a comment.
2335 if (!defined $edge &&
2336 $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
2341 ##print "COMMENT:$in_comment edge<$edge> $rawline\n";
2342 sanitise_line_reset($in_comment);
2344 } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
2345 # Standardise the strings and chars within the input to
2346 # simplify matching -- only bother with positive lines.
2347 $line = sanitise_line($rawline);
2349 push(@lines, $line);
2352 $realcnt-- if ($line =~ /^(?:\+| |$)/);
2357 #print "==>$rawline\n";
2358 #print "-->$line\n";
2360 if ($setup_docs && $line =~ /^\+/) {
2361 push(@setup_docs, $line);
2370 foreach my $line (@lines) {
2373 my $sline = $line; #copy of $line
2374 $sline =~ s/$;/ /g; #with comments as spaces
2376 my $rawline = $rawlines[$linenr - 1];
2378 #extract the line range in the file after the patch is applied
2379 if (!$in_commit_log &&
2380 $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {
2383 $first_line = $linenr + 1;
2393 %suppress_ifbraces = ();
2394 %suppress_whiletrailers = ();
2395 %suppress_export = ();
2396 $suppress_statement = 0;
2397 if ($context =~ /\b(\w+)\s*\(/) {
2398 $context_function = $1;
2400 undef $context_function;
2404 # track the line number as we move through the hunk, note that
2405 # new versions of GNU diff omit the leading space on completely
2406 # blank context lines so we need to count that too.
2407 } elsif ($line =~ /^( |\+|$)/) {
2409 $realcnt-- if ($realcnt != 0);
2411 # Measure the line length and indent.
2412 ($length, $indent) = line_stats($rawline);
2414 # Track the previous line.
2415 ($prevline, $stashline) = ($stashline, $line);
2416 ($previndent, $stashindent) = ($stashindent, $indent);
2417 ($prevrawline, $stashrawline) = ($stashrawline, $rawline);
2419 #warn "line<$line>\n";
2421 } elsif ($realcnt == 1) {
2425 my $hunk_line = ($realcnt != 0);
2427 $here = "#$linenr: " if (!$file);
2428 $here = "#$realline: " if ($file);
2431 # extract the filename as it passes
2432 if ($line =~ /^diff --git.*?(\S+)$/) {
2434 $realfile =~ s@^([^/]*)/@@ if (!$file);
2437 } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
2439 $realfile =~ s@^([^/]*)/@@ if (!$file);
2443 if (!$file && $tree && $p1_prefix ne '' &&
2444 -e "$root/$p1_prefix") {
2445 WARN("PATCH_PREFIX",
2446 "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
2449 if ($realfile =~ m@^include/asm/@) {
2450 ERROR("MODIFIED_INCLUDE_ASM",
2451 "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
2456 #make up the handle for any error we report on this line
2458 $prefix = "$realfile:$realline: "
2461 $prefix = "$filename:$realline: ";
2463 $prefix = "$filename:$linenr: ";
2468 if (is_maintained_obsolete($realfile)) {
2470 "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy. No unnecessary modifications please.\n");
2472 if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
2475 $check = $check_orig;
2477 $checklicenseline = 1;
2481 $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
2483 my $hereline = "$here\n$rawline\n";
2484 my $herecurr = "$here\n$rawline\n";
2485 my $hereprev = "$here\n$prevrawline\n$rawline\n";
2487 $cnt_lines++ if ($realcnt != 0);
2489 # Check if the commit log has what seems like a diff which can confuse patch
2490 if ($in_commit_log && !$commit_log_has_diff &&
2491 (($line =~ m@^\s+diff\b.*a/[\w/]+@ &&
2492 $line =~ m@^\s+diff\b.*a/([\w/]+)\s+b/$1\b@) ||
2493 $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ ||
2494 $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) {
2495 ERROR("DIFF_IN_COMMIT_MSG",
2496 "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr);
2497 $commit_log_has_diff = 1;
2500 # Check for incorrect file permissions
2501 if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
2502 my $permhere = $here . "FILE: $realfile\n";
2503 if ($realfile !~ m@scripts/@ &&
2504 $realfile !~ /\.(py|pl|awk|sh)$/) {
2505 ERROR("EXECUTE_PERMISSIONS",
2506 "do not set execute permissions for source files\n" . $permhere);
2510 # Check the patch for a signoff:
2511 if ($line =~ /^\s*signed-off-by:/i) {
2516 # Check if MAINTAINERS is being updated. If so, there's probably no need to
2517 # emit the "does MAINTAINERS need updating?" message on file add/move/delete
2518 if ($line =~ /^\s*MAINTAINERS\s*\|/) {
2519 $reported_maintainer_file = 1;
2522 # Check signature styles
2523 if (!$in_header_lines &&
2524 $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
2525 my $space_before = $1;
2527 my $space_after = $3;
2529 my $ucfirst_sign_off = ucfirst(lc($sign_off));
2531 if ($sign_off !~ /$signature_tags/) {
2532 WARN("BAD_SIGN_OFF",
2533 "Non-standard signature: $sign_off\n" . $herecurr);
2535 if (defined $space_before && $space_before ne "") {
2536 if (WARN("BAD_SIGN_OFF",
2537 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
2539 $fixed[$fixlinenr] =
2540 "$ucfirst_sign_off $email";
2543 if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
2544 if (WARN("BAD_SIGN_OFF",
2545 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
2547 $fixed[$fixlinenr] =
2548 "$ucfirst_sign_off $email";
2552 if (!defined $space_after || $space_after ne " ") {
2553 if (WARN("BAD_SIGN_OFF",
2554 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
2556 $fixed[$fixlinenr] =
2557 "$ucfirst_sign_off $email";
2561 my ($email_name, $email_address, $comment) = parse_email($email);
2562 my $suggested_email = format_email(($email_name, $email_address));
2563 if ($suggested_email eq "") {
2564 ERROR("BAD_SIGN_OFF",
2565 "Unrecognized email address: '$email'\n" . $herecurr);
2567 my $dequoted = $suggested_email;
2568 $dequoted =~ s/^"//;
2569 $dequoted =~ s/" </ </;
2570 # Don't force email to have quotes
2571 # Allow just an angle bracketed address
2572 if ("$dequoted$comment" ne $email &&
2573 "<$email_address>$comment" ne $email &&
2574 "$suggested_email$comment" ne $email) {
2575 WARN("BAD_SIGN_OFF",
2576 "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
2580 # Check for duplicate signatures
2581 my $sig_nospace = $line;
2582 $sig_nospace =~ s/\s//g;
2583 $sig_nospace = lc($sig_nospace);
2584 if (defined $signatures{$sig_nospace}) {
2585 WARN("BAD_SIGN_OFF",
2586 "Duplicate signature\n" . $herecurr);
2588 $signatures{$sig_nospace} = 1;
2592 # Check email subject for common tools that don't need to be mentioned
2593 if ($in_header_lines &&
2594 $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) {
2595 WARN("EMAIL_SUBJECT",
2596 "A patch subject line should describe the change not the tool that found it\n" . $herecurr);
2599 # Check for old stable address
2600 if ($line =~ /^\s*cc:\s*.*<?\bstable\@kernel\.org\b>?.*$/i) {
2601 ERROR("STABLE_ADDRESS",
2602 "The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);
2605 # Check for unwanted Gerrit info
2606 if ($in_commit_log && $line =~ /^\s*change-id:/i) {
2607 ERROR("GERRIT_CHANGE_ID",
2608 "Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
2611 # Check if the commit log is in a possible stack dump
2612 if ($in_commit_log && !$commit_log_possible_stack_dump &&
2613 ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
2614 $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||
2616 $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/)) {
2617 # stack dump address
2618 $commit_log_possible_stack_dump = 1;
2621 # Check for line lengths > 75 in commit log, warn once
2622 if ($in_commit_log && !$commit_log_long_line &&
2623 length($line) > 75 &&
2624 !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ ||
2625 # file delta changes
2626 $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ ||
2628 $line =~ /^\s*(?:Fixes:|Link:)/i ||
2629 # A Fixes: or Link: line
2630 $commit_log_possible_stack_dump)) {
2631 WARN("COMMIT_LOG_LONG_LINE",
2632 "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr);
2633 $commit_log_long_line = 1;
2636 # Reset possible stack dump if a blank line is found
2637 if ($in_commit_log && $commit_log_possible_stack_dump &&
2639 $commit_log_possible_stack_dump = 0;
2642 # Check for git id commit length and improperly formed commit descriptions
2643 if ($in_commit_log && !$commit_log_possible_stack_dump &&
2644 $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i &&
2645 $line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
2646 ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
2647 ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
2648 $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
2649 $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
2650 my $init_char = "c";
2651 my $orig_commit = "";
2658 my $id = '0123456789ab';
2659 my $orig_desc = "commit description";
2660 my $description = "";
2662 if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
2664 $orig_commit = lc($2);
2665 } elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) {
2666 $orig_commit = lc($1);
2669 $short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i);
2670 $long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i);
2671 $space = 0 if ($line =~ /\bcommit [0-9a-f]/i);
2672 $case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
2673 if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) {
2676 } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
2677 defined $rawlines[$linenr] &&
2678 $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
2681 } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i &&
2682 defined $rawlines[$linenr] &&
2683 $rawlines[$linenr] =~ /^\s*[^"]+"\)/) {
2684 $line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i;
2686 $rawlines[$linenr] =~ /^\s*([^"]+)"\)/;
2687 $orig_desc .= " " . $1;
2691 ($id, $description) = git_commit_info($orig_commit,
2695 ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) {
2696 ERROR("GIT_COMMIT_ID",
2697 "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr);
2701 # Check for added, moved or deleted files
2702 if (!$reported_maintainer_file && !$in_commit_log &&
2703 ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
2704 $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
2705 ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
2706 (defined($1) || defined($2))))) {
2708 $reported_maintainer_file = 1;
2709 WARN("FILE_PATH_CHANGES",
2710 "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
2713 # Check for wrappage within a valid hunk of the file
2714 if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
2715 ERROR("CORRUPTED_PATCH",
2716 "patch seems to be corrupt (line wrapped?)\n" .
2717 $herecurr) if (!$emitted_corrupt++);
2720 # UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
2721 if (($realfile =~ /^$/ || $line =~ /^\+/) &&
2722 $rawline !~ m/^$UTF8*$/) {
2723 my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
2725 my $blank = copy_spacing($rawline);
2726 my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
2727 my $hereptr = "$hereline$ptr\n";
2730 "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
2733 # Check if it's the start of a commit log
2734 # (not a header line and we haven't seen the patch filename)
2735 if ($in_header_lines && $realfile =~ /^$/ &&
2736 !($rawline =~ /^\s+(?:\S|$)/ ||
2737 $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {
2738 $in_header_lines = 0;
2740 $has_commit_log = 1;
2743 # Check if there is UTF-8 in a commit log when a mail header has explicitly
2744 # declined it, i.e defined some charset where it is missing.
2745 if ($in_header_lines &&
2746 $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
2748 $non_utf8_charset = 1;
2751 if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
2752 $rawline =~ /$NON_ASCII_UTF8/) {
2753 WARN("UTF8_BEFORE_PATCH",
2754 "8-bit UTF-8 used in possible commit log\n" . $herecurr);
2757 # Check for absolute kernel paths in commit message
2758 if ($tree && $in_commit_log) {
2759 while ($line =~ m{(?:^|\s)(/\S*)}g) {
2762 if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
2763 check_absolute_file($1, $herecurr)) {
2766 check_absolute_file($file, $herecurr);
2771 # Check for various typo / spelling mistakes
2772 if (defined($misspellings) &&
2773 ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
2774 while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {
2776 my $typo_fix = $spelling_fix{lc($typo)};
2777 $typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
2778 $typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
2779 my $msg_level = \&WARN;
2780 $msg_level = \&CHK if ($file);
2781 if (&{$msg_level}("TYPO_SPELLING",
2782 "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) &&
2784 $fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
2789 # ignore non-hunk lines and lines being removed
2790 next if (!$hunk_line || $line =~ /^-/);
2792 #trailing whitespace
2793 if ($line =~ /^\+.*\015/) {
2794 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2795 if (ERROR("DOS_LINE_ENDINGS",
2796 "DOS line endings\n" . $herevet) &&
2798 $fixed[$fixlinenr] =~ s/[\s\015]+$//;
2800 } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
2801 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2802 if (ERROR("TRAILING_WHITESPACE",
2803 "trailing whitespace\n" . $herevet) &&
2805 $fixed[$fixlinenr] =~ s/\s+$//;
2811 # Check for FSF mailing addresses.
2812 if ($rawline =~ /\bwrite to the Free/i ||
2813 $rawline =~ /\b675\s+Mass\s+Ave/i ||
2814 $rawline =~ /\b59\s+Temple\s+Pl/i ||
2815 $rawline =~ /\b51\s+Franklin\s+St/i) {
2816 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
2817 my $msg_level = \&ERROR;
2818 $msg_level = \&CHK if ($file);
2819 &{$msg_level}("FSF_MAILING_ADDRESS",
2820 "Do not include the paragraph about writing to the Free Software Foundation's mailing address from the sample GPL notice. The FSF has changed addresses in the past, and may do so again. Linux already includes a copy of the GPL.\n" . $herevet)
2823 # check for Kconfig help text having a real description
2824 # Only applies when adding the entry originally, after that we do not have
2825 # sufficient context to determine whether it is indeed long enough.
2826 if ($realfile =~ /Kconfig/ &&
2827 # 'choice' is usually the last thing on the line (though
2828 # Kconfig supports named choices), so use a word boundary
2829 # (\b) rather than a whitespace character (\s)
2830 $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) {
2833 my $ln = $linenr + 1;
2837 for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
2838 $f = $lines[$ln - 1];
2839 $cnt-- if ($lines[$ln - 1] !~ /^-/);
2840 $is_end = $lines[$ln - 1] =~ /^\+/;
2842 next if ($f =~ /^-/);
2843 last if (!$file && $f =~ /^\@\@/);
2845 if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) {
2847 } elsif ($lines[$ln - 1] =~ /^\+\s*(?:help|---help---)\s*$/) {
2848 if ($lines[$ln - 1] =~ "---help---") {
2849 WARN("CONFIG_DESCRIPTION",
2850 "prefer 'help' over '---help---' for new help texts\n" . $herecurr);
2858 next if ($f =~ /^$/);
2860 # This only checks context lines in the patch
2861 # and so hopefully shouldn't trigger false
2862 # positives, even though some of these are
2863 # common words in help texts
2864 if ($f =~ /^\s*(?:config|menuconfig|choice|endchoice|
2865 if|endif|menu|endmenu|source)\b/x) {
2871 if ($is_start && $is_end && $length < $min_conf_desc_length) {
2872 WARN("CONFIG_DESCRIPTION",
2873 "please write a paragraph that describes the config symbol fully\n" . $herecurr);
2875 #print "is_start<$is_start> is_end<$is_end> length<$length>\n";
2878 # check for MAINTAINERS entries that don't have the right form
2879 if ($realfile =~ /^MAINTAINERS$/ &&
2880 $rawline =~ /^\+[A-Z]:/ &&
2881 $rawline !~ /^\+[A-Z]:\t\S/) {
2882 if (WARN("MAINTAINERS_STYLE",
2883 "MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) &&
2885 $fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/;
2889 # discourage the use of boolean for type definition attributes of Kconfig options
2890 if ($realfile =~ /Kconfig/ &&
2891 $line =~ /^\+\s*\bboolean\b/) {
2892 WARN("CONFIG_TYPE_BOOLEAN",
2893 "Use of boolean is deprecated, please use bool instead.\n" . $herecurr);
2896 if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
2897 ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
2900 'EXTRA_AFLAGS' => 'asflags-y',
2901 'EXTRA_CFLAGS' => 'ccflags-y',
2902 'EXTRA_CPPFLAGS' => 'cppflags-y',
2903 'EXTRA_LDFLAGS' => 'ldflags-y',
2906 WARN("DEPRECATED_VARIABLE",
2907 "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
2910 # check for DT compatible documentation
2911 if (defined $root &&
2912 (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
2913 ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
2915 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
2917 my $dt_path = $root . "/Documentation/devicetree/bindings/";
2918 my $vp_file = $dt_path . "vendor-prefixes.txt";
2920 foreach my $compat (@compats) {
2921 my $compat2 = $compat;
2922 $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
2923 my $compat3 = $compat;
2924 $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
2925 `grep -Erq "$compat|$compat2|$compat3" $dt_path`;
2927 WARN("UNDOCUMENTED_DT_STRING",
2928 "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
2931 next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
2933 `grep -Eq "^$vendor\\b" $vp_file`;
2935 WARN("UNDOCUMENTED_DT_STRING",
2936 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
2941 # check for using SPDX license tag at beginning of files
2942 if ($realline == $checklicenseline) {
2943 if ($rawline =~ /^[ \+]\s*\#\!\s*\//) {
2944 $checklicenseline = 2;
2945 } elsif ($rawline =~ /^\+/) {
2947 if ($realfile =~ /\.(h|s|S)$/) {
2949 } elsif ($realfile =~ /\.(c|dts|dtsi)$/) {
2951 } elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc)$/) {
2953 } elsif ($realfile =~ /\.rst$/) {
2957 if ($comment !~ /^$/ &&
2958 $rawline !~ /^\+\Q$comment\E SPDX-License-Identifier: /) {
2959 WARN("SPDX_LICENSE_TAG",
2960 "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr);
2965 # check we are in a valid source file if not then ignore this hunk
2966 next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
2968 # line length limit (with some exclusions)
2970 # There are a few types of lines that may extend beyond $max_line_length:
2971 # logging functions like pr_info that end in a string
2972 # lines with a single string
2973 # #defines that are a single string
2974 # lines with an RFC3986 like URL
2976 # There are 3 different line length message types:
2977 # LONG_LINE_COMMENT a comment starts before but extends beyond $max_line_length
2978 # LONG_LINE_STRING a string starts before but extends beyond $max_line_length
2979 # LONG_LINE all other lines longer than $max_line_length
2981 # if LONG_LINE is ignored, the other 2 types are also ignored
2984 if ($line =~ /^\+/ && $length > $max_line_length) {
2985 my $msg_type = "LONG_LINE";
2987 # Check the allowed long line types first
2989 # logging functions that end in a string that starts
2990 # before $max_line_length
2991 if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&
2992 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
2995 # lines with only strings (w/ possible termination)
2996 # #defines with only strings
2997 } elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
2998 $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {
3001 # More special cases
3002 } elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ ||
3003 $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {
3006 # URL ($rawline is used in case the URL is in a comment)
3007 } elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) {
3010 # Otherwise set the alternate message types
3012 # a comment starts before $max_line_length
3013 } elsif ($line =~ /($;[\s$;]*)$/ &&
3014 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
3015 $msg_type = "LONG_LINE_COMMENT"
3017 # a quoted string starts before $max_line_length
3018 } elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&
3019 length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
3020 $msg_type = "LONG_LINE_STRING"
3023 if ($msg_type ne "" &&
3024 (show_type("LONG_LINE") || show_type($msg_type))) {
3026 "line over $max_line_length characters\n" . $herecurr);
3030 # check for adding lines without a newline.
3031 if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
3032 WARN("MISSING_EOF_NEWLINE",
3033 "adding a line without newline at end of file\n" . $herecurr);
3036 # check we are in a valid source file C or perl if not then ignore this hunk
3037 next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
3039 # at the beginning of a line any tabs must come first and anything
3040 # more than 8 must use tabs.
3041 if ($rawline =~ /^\+\s* \t\s*\S/ ||
3042 $rawline =~ /^\+\s* \s*/) {
3043 my $herevet = "$here\n" . cat_vet($rawline) . "\n";
3045 if (ERROR("CODE_INDENT",
3046 "code indent should use tabs where possible\n" . $herevet) &&
3048 $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
3052 # check for space before tabs.