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