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