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