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