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