1#!/usr/bin/perl -w 2# (c) 2001, Dave Jones. (the file handling bit) 3# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit) 4# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite) 5# (c) 2008-2010 Andy Whitcroft <apw@canonical.com> 6# Licensed under the terms of the GNU GPL License version 2 7 8use strict; 9use POSIX; 10use File::Basename; 11use Cwd 'abs_path'; 12 13my $P = $0; 14$P =~ s@.*/@@g; 15my $D = dirname(abs_path($P)); 16 17my $V = '0.32'; 18 19use Getopt::Long qw(:config no_auto_abbrev); 20 21my $quiet = 0; 22my $tree = 1; 23my $chk_signoff = 1; 24my $chk_patch = 1; 25my $tst_only; 26my $emacs = 0; 27my $terse = 0; 28my $file = 0; 29my $check = 0; 30my $summary = 1; 31my $mailback = 0; 32my $summary_file = 0; 33my $show_types = 0; 34my $fix = 0; 35my $fix_inplace = 0; 36my $root; 37my %debug; 38my %camelcase = (); 39my %use_type = (); 40my @use = (); 41my %ignore_type = (); 42my @ignore = (); 43my $help = 0; 44my $configuration_file = ".checkpatch.conf"; 45my $max_line_length = 80; 46my $ignore_perl_version = 0; 47my $minimum_perl_version = 5.10.0; 48my $spelling_file = "$D/spelling.txt"; 49my $codespell = 0; 50my $codespellfile = "/usr/share/codespell/dictionary.txt"; 51 52sub help { 53 my ($exitcode) = @_; 54 55 print << "EOM"; 56Usage: $P [OPTION]... [FILE]... 57Version: $V 58 59Options: 60 -q, --quiet quiet 61 --no-tree run without a kernel tree 62 --no-signoff do not check for 'Signed-off-by' line 63 --patch treat FILE as patchfile (default) 64 --emacs emacs compile window format 65 --terse one line per report 66 -f, --file treat FILE as regular source file 67 --subjective, --strict enable more subjective tests 68 --types TYPE(,TYPE2...) show only these comma separated message types 69 --ignore TYPE(,TYPE2...) ignore various comma separated message types 70 --max-line-length=n set the maximum line length, if exceeded, warn 71 --show-types show the message "types" in the output 72 --root=PATH PATH to the kernel tree root 73 --no-summary suppress the per-file summary 74 --mailback only produce a report in case of warnings/errors 75 --summary-file include the filename in summary 76 --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of 77 'values', 'possible', 'type', and 'attr' (default 78 is all off) 79 --test-only=WORD report only warnings/errors containing WORD 80 literally 81 --fix EXPERIMENTAL - may create horrible results 82 If correctable single-line errors exist, create 83 "<inputfile>.EXPERIMENTAL-checkpatch-fixes" 84 with potential errors corrected to the preferred 85 checkpatch style 86 --fix-inplace EXPERIMENTAL - may create horrible results 87 Is the same as --fix, but overwrites the input 88 file. It's your fault if there's no backup or git 89 --ignore-perl-version override checking of perl version. expect 90 runtime errors. 91 --codespell Use the codespell dictionary for spelling/typos 92 (default:/usr/local/share/codespell/dictionary.txt) 93 --codespellfile Use this codespell dictionary 94 -h, --help, --version display this help and exit 95 96When FILE is - read standard input. 97EOM 98 99 exit($exitcode); 100} 101 102my $conf = which_conf($configuration_file); 103if (-f $conf) { 104 my @conf_args; 105 open(my $conffile, '<', "$conf") 106 or warn "$P: Can't find a readable $configuration_file file $!\n"; 107 108 while (<$conffile>) { 109 my $line = $_; 110 111 $line =~ s/\s*\n?$//g; 112 $line =~ s/^\s*//g; 113 $line =~ s/\s+/ /g; 114 115 next if ($line =~ m/^\s*#/); 116 next if ($line =~ m/^\s*$/); 117 118 my @words = split(" ", $line); 119 foreach my $word (@words) { 120 last if ($word =~ m/^#/); 121 push (@conf_args, $word); 122 } 123 } 124 close($conffile); 125 unshift(@ARGV, @conf_args) if @conf_args; 126} 127 128GetOptions( 129 'q|quiet+' => \$quiet, 130 'tree!' => \$tree, 131 'signoff!' => \$chk_signoff, 132 'patch!' => \$chk_patch, 133 'emacs!' => \$emacs, 134 'terse!' => \$terse, 135 'f|file!' => \$file, 136 'subjective!' => \$check, 137 'strict!' => \$check, 138 'ignore=s' => \@ignore, 139 'types=s' => \@use, 140 'show-types!' => \$show_types, 141 'max-line-length=i' => \$max_line_length, 142 'root=s' => \$root, 143 'summary!' => \$summary, 144 'mailback!' => \$mailback, 145 'summary-file!' => \$summary_file, 146 'fix!' => \$fix, 147 'fix-inplace!' => \$fix_inplace, 148 'ignore-perl-version!' => \$ignore_perl_version, 149 'debug=s' => \%debug, 150 'test-only=s' => \$tst_only, 151 'codespell!' => \$codespell, 152 'codespellfile=s' => \$codespellfile, 153 'h|help' => \$help, 154 'version' => \$help 155) or help(1); 156 157help(0) if ($help); 158 159$fix = 1 if ($fix_inplace); 160 161my $exit = 0; 162 163if ($^V && $^V lt $minimum_perl_version) { 164 printf "$P: requires at least perl version %vd\n", $minimum_perl_version; 165 if (!$ignore_perl_version) { 166 exit(1); 167 } 168} 169 170if ($#ARGV < 0) { 171 print "$P: no input files\n"; 172 exit(1); 173} 174 175sub hash_save_array_words { 176 my ($hashRef, $arrayRef) = @_; 177 178 my @array = split(/,/, join(',', @$arrayRef)); 179 foreach my $word (@array) { 180 $word =~ s/\s*\n?$//g; 181 $word =~ s/^\s*//g; 182 $word =~ s/\s+/ /g; 183 $word =~ tr/[a-z]/[A-Z]/; 184 185 next if ($word =~ m/^\s*#/); 186 next if ($word =~ m/^\s*$/); 187 188 $hashRef->{$word}++; 189 } 190} 191 192sub hash_show_words { 193 my ($hashRef, $prefix) = @_; 194 195 if ($quiet == 0 && keys %$hashRef) { 196 print "NOTE: $prefix message types:"; 197 foreach my $word (sort keys %$hashRef) { 198 print " $word"; 199 } 200 print "\n\n"; 201 } 202} 203 204hash_save_array_words(\%ignore_type, \@ignore); 205hash_save_array_words(\%use_type, \@use); 206 207my $dbg_values = 0; 208my $dbg_possible = 0; 209my $dbg_type = 0; 210my $dbg_attr = 0; 211for my $key (keys %debug) { 212 ## no critic 213 eval "\${dbg_$key} = '$debug{$key}';"; 214 die "$@" if ($@); 215} 216 217my $rpt_cleaners = 0; 218 219if ($terse) { 220 $emacs = 1; 221 $quiet++; 222} 223 224if ($tree) { 225 if (defined $root) { 226 if (!top_of_kernel_tree($root)) { 227 die "$P: $root: --root does not point at a valid tree\n"; 228 } 229 } else { 230 if (top_of_kernel_tree('.')) { 231 $root = '.'; 232 } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ && 233 top_of_kernel_tree($1)) { 234 $root = $1; 235 } 236 } 237 238 if (!defined $root) { 239 print "Must be run from the top-level dir. of a kernel tree\n"; 240 exit(2); 241 } 242} 243 244my $emitted_corrupt = 0; 245 246our $Ident = qr{ 247 [A-Za-z_][A-Za-z\d_]* 248 (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)* 249 }x; 250our $Storage = qr{extern|static|asmlinkage}; 251our $Sparse = qr{ 252 __user| 253 __kernel| 254 __force| 255 __iomem| 256 __must_check| 257 __init_refok| 258 __kprobes| 259 __ref| 260 __rcu 261 }x; 262our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)}; 263our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)}; 264our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)}; 265our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)}; 266our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit}; 267 268# Notes to $Attribute: 269# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check 270our $Attribute = qr{ 271 const| 272 __percpu| 273 __nocast| 274 __safe| 275 __bitwise__| 276 __packed__| 277 __packed2__| 278 __naked| 279 __maybe_unused| 280 __always_unused| 281 __noreturn| 282 __used| 283 __cold| 284 __noclone| 285 __deprecated| 286 __read_mostly| 287 __kprobes| 288 $InitAttribute| 289 ____cacheline_aligned| 290 ____cacheline_aligned_in_smp| 291 ____cacheline_internodealigned_in_smp| 292 __weak 293 }x; 294our $Modifier; 295our $Inline = qr{inline|__always_inline|noinline}; 296our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; 297our $Lval = qr{$Ident(?:$Member)*}; 298 299our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u}; 300our $Binary = qr{(?i)0b[01]+$Int_type?}; 301our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?}; 302our $Int = qr{[0-9]+$Int_type?}; 303our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?}; 304our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?}; 305our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?}; 306our $Float = qr{$Float_hex|$Float_dec|$Float_int}; 307our $Constant = qr{$Float|$Binary|$Hex|$Int}; 308our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=}; 309our $Compare = qr{<=|>=|==|!=|<|>}; 310our $Arithmetic = qr{\+|-|\*|\/|%}; 311our $Operators = qr{ 312 <=|>=|==|!=| 313 =>|->|<<|>>|<|>|!|~| 314 &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic 315 }x; 316 317our $NonptrType; 318our $NonptrTypeWithAttr; 319our $Type; 320our $Declare; 321 322our $NON_ASCII_UTF8 = qr{ 323 [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte 324 | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs 325 | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte 326 | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates 327 | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 328 | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 329 | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 330}x; 331 332our $UTF8 = qr{ 333 [\x09\x0A\x0D\x20-\x7E] # ASCII 334 | $NON_ASCII_UTF8 335}x; 336 337our $typeTypedefs = qr{(?x: 338 (?:__)?(?:u|s|be|le)(?:8|16|32|64)| 339 atomic_t 340)}; 341 342our $logFunctions = qr{(?x: 343 printk(?:_ratelimited|_once|)| 344 (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)| 345 WARN(?:_RATELIMIT|_ONCE|)| 346 panic| 347 debug| 348 printf| 349 puts| 350 MODULE_[A-Z_]+| 351 seq_vprintf|seq_printf|seq_puts 352)}; 353 354our $signature_tags = qr{(?xi: 355 Signed-off-by:| 356 Acked-by:| 357 Tested-by:| 358 Reviewed-by:| 359 Reported-by:| 360 Suggested-by:| 361 To:| 362 Cc: 363)}; 364 365our @typeList = ( 366 qr{void}, 367 qr{(?:unsigned\s+)?char}, 368 qr{(?:unsigned\s+)?short}, 369 qr{(?:unsigned\s+)?int}, 370 qr{(?:unsigned\s+)?long}, 371 qr{(?:unsigned\s+)?long\s+int}, 372 qr{(?:unsigned\s+)?long\s+long}, 373 qr{(?:unsigned\s+)?long\s+long\s+int}, 374 qr{unsigned}, 375 qr{float}, 376 qr{double}, 377 qr{bool}, 378 qr{struct\s+$Ident}, 379 qr{union\s+$Ident}, 380 qr{enum\s+$Ident}, 381 qr{${Ident}_t}, 382 qr{${Ident}_handler}, 383 qr{${Ident}_handler_fn}, 384); 385our @typeListWithAttr = ( 386 @typeList, 387 qr{struct\s+$InitAttribute\s+$Ident}, 388 qr{union\s+$InitAttribute\s+$Ident}, 389); 390 391our @modifierList = ( 392 qr{fastcall}, 393); 394 395our $allowed_asm_includes = qr{(?x: 396 irq| 397 memory 398)}; 399# memory.h: ARM has a custom one 400 401# Load common spelling mistakes and build regular expression list. 402my $misspellings; 403my %spelling_fix; 404 405if (open(my $spelling, '<', $spelling_file)) { 406 while (<$spelling>) { 407 my $line = $_; 408 409 $line =~ s/\s*\n?$//g; 410 $line =~ s/^\s*//g; 411 412 next if ($line =~ m/^\s*#/); 413 next if ($line =~ m/^\s*$/); 414 415 my ($suspect, $fix) = split(/\|\|/, $line); 416 417 $spelling_fix{$suspect} = $fix; 418 } 419 close($spelling); 420} else { 421 warn "No typos will be found - file '$spelling_file': $!\n"; 422} 423 424if ($codespell) { 425 if (open(my $spelling, '<', $codespellfile)) { 426 while (<$spelling>) { 427 my $line = $_; 428 429 $line =~ s/\s*\n?$//g; 430 $line =~ s/^\s*//g; 431 432 next if ($line =~ m/^\s*#/); 433 next if ($line =~ m/^\s*$/); 434 next if ($line =~ m/, disabled/i); 435 436 $line =~ s/,.*$//; 437 438 my ($suspect, $fix) = split(/->/, $line); 439 440 $spelling_fix{$suspect} = $fix; 441 } 442 close($spelling); 443 } else { 444 warn "No codespell typos will be found - file '$codespellfile': $!\n"; 445 } 446} 447 448$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix; 449 450 451sub build_types { 452 my $mods = "(?x: \n" . join("|\n ", @modifierList) . "\n)"; 453 my $all = "(?x: \n" . join("|\n ", @typeList) . "\n)"; 454 my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)"; 455 $Modifier = qr{(?:$Attribute|$Sparse|$mods)}; 456 $NonptrType = qr{ 457 (?:$Modifier\s+|const\s+)* 458 (?: 459 (?:typeof|__typeof__)\s*\([^\)]*\)| 460 (?:$typeTypedefs\b)| 461 (?:${all}\b) 462 ) 463 (?:\s+$Modifier|\s+const)* 464 }x; 465 $NonptrTypeWithAttr = qr{ 466 (?:$Modifier\s+|const\s+)* 467 (?: 468 (?:typeof|__typeof__)\s*\([^\)]*\)| 469 (?:$typeTypedefs\b)| 470 (?:${allWithAttr}\b) 471 ) 472 (?:\s+$Modifier|\s+const)* 473 }x; 474 $Type = qr{ 475 $NonptrType 476 (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*|\[\])+|(?:\s*\[\s*\])+)? 477 (?:\s+$Inline|\s+$Modifier)* 478 }x; 479 $Declare = qr{(?:$Storage\s+)?$Type}; 480} 481build_types(); 482 483our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*}; 484 485# Using $balanced_parens, $LvalOrFunc, or $FuncArg 486# requires at least perl version v5.10.0 487# Any use must be runtime checked with $^V 488 489our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/; 490our $LvalOrFunc = qr{($Lval)\s*($balanced_parens{0,1})\s*}; 491our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant)}; 492 493sub deparenthesize { 494 my ($string) = @_; 495 return "" if (!defined($string)); 496 $string =~ s@^\s*\(\s*@@g; 497 $string =~ s@\s*\)\s*$@@g; 498 $string =~ s@\s+@ @g; 499 return $string; 500} 501 502sub seed_camelcase_file { 503 my ($file) = @_; 504 505 return if (!(-f $file)); 506 507 local $/; 508 509 open(my $include_file, '<', "$file") 510 or warn "$P: Can't read '$file' $!\n"; 511 my $text = <$include_file>; 512 close($include_file); 513 514 my @lines = split('\n', $text); 515 516 foreach my $line (@lines) { 517 next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/); 518 if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) { 519 $camelcase{$1} = 1; 520 } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) { 521 $camelcase{$1} = 1; 522 } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) { 523 $camelcase{$1} = 1; 524 } 525 } 526} 527 528my $camelcase_seeded = 0; 529sub seed_camelcase_includes { 530 return if ($camelcase_seeded); 531 532 my $files; 533 my $camelcase_cache = ""; 534 my @include_files = (); 535 536 $camelcase_seeded = 1; 537 538 if (-e ".git") { 539 my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`; 540 chomp $git_last_include_commit; 541 $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit"; 542 } else { 543 my $last_mod_date = 0; 544 $files = `find $root/include -name "*.h"`; 545 @include_files = split('\n', $files); 546 foreach my $file (@include_files) { 547 my $date = POSIX::strftime("%Y%m%d%H%M", 548 localtime((stat $file)[9])); 549 $last_mod_date = $date if ($last_mod_date < $date); 550 } 551 $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date"; 552 } 553 554 if ($camelcase_cache ne "" && -f $camelcase_cache) { 555 open(my $camelcase_file, '<', "$camelcase_cache") 556 or warn "$P: Can't read '$camelcase_cache' $!\n"; 557 while (<$camelcase_file>) { 558 chomp; 559 $camelcase{$_} = 1; 560 } 561 close($camelcase_file); 562 563 return; 564 } 565 566 if (-e ".git") { 567 $files = `git ls-files "include/*.h"`; 568 @include_files = split('\n', $files); 569 } 570 571 foreach my $file (@include_files) { 572 seed_camelcase_file($file); 573 } 574 575 if ($camelcase_cache ne "") { 576 unlink glob ".checkpatch-camelcase.*"; 577 open(my $camelcase_file, '>', "$camelcase_cache") 578 or warn "$P: Can't write '$camelcase_cache' $!\n"; 579 foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) { 580 print $camelcase_file ("$_\n"); 581 } 582 close($camelcase_file); 583 } 584} 585 586$chk_signoff = 0 if ($file); 587 588my @rawlines = (); 589my @lines = (); 590my @fixed = (); 591my $vname; 592my $fixlinenr = -1; 593 594for my $filename (@ARGV) { 595 my $FILE; 596 if ($file) { 597 open($FILE, '-|', "diff -u /dev/null $filename") || 598 die "$P: $filename: diff failed - $!\n"; 599 } elsif ($filename eq '-') { 600 open($FILE, '<&STDIN'); 601 } else { 602 open($FILE, '<', "$filename") || 603 die "$P: $filename: open failed - $!\n"; 604 } 605 if ($filename eq '-') { 606 $vname = 'Your patch'; 607 } else { 608 $vname = $filename; 609 } 610 while (<$FILE>) { 611 chomp; 612 push(@rawlines, $_); 613 } 614 close($FILE); 615 if (!process($filename)) { 616 $exit = 1; 617 } 618 @rawlines = (); 619 @lines = (); 620 @fixed = (); 621} 622 623exit($exit); 624 625sub top_of_kernel_tree { 626 my ($root) = @_; 627 628 my @tree_check = ( 629 "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile", 630 "README", "Documentation", "arch", "include", "drivers", 631 "fs", "init", "ipc", "kernel", "lib", "scripts", 632 ); 633 634 foreach my $check (@tree_check) { 635 if (! -e $root . '/' . $check) { 636 return 0; 637 } 638 } 639 return 1; 640} 641 642sub parse_email { 643 my ($formatted_email) = @_; 644 645 my $name = ""; 646 my $address = ""; 647 my $comment = ""; 648 649 if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) { 650 $name = $1; 651 $address = $2; 652 $comment = $3 if defined $3; 653 } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) { 654 $address = $1; 655 $comment = $2 if defined $2; 656 } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) { 657 $address = $1; 658 $comment = $2 if defined $2; 659 $formatted_email =~ s/$address.*$//; 660 $name = $formatted_email; 661 $name = trim($name); 662 $name =~ s/^\"|\"$//g; 663 # If there's a name left after stripping spaces and 664 # leading quotes, and the address doesn't have both 665 # leading and trailing angle brackets, the address 666 # is invalid. ie: 667 # "joe smith joe@smith.com" bad 668 # "joe smith <joe@smith.com" bad 669 if ($name ne "" && $address !~ /^<[^>]+>$/) { 670 $name = ""; 671 $address = ""; 672 $comment = ""; 673 } 674 } 675 676 $name = trim($name); 677 $name =~ s/^\"|\"$//g; 678 $address = trim($address); 679 $address =~ s/^\<|\>$//g; 680 681 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars 682 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes 683 $name = "\"$name\""; 684 } 685 686 return ($name, $address, $comment); 687} 688 689sub format_email { 690 my ($name, $address) = @_; 691 692 my $formatted_email; 693 694 $name = trim($name); 695 $name =~ s/^\"|\"$//g; 696 $address = trim($address); 697 698 if ($name =~ /[^\w \-]/i) { ##has "must quote" chars 699 $name =~ s/(?<!\\)"/\\"/g; ##escape quotes 700 $name = "\"$name\""; 701 } 702 703 if ("$name" eq "") { 704 $formatted_email = "$address"; 705 } else { 706 $formatted_email = "$name <$address>"; 707 } 708 709 return $formatted_email; 710} 711 712sub which_conf { 713 my ($conf) = @_; 714 715 foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) { 716 if (-e "$path/$conf") { 717 return "$path/$conf"; 718 } 719 } 720 721 return ""; 722} 723 724sub expand_tabs { 725 my ($str) = @_; 726 727 my $res = ''; 728 my $n = 0; 729 for my $c (split(//, $str)) { 730 if ($c eq "\t") { 731 $res .= ' '; 732 $n++; 733 for (; ($n % 8) != 0; $n++) { 734 $res .= ' '; 735 } 736 next; 737 } 738 $res .= $c; 739 $n++; 740 } 741 742 return $res; 743} 744sub copy_spacing { 745 (my $res = shift) =~ tr/\t/ /c; 746 return $res; 747} 748 749sub line_stats { 750 my ($line) = @_; 751 752 # Drop the diff line leader and expand tabs 753 $line =~ s/^.//; 754 $line = expand_tabs($line); 755 756 # Pick the indent from the front of the line. 757 my ($white) = ($line =~ /^(\s*)/); 758 759 return (length($line), length($white)); 760} 761 762my $sanitise_quote = ''; 763 764sub sanitise_line_reset { 765 my ($in_comment) = @_; 766 767 if ($in_comment) { 768 $sanitise_quote = '*/'; 769 } else { 770 $sanitise_quote = ''; 771 } 772} 773sub sanitise_line { 774 my ($line) = @_; 775 776 my $res = ''; 777 my $l = ''; 778 779 my $qlen = 0; 780 my $off = 0; 781 my $c; 782 783 # Always copy over the diff marker. 784 $res = substr($line, 0, 1); 785 786 for ($off = 1; $off < length($line); $off++) { 787 $c = substr($line, $off, 1); 788 789 # Comments we are wacking completly including the begin 790 # and end, all to $;. 791 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') { 792 $sanitise_quote = '*/'; 793 794 substr($res, $off, 2, "$;$;"); 795 $off++; 796 next; 797 } 798 if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') { 799 $sanitise_quote = ''; 800 substr($res, $off, 2, "$;$;"); 801 $off++; 802 next; 803 } 804 if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') { 805 $sanitise_quote = '//'; 806 807 substr($res, $off, 2, $sanitise_quote); 808 $off++; 809 next; 810 } 811 812 # A \ in a string means ignore the next character. 813 if (($sanitise_quote eq "'" || $sanitise_quote eq '"') && 814 $c eq "\\") { 815 substr($res, $off, 2, 'XX'); 816 $off++; 817 next; 818 } 819 # Regular quotes. 820 if ($c eq "'" || $c eq '"') { 821 if ($sanitise_quote eq '') { 822 $sanitise_quote = $c; 823 824 substr($res, $off, 1, $c); 825 next; 826 } elsif ($sanitise_quote eq $c) { 827 $sanitise_quote = ''; 828 } 829 } 830 831 #print "c<$c> SQ<$sanitise_quote>\n"; 832 if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") { 833 substr($res, $off, 1, $;); 834 } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") { 835 substr($res, $off, 1, $;); 836 } elsif ($off != 0 && $sanitise_quote && $c ne "\t") { 837 substr($res, $off, 1, 'X'); 838 } else { 839 substr($res, $off, 1, $c); 840 } 841 } 842 843 if ($sanitise_quote eq '//') { 844 $sanitise_quote = ''; 845 } 846 847 # The pathname on a #include may be surrounded by '<' and '>'. 848 if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) { 849 my $clean = 'X' x length($1); 850 $res =~ s@\<.*\>@<$clean>@; 851 852 # The whole of a #error is a string. 853 } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) { 854 my $clean = 'X' x length($1); 855 $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@; 856 } 857 858 return $res; 859} 860 861sub get_quoted_string { 862 my ($line, $rawline) = @_; 863 864 return "" if ($line !~ m/(\"[X]+\")/g); 865 return substr($rawline, $-[0], $+[0] - $-[0]); 866} 867 868sub ctx_statement_block { 869 my ($linenr, $remain, $off) = @_; 870 my $line = $linenr - 1; 871 my $blk = ''; 872 my $soff = $off; 873 my $coff = $off - 1; 874 my $coff_set = 0; 875 876 my $loff = 0; 877 878 my $type = ''; 879 my $level = 0; 880 my @stack = (); 881 my $p; 882 my $c; 883 my $len = 0; 884 885 my $remainder; 886 while (1) { 887 @stack = (['', 0]) if ($#stack == -1); 888 889 #warn "CSB: blk<$blk> remain<$remain>\n"; 890 # If we are about to drop off the end, pull in more 891 # context. 892 if ($off >= $len) { 893 for (; $remain > 0; $line++) { 894 last if (!defined $lines[$line]); 895 next if ($lines[$line] =~ /^-/); 896 $remain--; 897 $loff = $len; 898 $blk .= $lines[$line] . "\n"; 899 $len = length($blk); 900 $line++; 901 last; 902 } 903 # Bail if there is no further context. 904 #warn "CSB: blk<$blk> off<$off> len<$len>\n"; 905 if ($off >= $len) { 906 last; 907 } 908 if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) { 909 $level++; 910 $type = '#'; 911 } 912 } 913 $p = $c; 914 $c = substr($blk, $off, 1); 915 $remainder = substr($blk, $off); 916 917 #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n"; 918 919 # Handle nested #if/#else. 920 if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) { 921 push(@stack, [ $type, $level ]); 922 } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) { 923 ($type, $level) = @{$stack[$#stack - 1]}; 924 } elsif ($remainder =~ /^#\s*endif\b/) { 925 ($type, $level) = @{pop(@stack)}; 926 } 927 928 # Statement ends at the ';' or a close '}' at the 929 # outermost level. 930 if ($level == 0 && $c eq ';') { 931 last; 932 } 933 934 # An else is really a conditional as long as its not else if 935 if ($level == 0 && $coff_set == 0 && 936 (!defined($p) || $p =~ /(?:\s|\}|\+)/) && 937 $remainder =~ /^(else)(?:\s|{)/ && 938 $remainder !~ /^else\s+if\b/) { 939 $coff = $off + length($1) - 1; 940 $coff_set = 1; 941 #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n"; 942 #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n"; 943 } 944 945 if (($type eq '' || $type eq '(') && $c eq '(') { 946 $level++; 947 $type = '('; 948 } 949 if ($type eq '(' && $c eq ')') { 950 $level--; 951 $type = ($level != 0)? '(' : ''; 952 953 if ($level == 0 && $coff < $soff) { 954 $coff = $off; 955 $coff_set = 1; 956 #warn "CSB: mark coff<$coff>\n"; 957 } 958 } 959 if (($type eq '' || $type eq '{') && $c eq '{') { 960 $level++; 961 $type = '{'; 962 } 963 if ($type eq '{' && $c eq '}') { 964 $level--; 965 $type = ($level != 0)? '{' : ''; 966 967 if ($level == 0) { 968 if (substr($blk, $off + 1, 1) eq ';') { 969 $off++; 970 } 971 last; 972 } 973 } 974 # Preprocessor commands end at the newline unless escaped. 975 if ($type eq '#' && $c eq "\n" && $p ne "\\") { 976 $level--; 977 $type = ''; 978 $off++; 979 last; 980 } 981 $off++; 982 } 983 # We are truly at the end, so shuffle to the next line. 984 if ($off == $len) { 985 $loff = $len + 1; 986 $line++; 987 $remain--; 988 } 989 990 my $statement = substr($blk, $soff, $off - $soff + 1); 991 my $condition = substr($blk, $soff, $coff - $soff + 1); 992 993 #warn "STATEMENT<$statement>\n"; 994 #warn "CONDITION<$condition>\n"; 995 996 #print "coff<$coff> soff<$off> loff<$loff>\n"; 997 998 return ($statement, $condition, 999 $line, $remain + 1, $off - $loff + 1, $level); 1000} 1001 1002sub statement_lines { 1003 my ($stmt) = @_; 1004 1005 # Strip the diff line prefixes and rip blank lines at start and end. 1006 $stmt =~ s/(^|\n)./$1/g; 1007 $stmt =~ s/^\s*//; 1008 $stmt =~ s/\s*$//; 1009 1010 my @stmt_lines = ($stmt =~ /\n/g); 1011 1012 return $#stmt_lines + 2; 1013} 1014 1015sub statement_rawlines { 1016 my ($stmt) = @_; 1017 1018 my @stmt_lines = ($stmt =~ /\n/g); 1019 1020 return $#stmt_lines + 2; 1021} 1022 1023sub statement_block_size { 1024 my ($stmt) = @_; 1025 1026 $stmt =~ s/(^|\n)./$1/g; 1027 $stmt =~ s/^\s*{//; 1028 $stmt =~ s/}\s*$//; 1029 $stmt =~ s/^\s*//; 1030 $stmt =~ s/\s*$//; 1031 1032 my @stmt_lines = ($stmt =~ /\n/g); 1033 my @stmt_statements = ($stmt =~ /;/g); 1034 1035 my $stmt_lines = $#stmt_lines + 2; 1036 my $stmt_statements = $#stmt_statements + 1; 1037 1038 if ($stmt_lines > $stmt_statements) { 1039 return $stmt_lines; 1040 } else { 1041 return $stmt_statements; 1042 } 1043} 1044 1045sub ctx_statement_full { 1046 my ($linenr, $remain, $off) = @_; 1047 my ($statement, $condition, $level); 1048 1049 my (@chunks); 1050 1051 # Grab the first conditional/block pair. 1052 ($statement, $condition, $linenr, $remain, $off, $level) = 1053 ctx_statement_block($linenr, $remain, $off); 1054 #print "F: c<$condition> s<$statement> remain<$remain>\n"; 1055 push(@chunks, [ $condition, $statement ]); 1056 if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) { 1057 return ($level, $linenr, @chunks); 1058 } 1059 1060 # Pull in the following conditional/block pairs and see if they 1061 # could continue the statement. 1062 for (;;) { 1063 ($statement, $condition, $linenr, $remain, $off, $level) = 1064 ctx_statement_block($linenr, $remain, $off); 1065 #print "C: c<$condition> s<$statement> remain<$remain>\n"; 1066 last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s)); 1067 #print "C: push\n"; 1068 push(@chunks, [ $condition, $statement ]); 1069 } 1070 1071 return ($level, $linenr, @chunks); 1072} 1073 1074sub ctx_block_get { 1075 my ($linenr, $remain, $outer, $open, $close, $off) = @_; 1076 my $line; 1077 my $start = $linenr - 1; 1078 my $blk = ''; 1079 my @o; 1080 my @c; 1081 my @res = (); 1082 1083 my $level = 0; 1084 my @stack = ($level); 1085 for ($line = $start; $remain > 0; $line++) { 1086 next if ($rawlines[$line] =~ /^-/); 1087 $remain--; 1088 1089 $blk .= $rawlines[$line]; 1090 1091 # Handle nested #if/#else. 1092 if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) { 1093 push(@stack, $level); 1094 } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) { 1095 $level = $stack[$#stack - 1]; 1096 } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) { 1097 $level = pop(@stack); 1098 } 1099 1100 foreach my $c (split(//, $lines[$line])) { 1101 ##print "C<$c>L<$level><$open$close>O<$off>\n"; 1102 if ($off > 0) { 1103 $off--; 1104 next; 1105 } 1106 1107 if ($c eq $close && $level > 0) { 1108 $level--; 1109 last if ($level == 0); 1110 } elsif ($c eq $open) { 1111 $level++; 1112 } 1113 } 1114 1115 if (!$outer || $level <= 1) { 1116 push(@res, $rawlines[$line]); 1117 } 1118 1119 last if ($level == 0); 1120 } 1121 1122 return ($level, @res); 1123} 1124sub ctx_block_outer { 1125 my ($linenr, $remain) = @_; 1126 1127 my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0); 1128 return @r; 1129} 1130sub ctx_block { 1131 my ($linenr, $remain) = @_; 1132 1133 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0); 1134 return @r; 1135} 1136sub ctx_statement { 1137 my ($linenr, $remain, $off) = @_; 1138 1139 my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off); 1140 return @r; 1141} 1142sub ctx_block_level { 1143 my ($linenr, $remain) = @_; 1144 1145 return ctx_block_get($linenr, $remain, 0, '{', '}', 0); 1146} 1147sub ctx_statement_level { 1148 my ($linenr, $remain, $off) = @_; 1149 1150 return ctx_block_get($linenr, $remain, 0, '(', ')', $off); 1151} 1152 1153sub ctx_locate_comment { 1154 my ($first_line, $end_line) = @_; 1155 1156 # Catch a comment on the end of the line itself. 1157 my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@); 1158 return $current_comment if (defined $current_comment); 1159 1160 # Look through the context and try and figure out if there is a 1161 # comment. 1162 my $in_comment = 0; 1163 $current_comment = ''; 1164 for (my $linenr = $first_line; $linenr < $end_line; $linenr++) { 1165 my $line = $rawlines[$linenr - 1]; 1166 #warn " $line\n"; 1167 if ($linenr == $first_line and $line =~ m@^.\s*\*@) { 1168 $in_comment = 1; 1169 } 1170 if ($line =~ m@/\*@) { 1171 $in_comment = 1; 1172 } 1173 if (!$in_comment && $current_comment ne '') { 1174 $current_comment = ''; 1175 } 1176 $current_comment .= $line . "\n" if ($in_comment); 1177 if ($line =~ m@\*/@) { 1178 $in_comment = 0; 1179 } 1180 } 1181 1182 chomp($current_comment); 1183 return($current_comment); 1184} 1185sub ctx_has_comment { 1186 my ($first_line, $end_line) = @_; 1187 my $cmt = ctx_locate_comment($first_line, $end_line); 1188 1189 ##print "LINE: $rawlines[$end_line - 1 ]\n"; 1190 ##print "CMMT: $cmt\n"; 1191 1192 return ($cmt ne ''); 1193} 1194 1195sub raw_line { 1196 my ($linenr, $cnt) = @_; 1197 1198 my $offset = $linenr - 1; 1199 $cnt++; 1200 1201 my $line; 1202 while ($cnt) { 1203 $line = $rawlines[$offset++]; 1204 next if (defined($line) && $line =~ /^-/); 1205 $cnt--; 1206 } 1207 1208 return $line; 1209} 1210 1211sub cat_vet { 1212 my ($vet) = @_; 1213 my ($res, $coded); 1214 1215 $res = ''; 1216 while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) { 1217 $res .= $1; 1218 if ($2 ne '') { 1219 $coded = sprintf("^%c", unpack('C', $2) + 64); 1220 $res .= $coded; 1221 } 1222 } 1223 $res =~ s/$/\$/; 1224 1225 return $res; 1226} 1227 1228my $av_preprocessor = 0; 1229my $av_pending; 1230my @av_paren_type; 1231my $av_pend_colon; 1232 1233sub annotate_reset { 1234 $av_preprocessor = 0; 1235 $av_pending = '_'; 1236 @av_paren_type = ('E'); 1237 $av_pend_colon = 'O'; 1238} 1239 1240sub annotate_values { 1241 my ($stream, $type) = @_; 1242 1243 my $res; 1244 my $var = '_' x length($stream); 1245 my $cur = $stream; 1246 1247 print "$stream\n" if ($dbg_values > 1); 1248 1249 while (length($cur)) { 1250 @av_paren_type = ('E') if ($#av_paren_type < 0); 1251 print " <" . join('', @av_paren_type) . 1252 "> <$type> <$av_pending>" if ($dbg_values > 1); 1253 if ($cur =~ /^(\s+)/o) { 1254 print "WS($1)\n" if ($dbg_values > 1); 1255 if ($1 =~ /\n/ && $av_preprocessor) { 1256 $type = pop(@av_paren_type); 1257 $av_preprocessor = 0; 1258 } 1259 1260 } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') { 1261 print "CAST($1)\n" if ($dbg_values > 1); 1262 push(@av_paren_type, $type); 1263 $type = 'c'; 1264 1265 } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) { 1266 print "DECLARE($1)\n" if ($dbg_values > 1); 1267 $type = 'T'; 1268 1269 } elsif ($cur =~ /^($Modifier)\s*/) { 1270 print "MODIFIER($1)\n" if ($dbg_values > 1); 1271 $type = 'T'; 1272 1273 } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) { 1274 print "DEFINE($1,$2)\n" if ($dbg_values > 1); 1275 $av_preprocessor = 1; 1276 push(@av_paren_type, $type); 1277 if ($2 ne '') { 1278 $av_pending = 'N'; 1279 } 1280 $type = 'E'; 1281 1282 } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) { 1283 print "UNDEF($1)\n" if ($dbg_values > 1); 1284 $av_preprocessor = 1; 1285 push(@av_paren_type, $type); 1286 1287 } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) { 1288 print "PRE_START($1)\n" if ($dbg_values > 1); 1289 $av_preprocessor = 1; 1290 1291 push(@av_paren_type, $type); 1292 push(@av_paren_type, $type); 1293 $type = 'E'; 1294 1295 } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) { 1296 print "PRE_RESTART($1)\n" if ($dbg_values > 1); 1297 $av_preprocessor = 1; 1298 1299 push(@av_paren_type, $av_paren_type[$#av_paren_type]); 1300 1301 $type = 'E'; 1302 1303 } elsif ($cur =~ /^(\#\s*(?:endif))/o) { 1304 print "PRE_END($1)\n" if ($dbg_values > 1); 1305 1306 $av_preprocessor = 1; 1307 1308 # Assume all arms of the conditional end as this 1309 # one does, and continue as if the #endif was not here. 1310 pop(@av_paren_type); 1311 push(@av_paren_type, $type); 1312 $type = 'E'; 1313 1314 } elsif ($cur =~ /^(\\\n)/o) { 1315 print "PRECONT($1)\n" if ($dbg_values > 1); 1316 1317 } elsif ($cur =~ /^(__attribute__)\s*\(?/o) { 1318 print "ATTR($1)\n" if ($dbg_values > 1); 1319 $av_pending = $type; 1320 $type = 'N'; 1321 1322 } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { 1323 print "SIZEOF($1)\n" if ($dbg_values > 1); 1324 if (defined $2) { 1325 $av_pending = 'V'; 1326 } 1327 $type = 'N'; 1328 1329 } elsif ($cur =~ /^(if|while|for)\b/o) { 1330 print "COND($1)\n" if ($dbg_values > 1); 1331 $av_pending = 'E'; 1332 $type = 'N'; 1333 1334 } elsif ($cur =~/^(case)/o) { 1335 print "CASE($1)\n" if ($dbg_values > 1); 1336 $av_pend_colon = 'C'; 1337 $type = 'N'; 1338 1339 } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) { 1340 print "KEYWORD($1)\n" if ($dbg_values > 1); 1341 $type = 'N'; 1342 1343 } elsif ($cur =~ /^(\()/o) { 1344 print "PAREN('$1')\n" if ($dbg_values > 1); 1345 push(@av_paren_type, $av_pending); 1346 $av_pending = '_'; 1347 $type = 'N'; 1348 1349 } elsif ($cur =~ /^(\))/o) { 1350 my $new_type = pop(@av_paren_type); 1351 if ($new_type ne '_') { 1352 $type = $new_type; 1353 print "PAREN('$1') -> $type\n" 1354 if ($dbg_values > 1); 1355 } else { 1356 print "PAREN('$1')\n" if ($dbg_values > 1); 1357 } 1358 1359 } elsif ($cur =~ /^($Ident)\s*\(/o) { 1360 print "FUNC($1)\n" if ($dbg_values > 1); 1361 $type = 'V'; 1362 $av_pending = 'V'; 1363 1364 } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) { 1365 if (defined $2 && $type eq 'C' || $type eq 'T') { 1366 $av_pend_colon = 'B'; 1367 } elsif ($type eq 'E') { 1368 $av_pend_colon = 'L'; 1369 } 1370 print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1); 1371 $type = 'V'; 1372 1373 } elsif ($cur =~ /^($Ident|$Constant)/o) { 1374 print "IDENT($1)\n" if ($dbg_values > 1); 1375 $type = 'V'; 1376 1377 } elsif ($cur =~ /^($Assignment)/o) { 1378 print "ASSIGN($1)\n" if ($dbg_values > 1); 1379 $type = 'N'; 1380 1381 } elsif ($cur =~/^(;|{|})/) { 1382 print "END($1)\n" if ($dbg_values > 1); 1383 $type = 'E'; 1384 $av_pend_colon = 'O'; 1385 1386 } elsif ($cur =~/^(,)/) { 1387 print "COMMA($1)\n" if ($dbg_values > 1); 1388 $type = 'C'; 1389 1390 } elsif ($cur =~ /^(\?)/o) { 1391 print "QUESTION($1)\n" if ($dbg_values > 1); 1392 $type = 'N'; 1393 1394 } elsif ($cur =~ /^(:)/o) { 1395 print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1); 1396 1397 substr($var, length($res), 1, $av_pend_colon); 1398 if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') { 1399 $type = 'E'; 1400 } else { 1401 $type = 'N'; 1402 } 1403 $av_pend_colon = 'O'; 1404 1405 } elsif ($cur =~ /^(\[)/o) { 1406 print "CLOSE($1)\n" if ($dbg_values > 1); 1407 $type = 'N'; 1408 1409 } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) { 1410 my $variant; 1411 1412 print "OPV($1)\n" if ($dbg_values > 1); 1413 if ($type eq 'V') { 1414 $variant = 'B'; 1415 } else { 1416 $variant = 'U'; 1417 } 1418 1419 substr($var, length($res), 1, $variant); 1420 $type = 'N'; 1421 1422 } elsif ($cur =~ /^($Operators)/o) { 1423 print "OP($1)\n" if ($dbg_values > 1); 1424 if ($1 ne '++' && $1 ne '--') { 1425 $type = 'N'; 1426 } 1427 1428 } elsif ($cur =~ /(^.)/o) { 1429 print "C($1)\n" if ($dbg_values > 1); 1430 } 1431 if (defined $1) { 1432 $cur = substr($cur, length($1)); 1433 $res .= $type x length($1); 1434 } 1435 } 1436 1437 return ($res, $var); 1438} 1439 1440sub possible { 1441 my ($possible, $line) = @_; 1442 my $notPermitted = qr{(?: 1443 ^(?: 1444 $Modifier| 1445 $Storage| 1446 $Type| 1447 DEFINE_\S+ 1448 )$| 1449 ^(?: 1450 goto| 1451 return| 1452 case| 1453 else| 1454 asm|__asm__| 1455 do| 1456 \#| 1457 \#\#| 1458 )(?:\s|$)| 1459 ^(?:typedef|struct|enum)\b 1460 )}x; 1461 warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2); 1462 if ($possible !~ $notPermitted) { 1463 # Check for modifiers. 1464 $possible =~ s/\s*$Storage\s*//g; 1465 $possible =~ s/\s*$Sparse\s*//g; 1466 if ($possible =~ /^\s*$/) { 1467 1468 } elsif ($possible =~ /\s/) { 1469 $possible =~ s/\s*$Type\s*//g; 1470 for my $modifier (split(' ', $possible)) { 1471 if ($modifier !~ $notPermitted) { 1472 warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible); 1473 push(@modifierList, $modifier); 1474 } 1475 } 1476 1477 } else { 1478 warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible); 1479 push(@typeList, $possible); 1480 } 1481 build_types(); 1482 } else { 1483 warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1); 1484 } 1485} 1486 1487my $prefix = ''; 1488 1489sub show_type { 1490 return defined $use_type{$_[0]} if (scalar keys %use_type > 0); 1491 1492 return !defined $ignore_type{$_[0]}; 1493} 1494 1495sub report { 1496 if (!show_type($_[1]) || 1497 (defined $tst_only && $_[2] !~ /\Q$tst_only\E/)) { 1498 return 0; 1499 } 1500 my $line; 1501 if ($show_types) { 1502 $line = "$prefix$_[0]:$_[1]: $_[2]\n"; 1503 } else { 1504 $line = "$prefix$_[0]: $_[2]\n"; 1505 } 1506 $line = (split('\n', $line))[0] . "\n" if ($terse); 1507 1508 push(our @report, $line); 1509 1510 return 1; 1511} 1512sub report_dump { 1513 our @report; 1514} 1515 1516sub ERROR { 1517 if (report("ERROR", $_[0], $_[1])) { 1518 our $clean = 0; 1519 our $cnt_error++; 1520 return 1; 1521 } 1522 return 0; 1523} 1524sub WARN { 1525 if (report("WARNING", $_[0], $_[1])) { 1526 our $clean = 0; 1527 our $cnt_warn++; 1528 return 1; 1529 } 1530 return 0; 1531} 1532sub CHK { 1533 if ($check && report("CHECK", $_[0], $_[1])) { 1534 our $clean = 0; 1535 our $cnt_chk++; 1536 return 1; 1537 } 1538 return 0; 1539} 1540 1541sub check_absolute_file { 1542 my ($absolute, $herecurr) = @_; 1543 my $file = $absolute; 1544 1545 ##print "absolute<$absolute>\n"; 1546 1547 # See if any suffix of this path is a path within the tree. 1548 while ($file =~ s@^[^/]*/@@) { 1549 if (-f "$root/$file") { 1550 ##print "file<$file>\n"; 1551 last; 1552 } 1553 } 1554 if (! -f _) { 1555 return 0; 1556 } 1557 1558 # It is, so see if the prefix is acceptable. 1559 my $prefix = $absolute; 1560 substr($prefix, -length($file)) = ''; 1561 1562 ##print "prefix<$prefix>\n"; 1563 if ($prefix ne ".../") { 1564 WARN("USE_RELATIVE_PATH", 1565 "use relative pathname instead of absolute in changelog text\n" . $herecurr); 1566 } 1567} 1568 1569sub trim { 1570 my ($string) = @_; 1571 1572 $string =~ s/^\s+|\s+$//g; 1573 1574 return $string; 1575} 1576 1577sub ltrim { 1578 my ($string) = @_; 1579 1580 $string =~ s/^\s+//; 1581 1582 return $string; 1583} 1584 1585sub rtrim { 1586 my ($string) = @_; 1587 1588 $string =~ s/\s+$//; 1589 1590 return $string; 1591} 1592 1593sub string_find_replace { 1594 my ($string, $find, $replace) = @_; 1595 1596 $string =~ s/$find/$replace/g; 1597 1598 return $string; 1599} 1600 1601sub tabify { 1602 my ($leading) = @_; 1603 1604 my $source_indent = 8; 1605 my $max_spaces_before_tab = $source_indent - 1; 1606 my $spaces_to_tab = " " x $source_indent; 1607 1608 #convert leading spaces to tabs 1609 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g; 1610 #Remove spaces before a tab 1611 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g; 1612 1613 return "$leading"; 1614} 1615 1616sub pos_last_openparen { 1617 my ($line) = @_; 1618 1619 my $pos = 0; 1620 1621 my $opens = $line =~ tr/\(/\(/; 1622 my $closes = $line =~ tr/\)/\)/; 1623 1624 my $last_openparen = 0; 1625 1626 if (($opens == 0) || ($closes >= $opens)) { 1627 return -1; 1628 } 1629 1630 my $len = length($line); 1631 1632 for ($pos = 0; $pos < $len; $pos++) { 1633 my $string = substr($line, $pos); 1634 if ($string =~ /^($FuncArg|$balanced_parens)/) { 1635 $pos += length($1) - 1; 1636 } elsif (substr($line, $pos, 1) eq '(') { 1637 $last_openparen = $pos; 1638 } elsif (index($string, '(') == -1) { 1639 last; 1640 } 1641 } 1642 1643 return $last_openparen + 1; 1644} 1645 1646sub process { 1647 my $filename = shift; 1648 1649 my $linenr=0; 1650 my $prevline=""; 1651 my $prevrawline=""; 1652 my $stashline=""; 1653 my $stashrawline=""; 1654 1655 my $length; 1656 my $indent; 1657 my $previndent=0; 1658 my $stashindent=0; 1659 1660 our $clean = 1; 1661 my $signoff = 0; 1662 my $is_patch = 0; 1663 1664 my $in_header_lines = 1; 1665 my $in_commit_log = 0; #Scanning lines before patch 1666 1667 my $non_utf8_charset = 0; 1668 1669 our @report = (); 1670 our $cnt_lines = 0; 1671 our $cnt_error = 0; 1672 our $cnt_warn = 0; 1673 our $cnt_chk = 0; 1674 1675 # Trace the real file/line as we go. 1676 my $realfile = ''; 1677 my $realline = 0; 1678 my $realcnt = 0; 1679 my $here = ''; 1680 my $in_comment = 0; 1681 my $comment_edge = 0; 1682 my $first_line = 0; 1683 my $p1_prefix = ''; 1684 1685 my $prev_values = 'E'; 1686 1687 # suppression flags 1688 my %suppress_ifbraces; 1689 my %suppress_whiletrailers; 1690 my %suppress_export; 1691 my $suppress_statement = 0; 1692 1693 my %signatures = (); 1694 1695 # Pre-scan the patch sanitizing the lines. 1696 # Pre-scan the patch looking for any __setup documentation. 1697 # 1698 my @setup_docs = (); 1699 my $setup_docs = 0; 1700 1701 my $camelcase_file_seeded = 0; 1702 1703 sanitise_line_reset(); 1704 my $line; 1705 foreach my $rawline (@rawlines) { 1706 $linenr++; 1707 $line = $rawline; 1708 1709 push(@fixed, $rawline) if ($fix); 1710 1711 if ($rawline=~/^\+\+\+\s+(\S+)/) { 1712 $setup_docs = 0; 1713 if ($1 =~ m@Documentation/kernel-parameters.txt$@) { 1714 $setup_docs = 1; 1715 } 1716 #next; 1717 } 1718 if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { 1719 $realline=$1-1; 1720 if (defined $2) { 1721 $realcnt=$3+1; 1722 } else { 1723 $realcnt=1+1; 1724 } 1725 $in_comment = 0; 1726 1727 # Guestimate if this is a continuing comment. Run 1728 # the context looking for a comment "edge". If this 1729 # edge is a close comment then we must be in a comment 1730 # at context start. 1731 my $edge; 1732 my $cnt = $realcnt; 1733 for (my $ln = $linenr + 1; $cnt > 0; $ln++) { 1734 next if (defined $rawlines[$ln - 1] && 1735 $rawlines[$ln - 1] =~ /^-/); 1736 $cnt--; 1737 #print "RAW<$rawlines[$ln - 1]>\n"; 1738 last if (!defined $rawlines[$ln - 1]); 1739 if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ && 1740 $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) { 1741 ($edge) = $1; 1742 last; 1743 } 1744 } 1745 if (defined $edge && $edge eq '*/') { 1746 $in_comment = 1; 1747 } 1748 1749 # Guestimate if this is a continuing comment. If this 1750 # is the start of a diff block and this line starts 1751 # ' *' then it is very likely a comment. 1752 if (!defined $edge && 1753 $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@) 1754 { 1755 $in_comment = 1; 1756 } 1757 1758 ##print "COMMENT:$in_comment edge<$edge> $rawline\n"; 1759 sanitise_line_reset($in_comment); 1760 1761 } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) { 1762 # Standardise the strings and chars within the input to 1763 # simplify matching -- only bother with positive lines. 1764 $line = sanitise_line($rawline); 1765 } 1766 push(@lines, $line); 1767 1768 if ($realcnt > 1) { 1769 $realcnt-- if ($line =~ /^(?:\+| |$)/); 1770 } else { 1771 $realcnt = 0; 1772 } 1773 1774 #print "==>$rawline\n"; 1775 #print "-->$line\n"; 1776 1777 if ($setup_docs && $line =~ /^\+/) { 1778 push(@setup_docs, $line); 1779 } 1780 } 1781 1782 $prefix = ''; 1783 1784 $realcnt = 0; 1785 $linenr = 0; 1786 foreach my $line (@lines) { 1787 $linenr++; 1788 my $sline = $line; #copy of $line 1789 $sline =~ s/$;/ /g; #with comments as spaces 1790 1791 my $rawline = $rawlines[$linenr - 1]; 1792 1793#extract the line range in the file after the patch is applied 1794 if ($line=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { 1795 $is_patch = 1; 1796 $first_line = $linenr + 1; 1797 $realline=$1-1; 1798 if (defined $2) { 1799 $realcnt=$3+1; 1800 } else { 1801 $realcnt=1+1; 1802 } 1803 annotate_reset(); 1804 $prev_values = 'E'; 1805 1806 %suppress_ifbraces = (); 1807 %suppress_whiletrailers = (); 1808 %suppress_export = (); 1809 $suppress_statement = 0; 1810 next; 1811 1812# track the line number as we move through the hunk, note that 1813# new versions of GNU diff omit the leading space on completely 1814# blank context lines so we need to count that too. 1815 } elsif ($line =~ /^( |\+|$)/) { 1816 $realline++; 1817 $realcnt-- if ($realcnt != 0); 1818 1819 # Measure the line length and indent. 1820 ($length, $indent) = line_stats($rawline); 1821 1822 # Track the previous line. 1823 ($prevline, $stashline) = ($stashline, $line); 1824 ($previndent, $stashindent) = ($stashindent, $indent); 1825 ($prevrawline, $stashrawline) = ($stashrawline, $rawline); 1826 1827 #warn "line<$line>\n"; 1828 1829 } elsif ($realcnt == 1) { 1830 $realcnt--; 1831 } 1832 1833 my $hunk_line = ($realcnt != 0); 1834 1835#make up the handle for any error we report on this line 1836 $prefix = "$filename:$realline: " if ($emacs && $file); 1837 $prefix = "$filename:$linenr: " if ($emacs && !$file); 1838 1839 $here = "#$linenr: " if (!$file); 1840 $here = "#$realline: " if ($file); 1841 1842 # extract the filename as it passes 1843 if ($line =~ /^diff --git.*?(\S+)$/) { 1844 $realfile = $1; 1845 $realfile =~ s@^([^/]*)/@@ if (!$file); 1846 $in_commit_log = 0; 1847 } elsif ($line =~ /^\+\+\+\s+(\S+)/) { 1848 $realfile = $1; 1849 $realfile =~ s@^([^/]*)/@@ if (!$file); 1850 $in_commit_log = 0; 1851 1852 $p1_prefix = $1; 1853 if (!$file && $tree && $p1_prefix ne '' && 1854 -e "$root/$p1_prefix") { 1855 WARN("PATCH_PREFIX", 1856 "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n"); 1857 } 1858 1859 if ($realfile =~ m@^include/asm/@) { 1860 ERROR("MODIFIED_INCLUDE_ASM", 1861 "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n"); 1862 } 1863 next; 1864 } 1865 1866 $here .= "FILE: $realfile:$realline:" if ($realcnt != 0); 1867 1868 my $hereline = "$here\n$rawline\n"; 1869 my $herecurr = "$here\n$rawline\n"; 1870 my $hereprev = "$here\n$prevrawline\n$rawline\n"; 1871 1872 $cnt_lines++ if ($realcnt != 0); 1873 1874# Check for incorrect file permissions 1875 if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) { 1876 my $permhere = $here . "FILE: $realfile\n"; 1877 if ($realfile !~ m@scripts/@ && 1878 $realfile !~ /\.(py|pl|awk|sh)$/) { 1879 ERROR("EXECUTE_PERMISSIONS", 1880 "do not set execute permissions for source files\n" . $permhere); 1881 } 1882 } 1883 1884# Check the patch for a signoff: 1885 if ($line =~ /^\s*signed-off-by:/i) { 1886 $signoff++; 1887 $in_commit_log = 0; 1888 } 1889 1890# Check signature styles 1891 if (!$in_header_lines && 1892 $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) { 1893 my $space_before = $1; 1894 my $sign_off = $2; 1895 my $space_after = $3; 1896 my $email = $4; 1897 my $ucfirst_sign_off = ucfirst(lc($sign_off)); 1898 1899 if ($sign_off !~ /$signature_tags/) { 1900 WARN("BAD_SIGN_OFF", 1901 "Non-standard signature: $sign_off\n" . $herecurr); 1902 } 1903 if (defined $space_before && $space_before ne "") { 1904 if (WARN("BAD_SIGN_OFF", 1905 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) && 1906 $fix) { 1907 $fixed[$linenr - 1] = 1908 "$ucfirst_sign_off $email"; 1909 } 1910 } 1911 if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) { 1912 if (WARN("BAD_SIGN_OFF", 1913 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) && 1914 $fix) { 1915 $fixed[$linenr - 1] = 1916 "$ucfirst_sign_off $email"; 1917 } 1918 1919 } 1920 if (!defined $space_after || $space_after ne " ") { 1921 if (WARN("BAD_SIGN_OFF", 1922 "Use a single space after $ucfirst_sign_off\n" . $herecurr) && 1923 $fix) { 1924 $fixed[$linenr - 1] = 1925 "$ucfirst_sign_off $email"; 1926 } 1927 } 1928 1929 my ($email_name, $email_address, $comment) = parse_email($email); 1930 my $suggested_email = format_email(($email_name, $email_address)); 1931 if ($suggested_email eq "") { 1932 ERROR("BAD_SIGN_OFF", 1933 "Unrecognized email address: '$email'\n" . $herecurr); 1934 } else { 1935 my $dequoted = $suggested_email; 1936 $dequoted =~ s/^"//; 1937 $dequoted =~ s/" </ </; 1938 # Don't force email to have quotes 1939 # Allow just an angle bracketed address 1940 if ("$dequoted$comment" ne $email && 1941 "<$email_address>$comment" ne $email && 1942 "$suggested_email$comment" ne $email) { 1943 WARN("BAD_SIGN_OFF", 1944 "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr); 1945 } 1946 } 1947 1948# Check for duplicate signatures 1949 my $sig_nospace = $line; 1950 $sig_nospace =~ s/\s//g; 1951 $sig_nospace = lc($sig_nospace); 1952 if (defined $signatures{$sig_nospace}) { 1953 WARN("BAD_SIGN_OFF", 1954 "Duplicate signature\n" . $herecurr); 1955 } else { 1956 $signatures{$sig_nospace} = 1; 1957 } 1958 } 1959 1960# Check for wrappage within a valid hunk of the file 1961 if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) { 1962 ERROR("CORRUPTED_PATCH", 1963 "patch seems to be corrupt (line wrapped?)\n" . 1964 $herecurr) if (!$emitted_corrupt++); 1965 } 1966 1967# Check for absolute kernel paths. 1968 if ($tree) { 1969 while ($line =~ m{(?:^|\s)(/\S*)}g) { 1970 my $file = $1; 1971 1972 if ($file =~ m{^(.*?)(?::\d+)+:?$} && 1973 check_absolute_file($1, $herecurr)) { 1974 # 1975 } else { 1976 check_absolute_file($file, $herecurr); 1977 } 1978 } 1979 } 1980 1981# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php 1982 if (($realfile =~ /^$/ || $line =~ /^\+/) && 1983 $rawline !~ m/^$UTF8*$/) { 1984 my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/); 1985 1986 my $blank = copy_spacing($rawline); 1987 my $ptr = substr($blank, 0, length($utf8_prefix)) . "^"; 1988 my $hereptr = "$hereline$ptr\n"; 1989 1990 CHK("INVALID_UTF8", 1991 "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr); 1992 } 1993 1994# Check if it's the start of a commit log 1995# (not a header line and we haven't seen the patch filename) 1996 if ($in_header_lines && $realfile =~ /^$/ && 1997 $rawline !~ /^(commit\b|from\b|[\w-]+:).+$/i) { 1998 $in_header_lines = 0; 1999 $in_commit_log = 1; 2000 } 2001 2002# Check if there is UTF-8 in a commit log when a mail header has explicitly 2003# declined it, i.e defined some charset where it is missing. 2004 if ($in_header_lines && 2005 $rawline =~ /^Content-Type:.+charset="(.+)".*$/ && 2006 $1 !~ /utf-8/i) { 2007 $non_utf8_charset = 1; 2008 } 2009 2010 if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ && 2011 $rawline =~ /$NON_ASCII_UTF8/) { 2012 WARN("UTF8_BEFORE_PATCH", 2013 "8-bit UTF-8 used in possible commit log\n" . $herecurr); 2014 } 2015 2016# Check for various typo / spelling mistakes 2017 if (defined($misspellings) && 2018 ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) { 2019 while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) { 2020 my $typo = $1; 2021 my $typo_fix = $spelling_fix{lc($typo)}; 2022 $typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/); 2023 $typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/); 2024 my $msg_type = \&WARN; 2025 $msg_type = \&CHK if ($file); 2026 if (&{$msg_type}("TYPO_SPELLING", 2027 "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) && 2028 $fix) { 2029 $fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/; 2030 } 2031 } 2032 } 2033 2034# ignore non-hunk lines and lines being removed 2035 next if (!$hunk_line || $line =~ /^-/); 2036 2037#trailing whitespace 2038 if ($line =~ /^\+.*\015/) { 2039 my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 2040 if (ERROR("DOS_LINE_ENDINGS", 2041 "DOS line endings\n" . $herevet) && 2042 $fix) { 2043 $fixed[$linenr - 1] =~ s/[\s\015]+$//; 2044 } 2045 } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) { 2046 my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 2047 if (ERROR("TRAILING_WHITESPACE", 2048 "trailing whitespace\n" . $herevet) && 2049 $fix) { 2050 $fixed[$linenr - 1] =~ s/\s+$//; 2051 } 2052 2053 $rpt_cleaners = 1; 2054 } 2055 2056# Check for FSF mailing addresses. 2057 if ($rawline =~ /\bwrite to the Free/i || 2058 $rawline =~ /\b59\s+Temple\s+Pl/i || 2059 $rawline =~ /\b51\s+Franklin\s+St/i) { 2060 my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 2061 my $msg_type = \&ERROR; 2062 $msg_type = \&CHK if ($file); 2063 &{$msg_type}("FSF_MAILING_ADDRESS", 2064 "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) 2065 } 2066 2067# check for Kconfig help text having a real description 2068# Only applies when adding the entry originally, after that we do not have 2069# sufficient context to determine whether it is indeed long enough. 2070 if ($realfile =~ /Kconfig/ && 2071 $line =~ /.\s*config\s+/) { 2072 my $length = 0; 2073 my $cnt = $realcnt; 2074 my $ln = $linenr + 1; 2075 my $f; 2076 my $is_start = 0; 2077 my $is_end = 0; 2078 for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) { 2079 $f = $lines[$ln - 1]; 2080 $cnt-- if ($lines[$ln - 1] !~ /^-/); 2081 $is_end = $lines[$ln - 1] =~ /^\+/; 2082 2083 next if ($f =~ /^-/); 2084 2085 if ($lines[$ln - 1] =~ /.\s*(?:bool|tristate)\s*\"/) { 2086 $is_start = 1; 2087 } elsif ($lines[$ln - 1] =~ /.\s*(?:---)?help(?:---)?$/) { 2088 $length = -1; 2089 } 2090 2091 $f =~ s/^.//; 2092 $f =~ s/#.*//; 2093 $f =~ s/^\s+//; 2094 next if ($f =~ /^$/); 2095 if ($f =~ /^\s*config\s/) { 2096 $is_end = 1; 2097 last; 2098 } 2099 $length++; 2100 } 2101 WARN("CONFIG_DESCRIPTION", 2102 "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4); 2103 #print "is_start<$is_start> is_end<$is_end> length<$length>\n"; 2104 } 2105 2106# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig. 2107 if ($realfile =~ /Kconfig/ && 2108 $line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) { 2109 WARN("CONFIG_EXPERIMENTAL", 2110 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n"); 2111 } 2112 2113 if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) && 2114 ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) { 2115 my $flag = $1; 2116 my $replacement = { 2117 'EXTRA_AFLAGS' => 'asflags-y', 2118 'EXTRA_CFLAGS' => 'ccflags-y', 2119 'EXTRA_CPPFLAGS' => 'cppflags-y', 2120 'EXTRA_LDFLAGS' => 'ldflags-y', 2121 }; 2122 2123 WARN("DEPRECATED_VARIABLE", 2124 "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag}); 2125 } 2126 2127# check for DT compatible documentation 2128 if (defined $root && $realfile =~ /\.dts/ && 2129 $rawline =~ /^\+\s*compatible\s*=/) { 2130 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g; 2131 2132 foreach my $compat (@compats) { 2133 my $compat2 = $compat; 2134 my $dt_path = $root . "/Documentation/devicetree/bindings/"; 2135 $compat2 =~ s/\,[a-z]*\-/\,<\.\*>\-/; 2136 `grep -Erq "$compat|$compat2" $dt_path`; 2137 if ( $? >> 8 ) { 2138 WARN("UNDOCUMENTED_DT_STRING", 2139 "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr); 2140 } 2141 2142 my $vendor = $compat; 2143 my $vendor_path = $dt_path . "vendor-prefixes.txt"; 2144 next if (! -f $vendor_path); 2145 $vendor =~ s/^([a-zA-Z0-9]+)\,.*/$1/; 2146 `grep -Eq "$vendor" $vendor_path`; 2147 if ( $? >> 8 ) { 2148 WARN("UNDOCUMENTED_DT_STRING", 2149 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vendor_path\n" . $herecurr); 2150 } 2151 } 2152 } 2153 2154# check we are in a valid source file if not then ignore this hunk 2155 next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/); 2156 2157#line length limit 2158 if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ && 2159 $rawline !~ /^.\s*\*\s*\@$Ident\s/ && 2160 !($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ || 2161 $line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) && 2162 $length > $max_line_length) 2163 { 2164 WARN("LONG_LINE", 2165 "line over $max_line_length characters\n" . $herecurr); 2166 } 2167 2168# Check for user-visible strings broken across lines, which breaks the ability 2169# to grep for the string. Make exceptions when the previous string ends in a 2170# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{' 2171# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value 2172 if ($line =~ /^\+\s*"/ && 2173 $prevline =~ /"\s*$/ && 2174 $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) { 2175 WARN("SPLIT_STRING", 2176 "quoted string split across lines\n" . $hereprev); 2177 } 2178 2179# check for spaces before a quoted newline 2180 if ($rawline =~ /^.*\".*\s\\n/) { 2181 if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE", 2182 "unnecessary whitespace before a quoted newline\n" . $herecurr) && 2183 $fix) { 2184 $fixed[$linenr - 1] =~ s/^(\+.*\".*)\s+\\n/$1\\n/; 2185 } 2186 2187 } 2188 2189# check for adding lines without a newline. 2190 if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) { 2191 WARN("MISSING_EOF_NEWLINE", 2192 "adding a line without newline at end of file\n" . $herecurr); 2193 } 2194 2195# Blackfin: use hi/lo macros 2196 if ($realfile =~ m@arch/blackfin/.*\.S$@) { 2197 if ($line =~ /\.[lL][[:space:]]*=.*&[[:space:]]*0x[fF][fF][fF][fF]/) { 2198 my $herevet = "$here\n" . cat_vet($line) . "\n"; 2199 ERROR("LO_MACRO", 2200 "use the LO() macro, not (... & 0xFFFF)\n" . $herevet); 2201 } 2202 if ($line =~ /\.[hH][[:space:]]*=.*>>[[:space:]]*16/) { 2203 my $herevet = "$here\n" . cat_vet($line) . "\n"; 2204 ERROR("HI_MACRO", 2205 "use the HI() macro, not (... >> 16)\n" . $herevet); 2206 } 2207 } 2208 2209# check we are in a valid source file C or perl if not then ignore this hunk 2210 next if ($realfile !~ /\.(h|c|pl)$/); 2211 2212# at the beginning of a line any tabs must come first and anything 2213# more than 8 must use tabs. 2214 if ($rawline =~ /^\+\s* \t\s*\S/ || 2215 $rawline =~ /^\+\s* \s*/) { 2216 my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 2217 $rpt_cleaners = 1; 2218 if (ERROR("CODE_INDENT", 2219 "code indent should use tabs where possible\n" . $herevet) && 2220 $fix) { 2221 $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e; 2222 } 2223 } 2224 2225# check for space before tabs. 2226 if ($rawline =~ /^\+/ && $rawline =~ / \t/) { 2227 my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 2228 if (WARN("SPACE_BEFORE_TAB", 2229 "please, no space before tabs\n" . $herevet) && 2230 $fix) { 2231 while ($fixed[$linenr - 1] =~ 2232 s/(^\+.*) {8,8}\t/$1\t\t/) {} 2233 while ($fixed[$linenr - 1] =~ 2234 s/(^\+.*) +\t/$1\t/) {} 2235 } 2236 } 2237 2238# check for && or || at the start of a line 2239 if ($rawline =~ /^\+\s*(&&|\|\|)/) { 2240 CHK("LOGICAL_CONTINUATIONS", 2241 "Logical continuations should be on the previous line\n" . $hereprev); 2242 } 2243 2244# check multi-line statement indentation matches previous line 2245 if ($^V && $^V ge 5.10.0 && 2246 $prevline =~ /^\+(\t*)(if \(|$Ident\().*(\&\&|\|\||,)\s*$/) { 2247 $prevline =~ /^\+(\t*)(.*)$/; 2248 my $oldindent = $1; 2249 my $rest = $2; 2250 2251 my $pos = pos_last_openparen($rest); 2252 if ($pos >= 0) { 2253 $line =~ /^(\+| )([ \t]*)/; 2254 my $newindent = $2; 2255 2256 my $goodtabindent = $oldindent . 2257 "\t" x ($pos / 8) . 2258 " " x ($pos % 8); 2259 my $goodspaceindent = $oldindent . " " x $pos; 2260 2261 if ($newindent ne $goodtabindent && 2262 $newindent ne $goodspaceindent) { 2263 2264 if (CHK("PARENTHESIS_ALIGNMENT", 2265 "Alignment should match open parenthesis\n" . $hereprev) && 2266 $fix && $line =~ /^\+/) { 2267 $fixed[$linenr - 1] =~ 2268 s/^\+[ \t]*/\+$goodtabindent/; 2269 } 2270 } 2271 } 2272 } 2273 2274 if ($line =~ /^\+.*\*[ \t]*\)[ \t]+(?!$Assignment|$Arithmetic)/) { 2275 if (CHK("SPACING", 2276 "No space is necessary after a cast\n" . $hereprev) && 2277 $fix) { 2278 $fixed[$linenr - 1] =~ 2279 s/^(\+.*\*[ \t]*\))[ \t]+/$1/; 2280 } 2281 } 2282 2283 if ($realfile =~ m@^(drivers/net/|net/)@ && 2284 $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ && 2285 $rawline =~ /^\+[ \t]*\*/) { 2286 WARN("NETWORKING_BLOCK_COMMENT_STYLE", 2287 "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev); 2288 } 2289 2290 if ($realfile =~ m@^(drivers/net/|net/)@ && 2291 $prevrawline =~ /^\+[ \t]*\/\*/ && #starting /* 2292 $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */ 2293 $rawline =~ /^\+/ && #line is new 2294 $rawline !~ /^\+[ \t]*\*/) { #no leading * 2295 WARN("NETWORKING_BLOCK_COMMENT_STYLE", 2296 "networking block comments start with * on subsequent lines\n" . $hereprev); 2297 } 2298 2299 if ($realfile =~ m@^(drivers/net/|net/)@ && 2300 $rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */ 2301 $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/ 2302 $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/ 2303 $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */ 2304 WARN("NETWORKING_BLOCK_COMMENT_STYLE", 2305 "networking block comments put the trailing */ on a separate line\n" . $herecurr); 2306 } 2307 2308# check for spaces at the beginning of a line. 2309# Exceptions: 2310# 1) within comments 2311# 2) indented preprocessor commands 2312# 3) hanging labels 2313 if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) { 2314 my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 2315 if (WARN("LEADING_SPACE", 2316 "please, no spaces at the start of a line\n" . $herevet) && 2317 $fix) { 2318 $fixed[$linenr - 1] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e; 2319 } 2320 } 2321 2322# check we are in a valid C source file if not then ignore this hunk 2323 next if ($realfile !~ /\.(h|c)$/); 2324 2325# discourage the addition of CONFIG_EXPERIMENTAL in #if(def). 2326 if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) { 2327 WARN("CONFIG_EXPERIMENTAL", 2328 "Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n"); 2329 } 2330 2331# check for RCS/CVS revision markers 2332 if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) { 2333 WARN("CVS_KEYWORD", 2334 "CVS style keyword markers, these will _not_ be updated\n". $herecurr); 2335 } 2336 2337# Blackfin: don't use __builtin_bfin_[cs]sync 2338 if ($line =~ /__builtin_bfin_csync/) { 2339 my $herevet = "$here\n" . cat_vet($line) . "\n"; 2340 ERROR("CSYNC", 2341 "use the CSYNC() macro in asm/blackfin.h\n" . $herevet); 2342 } 2343 if ($line =~ /__builtin_bfin_ssync/) { 2344 my $herevet = "$here\n" . cat_vet($line) . "\n"; 2345 ERROR("SSYNC", 2346 "use the SSYNC() macro in asm/blackfin.h\n" . $herevet); 2347 } 2348 2349# check for old HOTPLUG __dev<foo> section markings 2350 if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) { 2351 WARN("HOTPLUG_SECTION", 2352 "Using $1 is unnecessary\n" . $herecurr); 2353 } 2354 2355# Check for potential 'bare' types 2356 my ($stat, $cond, $line_nr_next, $remain_next, $off_next, 2357 $realline_next); 2358#print "LINE<$line>\n"; 2359 if ($linenr >= $suppress_statement && 2360 $realcnt && $sline =~ /.\s*\S/) { 2361 ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 2362 ctx_statement_block($linenr, $realcnt, 0); 2363 $stat =~ s/\n./\n /g; 2364 $cond =~ s/\n./\n /g; 2365 2366#print "linenr<$linenr> <$stat>\n"; 2367 # If this statement has no statement boundaries within 2368 # it there is no point in retrying a statement scan 2369 # until we hit end of it. 2370 my $frag = $stat; $frag =~ s/;+\s*$//; 2371 if ($frag !~ /(?:{|;)/) { 2372#print "skip<$line_nr_next>\n"; 2373 $suppress_statement = $line_nr_next; 2374 } 2375 2376 # Find the real next line. 2377 $realline_next = $line_nr_next; 2378 if (defined $realline_next && 2379 (!defined $lines[$realline_next - 1] || 2380 substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) { 2381 $realline_next++; 2382 } 2383 2384 my $s = $stat; 2385 $s =~ s/{.*$//s; 2386 2387 # Ignore goto labels. 2388 if ($s =~ /$Ident:\*$/s) { 2389 2390 # Ignore functions being called 2391 } elsif ($s =~ /^.\s*$Ident\s*\(/s) { 2392 2393 } elsif ($s =~ /^.\s*else\b/s) { 2394 2395 # declarations always start with types 2396 } 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) { 2397 my $type = $1; 2398 $type =~ s/\s+/ /g; 2399 possible($type, "A:" . $s); 2400 2401 # definitions in global scope can only start with types 2402 } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) { 2403 possible($1, "B:" . $s); 2404 } 2405 2406 # any (foo ... *) is a pointer cast, and foo is a type 2407 while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) { 2408 possible($1, "C:" . $s); 2409 } 2410 2411 # Check for any sort of function declaration. 2412 # int foo(something bar, other baz); 2413 # void (*store_gdt)(x86_descr_ptr *); 2414 if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) { 2415 my ($name_len) = length($1); 2416 2417 my $ctx = $s; 2418 substr($ctx, 0, $name_len + 1, ''); 2419 $ctx =~ s/\)[^\)]*$//; 2420 2421 for my $arg (split(/\s*,\s*/, $ctx)) { 2422 if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) { 2423 2424 possible($1, "D:" . $s); 2425 } 2426 } 2427 } 2428 2429 } 2430 2431# 2432# Checks which may be anchored in the context. 2433# 2434 2435# Check for switch () and associated case and default 2436# statements should be at the same indent. 2437 if ($line=~/\bswitch\s*\(.*\)/) { 2438 my $err = ''; 2439 my $sep = ''; 2440 my @ctx = ctx_block_outer($linenr, $realcnt); 2441 shift(@ctx); 2442 for my $ctx (@ctx) { 2443 my ($clen, $cindent) = line_stats($ctx); 2444 if ($ctx =~ /^\+\s*(case\s+|default:)/ && 2445 $indent != $cindent) { 2446 $err .= "$sep$ctx\n"; 2447 $sep = ''; 2448 } else { 2449 $sep = "[...]\n"; 2450 } 2451 } 2452 if ($err ne '') { 2453 ERROR("SWITCH_CASE_INDENT_LEVEL", 2454 "switch and case should be at the same indent\n$hereline$err"); 2455 } 2456 } 2457 2458# if/while/etc brace do not go on next line, unless defining a do while loop, 2459# or if that brace on the next line is for something else 2460 if ($line =~ /(.*)\b((?:if|while|for|switch)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) { 2461 my $pre_ctx = "$1$2"; 2462 2463 my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); 2464 2465 if ($line =~ /^\+\t{6,}/) { 2466 WARN("DEEP_INDENTATION", 2467 "Too many leading tabs - consider code refactoring\n" . $herecurr); 2468 } 2469 2470 my $ctx_cnt = $realcnt - $#ctx - 1; 2471 my $ctx = join("\n", @ctx); 2472 2473 my $ctx_ln = $linenr; 2474 my $ctx_skip = $realcnt; 2475 2476 while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt && 2477 defined $lines[$ctx_ln - 1] && 2478 $lines[$ctx_ln - 1] =~ /^-/)) { 2479 ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n"; 2480 $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/); 2481 $ctx_ln++; 2482 } 2483 2484 #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n"; 2485 #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n"; 2486 2487 if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln -1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) { 2488 ERROR("OPEN_BRACE", 2489 "that open brace { should be on the previous line\n" . 2490 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); 2491 } 2492 if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ && 2493 $ctx =~ /\)\s*\;\s*$/ && 2494 defined $lines[$ctx_ln - 1]) 2495 { 2496 my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]); 2497 if ($nindent > $indent) { 2498 WARN("TRAILING_SEMICOLON", 2499 "trailing semicolon indicates no statements, indent implies otherwise\n" . 2500 "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); 2501 } 2502 } 2503 } 2504 2505# Check relative indent for conditionals and blocks. 2506 if ($line =~ /\b(?:(?:if|while|for)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) { 2507 ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 2508 ctx_statement_block($linenr, $realcnt, 0) 2509 if (!defined $stat); 2510 my ($s, $c) = ($stat, $cond); 2511 2512 substr($s, 0, length($c), ''); 2513 2514 # Make sure we remove the line prefixes as we have 2515 # none on the first line, and are going to readd them 2516 # where necessary. 2517 $s =~ s/\n./\n/gs; 2518 2519 # Find out how long the conditional actually is. 2520 my @newlines = ($c =~ /\n/gs); 2521 my $cond_lines = 1 + $#newlines; 2522 2523 # We want to check the first line inside the block 2524 # starting at the end of the conditional, so remove: 2525 # 1) any blank line termination 2526 # 2) any opening brace { on end of the line 2527 # 3) any do (...) { 2528 my $continuation = 0; 2529 my $check = 0; 2530 $s =~ s/^.*\bdo\b//; 2531 $s =~ s/^\s*{//; 2532 if ($s =~ s/^\s*\\//) { 2533 $continuation = 1; 2534 } 2535 if ($s =~ s/^\s*?\n//) { 2536 $check = 1; 2537 $cond_lines++; 2538 } 2539 2540 # Also ignore a loop construct at the end of a 2541 # preprocessor statement. 2542 if (($prevline =~ /^.\s*#\s*define\s/ || 2543 $prevline =~ /\\\s*$/) && $continuation == 0) { 2544 $check = 0; 2545 } 2546 2547 my $cond_ptr = -1; 2548 $continuation = 0; 2549 while ($cond_ptr != $cond_lines) { 2550 $cond_ptr = $cond_lines; 2551 2552 # If we see an #else/#elif then the code 2553 # is not linear. 2554 if ($s =~ /^\s*\#\s*(?:else|elif)/) { 2555 $check = 0; 2556 } 2557 2558 # Ignore: 2559 # 1) blank lines, they should be at 0, 2560 # 2) preprocessor lines, and 2561 # 3) labels. 2562 if ($continuation || 2563 $s =~ /^\s*?\n/ || 2564 $s =~ /^\s*#\s*?/ || 2565 $s =~ /^\s*$Ident\s*:/) { 2566 $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0; 2567 if ($s =~ s/^.*?\n//) { 2568 $cond_lines++; 2569 } 2570 } 2571 } 2572 2573 my (undef, $sindent) = line_stats("+" . $s); 2574 my $stat_real = raw_line($linenr, $cond_lines); 2575 2576 # Check if either of these lines are modified, else 2577 # this is not this patch's fault. 2578 if (!defined($stat_real) || 2579 $stat !~ /^\+/ && $stat_real !~ /^\+/) { 2580 $check = 0; 2581 } 2582 if (defined($stat_real) && $cond_lines > 1) { 2583 $stat_real = "[...]\n$stat_real"; 2584 } 2585 2586 #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"; 2587 2588 if ($check && (($sindent % 8) != 0 || 2589 ($sindent <= $indent && $s ne ''))) { 2590 WARN("SUSPECT_CODE_INDENT", 2591 "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n"); 2592 } 2593 } 2594 2595 # Track the 'values' across context and added lines. 2596 my $opline = $line; $opline =~ s/^./ /; 2597 my ($curr_values, $curr_vars) = 2598 annotate_values($opline . "\n", $prev_values); 2599 $curr_values = $prev_values . $curr_values; 2600 if ($dbg_values) { 2601 my $outline = $opline; $outline =~ s/\t/ /g; 2602 print "$linenr > .$outline\n"; 2603 print "$linenr > $curr_values\n"; 2604 print "$linenr > $curr_vars\n"; 2605 } 2606 $prev_values = substr($curr_values, -1); 2607 2608#ignore lines not being added 2609 next if ($line =~ /^[^\+]/); 2610 2611# TEST: allow direct testing of the type matcher. 2612 if ($dbg_type) { 2613 if ($line =~ /^.\s*$Declare\s*$/) { 2614 ERROR("TEST_TYPE", 2615 "TEST: is type\n" . $herecurr); 2616 } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) { 2617 ERROR("TEST_NOT_TYPE", 2618 "TEST: is not type ($1 is)\n". $herecurr); 2619 } 2620 next; 2621 } 2622# TEST: allow direct testing of the attribute matcher. 2623 if ($dbg_attr) { 2624 if ($line =~ /^.\s*$Modifier\s*$/) { 2625 ERROR("TEST_ATTR", 2626 "TEST: is attr\n" . $herecurr); 2627 } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) { 2628 ERROR("TEST_NOT_ATTR", 2629 "TEST: is not attr ($1 is)\n". $herecurr); 2630 } 2631 next; 2632 } 2633 2634# check for initialisation to aggregates open brace on the next line 2635 if ($line =~ /^.\s*{/ && 2636 $prevline =~ /(?:^|[^=])=\s*$/) { 2637 ERROR("OPEN_BRACE", 2638 "that open brace { should be on the previous line\n" . $hereprev); 2639 } 2640 2641# 2642# Checks which are anchored on the added line. 2643# 2644 2645# check for malformed paths in #include statements (uses RAW line) 2646 if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) { 2647 my $path = $1; 2648 if ($path =~ m{//}) { 2649 ERROR("MALFORMED_INCLUDE", 2650 "malformed #include filename\n" . $herecurr); 2651 } 2652 if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) { 2653 ERROR("UAPI_INCLUDE", 2654 "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr); 2655 } 2656 } 2657 2658# no C99 // comments 2659 if ($line =~ m{//}) { 2660 if (ERROR("C99_COMMENTS", 2661 "do not use C99 // comments\n" . $herecurr) && 2662 $fix) { 2663 my $line = $fixed[$linenr - 1]; 2664 if ($line =~ /\/\/(.*)$/) { 2665 my $comment = trim($1); 2666 $fixed[$linenr - 1] =~ s@\/\/(.*)$@/\* $comment \*/@; 2667 } 2668 } 2669 } 2670 # Remove C99 comments. 2671 $line =~ s@//.*@@; 2672 $opline =~ s@//.*@@; 2673 2674# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider 2675# the whole statement. 2676#print "APW <$lines[$realline_next - 1]>\n"; 2677 if (defined $realline_next && 2678 exists $lines[$realline_next - 1] && 2679 !defined $suppress_export{$realline_next} && 2680 ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ || 2681 $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { 2682 # Handle definitions which produce identifiers with 2683 # a prefix: 2684 # XXX(foo); 2685 # EXPORT_SYMBOL(something_foo); 2686 my $name = $1; 2687 if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ && 2688 $name =~ /^${Ident}_$2/) { 2689#print "FOO C name<$name>\n"; 2690 $suppress_export{$realline_next} = 1; 2691 2692 } elsif ($stat !~ /(?: 2693 \n.}\s*$| 2694 ^.DEFINE_$Ident\(\Q$name\E\)| 2695 ^.DECLARE_$Ident\(\Q$name\E\)| 2696 ^.LIST_HEAD\(\Q$name\E\)| 2697 ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(| 2698 \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\() 2699 )/x) { 2700#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n"; 2701 $suppress_export{$realline_next} = 2; 2702 } else { 2703 $suppress_export{$realline_next} = 1; 2704 } 2705 } 2706 if (!defined $suppress_export{$linenr} && 2707 $prevline =~ /^.\s*$/ && 2708 ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ || 2709 $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { 2710#print "FOO B <$lines[$linenr - 1]>\n"; 2711 $suppress_export{$linenr} = 2; 2712 } 2713 if (defined $suppress_export{$linenr} && 2714 $suppress_export{$linenr} == 2) { 2715 WARN("EXPORT_SYMBOL", 2716 "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); 2717 } 2718 2719# check for global initialisers. 2720 if ($line =~ /^\+(\s*$Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/) { 2721 if (ERROR("GLOBAL_INITIALISERS", 2722 "do not initialise globals to 0 or NULL\n" . 2723 $herecurr) && 2724 $fix) { 2725 $fixed[$linenr - 1] =~ s/($Type\s*$Ident\s*(?:\s+$Modifier))*\s*=\s*(0|NULL|false)\s*;/$1;/; 2726 } 2727 } 2728# check for static initialisers. 2729 if ($line =~ /^\+.*\bstatic\s.*=\s*(0|NULL|false)\s*;/) { 2730 if (ERROR("INITIALISED_STATIC", 2731 "do not initialise statics to 0 or NULL\n" . 2732 $herecurr) && 2733 $fix) { 2734 $fixed[$linenr - 1] =~ s/(\bstatic\s.*?)\s*=\s*(0|NULL|false)\s*;/$1;/; 2735 } 2736 } 2737 2738# check for static const char * arrays. 2739 if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) { 2740 WARN("STATIC_CONST_CHAR_ARRAY", 2741 "static const char * array should probably be static const char * const\n" . 2742 $herecurr); 2743 } 2744 2745# check for static char foo[] = "bar" declarations. 2746 if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) { 2747 WARN("STATIC_CONST_CHAR_ARRAY", 2748 "static char array declaration should probably be static const char\n" . 2749 $herecurr); 2750 } 2751 2752# check for function declarations without arguments like "int foo()" 2753 if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) { 2754 if (ERROR("FUNCTION_WITHOUT_ARGS", 2755 "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) && 2756 $fix) { 2757 $fixed[$linenr - 1] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/; 2758 } 2759 } 2760 2761# check for uses of DEFINE_PCI_DEVICE_TABLE 2762 if ($line =~ /\bDEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=/) { 2763 if (WARN("DEFINE_PCI_DEVICE_TABLE", 2764 "Prefer struct pci_device_id over deprecated DEFINE_PCI_DEVICE_TABLE\n" . $herecurr) && 2765 $fix) { 2766 $fixed[$linenr - 1] =~ s/\b(?:static\s+|)DEFINE_PCI_DEVICE_TABLE\s*\(\s*(\w+)\s*\)\s*=\s*/static const struct pci_device_id $1\[\] = /; 2767 } 2768 } 2769 2770# check for new typedefs, only function parameters and sparse annotations 2771# make sense. 2772 if ($line =~ /\btypedef\s/ && 2773 $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ && 2774 $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ && 2775 $line !~ /\b$typeTypedefs\b/ && 2776 $line !~ /\b__bitwise(?:__|)\b/) { 2777 WARN("NEW_TYPEDEFS", 2778 "do not add new typedefs\n" . $herecurr); 2779 } 2780 2781# * goes on variable not on type 2782 # (char*[ const]) 2783 while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) { 2784 #print "AA<$1>\n"; 2785 my ($ident, $from, $to) = ($1, $2, $2); 2786 2787 # Should start with a space. 2788 $to =~ s/^(\S)/ $1/; 2789 # Should not end with a space. 2790 $to =~ s/\s+$//; 2791 # '*'s should not have spaces between. 2792 while ($to =~ s/\*\s+\*/\*\*/) { 2793 } 2794 2795## print "1: from<$from> to<$to> ident<$ident>\n"; 2796 if ($from ne $to) { 2797 if (ERROR("POINTER_LOCATION", 2798 "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) && 2799 $fix) { 2800 my $sub_from = $ident; 2801 my $sub_to = $ident; 2802 $sub_to =~ s/\Q$from\E/$to/; 2803 $fixed[$linenr - 1] =~ 2804 s@\Q$sub_from\E@$sub_to@; 2805 } 2806 } 2807 } 2808 while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) { 2809 #print "BB<$1>\n"; 2810 my ($match, $from, $to, $ident) = ($1, $2, $2, $3); 2811 2812 # Should start with a space. 2813 $to =~ s/^(\S)/ $1/; 2814 # Should not end with a space. 2815 $to =~ s/\s+$//; 2816 # '*'s should not have spaces between. 2817 while ($to =~ s/\*\s+\*/\*\*/) { 2818 } 2819 # Modifiers should have spaces. 2820 $to =~ s/(\b$Modifier$)/$1 /; 2821 2822## print "2: from<$from> to<$to> ident<$ident>\n"; 2823 if ($from ne $to && $ident !~ /^$Modifier$/) { 2824 if (ERROR("POINTER_LOCATION", 2825 "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) && 2826 $fix) { 2827 2828 my $sub_from = $match; 2829 my $sub_to = $match; 2830 $sub_to =~ s/\Q$from\E/$to/; 2831 $fixed[$linenr - 1] =~ 2832 s@\Q$sub_from\E@$sub_to@; 2833 } 2834 } 2835 } 2836 2837# # no BUG() or BUG_ON() 2838# if ($line =~ /\b(BUG|BUG_ON)\b/) { 2839# print "Try to use WARN_ON & Recovery code rather than BUG() or BUG_ON()\n"; 2840# print "$herecurr"; 2841# $clean = 0; 2842# } 2843 2844 if ($line =~ /\bLINUX_VERSION_CODE\b/) { 2845 WARN("LINUX_VERSION_CODE", 2846 "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr); 2847 } 2848 2849# check for uses of printk_ratelimit 2850 if ($line =~ /\bprintk_ratelimit\s*\(/) { 2851 WARN("PRINTK_RATELIMITED", 2852"Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr); 2853 } 2854 2855# printk should use KERN_* levels. Note that follow on printk's on the 2856# same line do not need a level, so we use the current block context 2857# to try and find and validate the current printk. In summary the current 2858# printk includes all preceding printk's which have no newline on the end. 2859# we assume the first bad printk is the one to report. 2860 if ($line =~ /\bprintk\((?!KERN_)\s*"/) { 2861 my $ok = 0; 2862 for (my $ln = $linenr - 1; $ln >= $first_line; $ln--) { 2863 #print "CHECK<$lines[$ln - 1]\n"; 2864 # we have a preceding printk if it ends 2865 # with "\n" ignore it, else it is to blame 2866 if ($lines[$ln - 1] =~ m{\bprintk\(}) { 2867 if ($rawlines[$ln - 1] !~ m{\\n"}) { 2868 $ok = 1; 2869 } 2870 last; 2871 } 2872 } 2873 if ($ok == 0) { 2874 WARN("PRINTK_WITHOUT_KERN_LEVEL", 2875 "printk() should include KERN_ facility level\n" . $herecurr); 2876 } 2877 } 2878 2879 if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) { 2880 my $orig = $1; 2881 my $level = lc($orig); 2882 $level = "warn" if ($level eq "warning"); 2883 my $level2 = $level; 2884 $level2 = "dbg" if ($level eq "debug"); 2885 WARN("PREFER_PR_LEVEL", 2886 "Prefer netdev_$level2(netdev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr); 2887 } 2888 2889 if ($line =~ /\bpr_warning\s*\(/) { 2890 if (WARN("PREFER_PR_LEVEL", 2891 "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) && 2892 $fix) { 2893 $fixed[$linenr - 1] =~ 2894 s/\bpr_warning\b/pr_warn/; 2895 } 2896 } 2897 2898 if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) { 2899 my $orig = $1; 2900 my $level = lc($orig); 2901 $level = "warn" if ($level eq "warning"); 2902 $level = "dbg" if ($level eq "debug"); 2903 WARN("PREFER_DEV_LEVEL", 2904 "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr); 2905 } 2906 2907# function brace can't be on same line, except for #defines of do while, 2908# or if closed on same line 2909 if (($line=~/$Type\s*$Ident\(.*\).*\s\{/) and 2910 !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) { 2911 ERROR("OPEN_BRACE", 2912 "open brace '{' following function declarations go on the next line\n" . $herecurr); 2913 } 2914 2915# open braces for enum, union and struct go on the same line. 2916 if ($line =~ /^.\s*{/ && 2917 $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) { 2918 ERROR("OPEN_BRACE", 2919 "open brace '{' following $1 go on the same line\n" . $hereprev); 2920 } 2921 2922# missing space after union, struct or enum definition 2923 if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) { 2924 if (WARN("SPACING", 2925 "missing space after $1 definition\n" . $herecurr) && 2926 $fix) { 2927 $fixed[$linenr - 1] =~ 2928 s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/; 2929 } 2930 } 2931 2932# Function pointer declarations 2933# check spacing between type, funcptr, and args 2934# canonical declaration is "type (*funcptr)(args...)" 2935# 2936# the $Declare variable will capture all spaces after the type 2937# so check it for trailing missing spaces or multiple spaces 2938 if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)$Ident(\s*)\)(\s*)\(/) { 2939 my $declare = $1; 2940 my $pre_pointer_space = $2; 2941 my $post_pointer_space = $3; 2942 my $funcname = $4; 2943 my $post_funcname_space = $5; 2944 my $pre_args_space = $6; 2945 2946 if ($declare !~ /\s$/) { 2947 WARN("SPACING", 2948 "missing space after return type\n" . $herecurr); 2949 } 2950 2951# unnecessary space "type (*funcptr)(args...)" 2952 elsif ($declare =~ /\s{2,}$/) { 2953 WARN("SPACING", 2954 "Multiple spaces after return type\n" . $herecurr); 2955 } 2956 2957# unnecessary space "type ( *funcptr)(args...)" 2958 if (defined $pre_pointer_space && 2959 $pre_pointer_space =~ /^\s/) { 2960 WARN("SPACING", 2961 "Unnecessary space after function pointer open parenthesis\n" . $herecurr); 2962 } 2963 2964# unnecessary space "type (* funcptr)(args...)" 2965 if (defined $post_pointer_space && 2966 $post_pointer_space =~ /^\s/) { 2967 WARN("SPACING", 2968 "Unnecessary space before function pointer name\n" . $herecurr); 2969 } 2970 2971# unnecessary space "type (*funcptr )(args...)" 2972 if (defined $post_funcname_space && 2973 $post_funcname_space =~ /^\s/) { 2974 WARN("SPACING", 2975 "Unnecessary space after function pointer name\n" . $herecurr); 2976 } 2977 2978# unnecessary space "type (*funcptr) (args...)" 2979 if (defined $pre_args_space && 2980 $pre_args_space =~ /^\s/) { 2981 WARN("SPACING", 2982 "Unnecessary space before function pointer arguments\n" . $herecurr); 2983 } 2984 2985 if (show_type("SPACING") && $fix) { 2986 $fixed[$linenr - 1] =~ 2987 s/^(.\s*$Declare)\(\s*\*\s*($Ident)\s*\)\s*\(/rtrim($1) . " " . "\(\*$2\)\("/ex; 2988 } 2989 } 2990 2991# check for spacing round square brackets; allowed: 2992# 1. with a type on the left -- int [] a; 2993# 2. at the beginning of a line for slice initialisers -- [0...10] = 5, 2994# 3. inside a curly brace -- = { [0...10] = 5 } 2995 while ($line =~ /(.*?\s)\[/g) { 2996 my ($where, $prefix) = ($-[1], $1); 2997 if ($prefix !~ /$Type\s+$/ && 2998 ($where != 0 || $prefix !~ /^.\s+$/) && 2999 $prefix !~ /[{,]\s+$/) { 3000 if (ERROR("BRACKET_SPACE", 3001 "space prohibited before open square bracket '['\n" . $herecurr) && 3002 $fix) { 3003 $fixed[$linenr - 1] =~ 3004 s/^(\+.*?)\s+\[/$1\[/; 3005 } 3006 } 3007 } 3008 3009# check for spaces between functions and their parentheses. 3010 while ($line =~ /($Ident)\s+\(/g) { 3011 my $name = $1; 3012 my $ctx_before = substr($line, 0, $-[1]); 3013 my $ctx = "$ctx_before$name"; 3014 3015 # Ignore those directives where spaces _are_ permitted. 3016 if ($name =~ /^(?: 3017 if|for|while|switch|return|case| 3018 volatile|__volatile__| 3019 __attribute__|format|__extension__| 3020 asm|__asm__)$/x) 3021 { 3022 # cpp #define statements have non-optional spaces, ie 3023 # if there is a space between the name and the open 3024 # parenthesis it is simply not a parameter group. 3025 } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) { 3026 3027 # cpp #elif statement condition may start with a ( 3028 } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) { 3029 3030 # If this whole things ends with a type its most 3031 # likely a typedef for a function. 3032 } elsif ($ctx =~ /$Type$/) { 3033 3034 } else { 3035 if (WARN("SPACING", 3036 "space prohibited between function name and open parenthesis '('\n" . $herecurr) && 3037 $fix) { 3038 $fixed[$linenr - 1] =~ 3039 s/\b$name\s+\(/$name\(/; 3040 } 3041 } 3042 } 3043 3044# Check operator spacing. 3045 if (!($line=~/\#\s*include/)) { 3046 my $fixed_line = ""; 3047 my $line_fixed = 0; 3048 3049 my $ops = qr{ 3050 <<=|>>=|<=|>=|==|!=| 3051 \+=|-=|\*=|\/=|%=|\^=|\|=|&=| 3052 =>|->|<<|>>|<|>|=|!|~| 3053 &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%| 3054 \?:|\?|: 3055 }x; 3056 my @elements = split(/($ops|;)/, $opline); 3057 3058## print("element count: <" . $#elements . ">\n"); 3059## foreach my $el (@elements) { 3060## print("el: <$el>\n"); 3061## } 3062 3063 my @fix_elements = (); 3064 my $off = 0; 3065 3066 foreach my $el (@elements) { 3067 push(@fix_elements, substr($rawline, $off, length($el))); 3068 $off += length($el); 3069 } 3070 3071 $off = 0; 3072 3073 my $blank = copy_spacing($opline); 3074 my $last_after = -1; 3075 3076 for (my $n = 0; $n < $#elements; $n += 2) { 3077 3078 my $good = $fix_elements[$n] . $fix_elements[$n + 1]; 3079 3080## print("n: <$n> good: <$good>\n"); 3081 3082 $off += length($elements[$n]); 3083 3084 # Pick up the preceding and succeeding characters. 3085 my $ca = substr($opline, 0, $off); 3086 my $cc = ''; 3087 if (length($opline) >= ($off + length($elements[$n + 1]))) { 3088 $cc = substr($opline, $off + length($elements[$n + 1])); 3089 } 3090 my $cb = "$ca$;$cc"; 3091 3092 my $a = ''; 3093 $a = 'V' if ($elements[$n] ne ''); 3094 $a = 'W' if ($elements[$n] =~ /\s$/); 3095 $a = 'C' if ($elements[$n] =~ /$;$/); 3096 $a = 'B' if ($elements[$n] =~ /(\[|\()$/); 3097 $a = 'O' if ($elements[$n] eq ''); 3098 $a = 'E' if ($ca =~ /^\s*$/); 3099 3100 my $op = $elements[$n + 1]; 3101 3102 my $c = ''; 3103 if (defined $elements[$n + 2]) { 3104 $c = 'V' if ($elements[$n + 2] ne ''); 3105 $c = 'W' if ($elements[$n + 2] =~ /^\s/); 3106 $c = 'C' if ($elements[$n + 2] =~ /^$;/); 3107 $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/); 3108 $c = 'O' if ($elements[$n + 2] eq ''); 3109 $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/); 3110 } else { 3111 $c = 'E'; 3112 } 3113 3114 my $ctx = "${a}x${c}"; 3115 3116 my $at = "(ctx:$ctx)"; 3117 3118 my $ptr = substr($blank, 0, $off) . "^"; 3119 my $hereptr = "$hereline$ptr\n"; 3120 3121 # Pull out the value of this operator. 3122 my $op_type = substr($curr_values, $off + 1, 1); 3123 3124 # Get the full operator variant. 3125 my $opv = $op . substr($curr_vars, $off, 1); 3126 3127 # Ignore operators passed as parameters. 3128 if ($op_type ne 'V' && 3129 $ca =~ /\s$/ && $cc =~ /^\s*,/) { 3130 3131# # Ignore comments 3132# } elsif ($op =~ /^$;+$/) { 3133 3134 # ; should have either the end of line or a space or \ after it 3135 } elsif ($op eq ';') { 3136 if ($ctx !~ /.x[WEBC]/ && 3137 $cc !~ /^\\/ && $cc !~ /^;/) { 3138 if (ERROR("SPACING", 3139 "space required after that '$op' $at\n" . $hereptr)) { 3140 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; 3141 $line_fixed = 1; 3142 } 3143 } 3144 3145 # // is a comment 3146 } elsif ($op eq '//') { 3147 3148 # No spaces for: 3149 # -> 3150 # : when part of a bitfield 3151 } elsif ($op eq '->' || $opv eq ':B') { 3152 if ($ctx =~ /Wx.|.xW/) { 3153 if (ERROR("SPACING", 3154 "spaces prohibited around that '$op' $at\n" . $hereptr)) { 3155 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); 3156 if (defined $fix_elements[$n + 2]) { 3157 $fix_elements[$n + 2] =~ s/^\s+//; 3158 } 3159 $line_fixed = 1; 3160 } 3161 } 3162 3163 # , must have a space on the right. 3164 } elsif ($op eq ',') { 3165 if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) { 3166 if (ERROR("SPACING", 3167 "space required after that '$op' $at\n" . $hereptr)) { 3168 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; 3169 $line_fixed = 1; 3170 $last_after = $n; 3171 } 3172 } 3173 3174 # '*' as part of a type definition -- reported already. 3175 } elsif ($opv eq '*_') { 3176 #warn "'*' is part of type\n"; 3177 3178 # unary operators should have a space before and 3179 # none after. May be left adjacent to another 3180 # unary operator, or a cast 3181 } elsif ($op eq '!' || $op eq '~' || 3182 $opv eq '*U' || $opv eq '-U' || 3183 $opv eq '&U' || $opv eq '&&U') { 3184 if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { 3185 if (ERROR("SPACING", 3186 "space required before that '$op' $at\n" . $hereptr)) { 3187 if ($n != $last_after + 2) { 3188 $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]); 3189 $line_fixed = 1; 3190 } 3191 } 3192 } 3193 if ($op eq '*' && $cc =~/\s*$Modifier\b/) { 3194 # A unary '*' may be const 3195 3196 } elsif ($ctx =~ /.xW/) { 3197 if (ERROR("SPACING", 3198 "space prohibited after that '$op' $at\n" . $hereptr)) { 3199 $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]); 3200 if (defined $fix_elements[$n + 2]) { 3201 $fix_elements[$n + 2] =~ s/^\s+//; 3202 } 3203 $line_fixed = 1; 3204 } 3205 } 3206 3207 # unary ++ and unary -- are allowed no space on one side. 3208 } elsif ($op eq '++' or $op eq '--') { 3209 if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) { 3210 if (ERROR("SPACING", 3211 "space required one side of that '$op' $at\n" . $hereptr)) { 3212 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; 3213 $line_fixed = 1; 3214 } 3215 } 3216 if ($ctx =~ /Wx[BE]/ || 3217 ($ctx =~ /Wx./ && $cc =~ /^;/)) { 3218 if (ERROR("SPACING", 3219 "space prohibited before that '$op' $at\n" . $hereptr)) { 3220 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); 3221 $line_fixed = 1; 3222 } 3223 } 3224 if ($ctx =~ /ExW/) { 3225 if (ERROR("SPACING", 3226 "space prohibited after that '$op' $at\n" . $hereptr)) { 3227 $good = $fix_elements[$n] . trim($fix_elements[$n + 1]); 3228 if (defined $fix_elements[$n + 2]) { 3229 $fix_elements[$n + 2] =~ s/^\s+//; 3230 } 3231 $line_fixed = 1; 3232 } 3233 } 3234 3235 # << and >> may either have or not have spaces both sides 3236 } elsif ($op eq '<<' or $op eq '>>' or 3237 $op eq '&' or $op eq '^' or $op eq '|' or 3238 $op eq '+' or $op eq '-' or 3239 $op eq '*' or $op eq '/' or 3240 $op eq '%') 3241 { 3242 if ($ctx =~ /Wx[^WCE]|[^WCE]xW/) { 3243 if (ERROR("SPACING", 3244 "need consistent spacing around '$op' $at\n" . $hereptr)) { 3245 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; 3246 if (defined $fix_elements[$n + 2]) { 3247 $fix_elements[$n + 2] =~ s/^\s+//; 3248 } 3249 $line_fixed = 1; 3250 } 3251 } 3252 3253 # A colon needs no spaces before when it is 3254 # terminating a case value or a label. 3255 } elsif ($opv eq ':C' || $opv eq ':L') { 3256 if ($ctx =~ /Wx./) { 3257 if (ERROR("SPACING", 3258 "space prohibited before that '$op' $at\n" . $hereptr)) { 3259 $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); 3260 $line_fixed = 1; 3261 } 3262 } 3263 3264 # All the others need spaces both sides. 3265 } elsif ($ctx !~ /[EWC]x[CWE]/) { 3266 my $ok = 0; 3267 3268 # Ignore email addresses <foo@bar> 3269 if (($op eq '<' && 3270 $cc =~ /^\S+\@\S+>/) || 3271 ($op eq '>' && 3272 $ca =~ /<\S+\@\S+$/)) 3273 { 3274 $ok = 1; 3275 } 3276 3277 # messages are ERROR, but ?: are CHK 3278 if ($ok == 0) { 3279 my $msg_type = \&ERROR; 3280 $msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/); 3281 3282 if (&{$msg_type}("SPACING", 3283 "spaces required around that '$op' $at\n" . $hereptr)) { 3284 $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; 3285 if (defined $fix_elements[$n + 2]) { 3286 $fix_elements[$n + 2] =~ s/^\s+//; 3287 } 3288 $line_fixed = 1; 3289 } 3290 } 3291 } 3292 $off += length($elements[$n + 1]); 3293 3294## print("n: <$n> GOOD: <$good>\n"); 3295 3296 $fixed_line = $fixed_line . $good; 3297 } 3298 3299 if (($#elements % 2) == 0) { 3300 $fixed_line = $fixed_line . $fix_elements[$#elements]; 3301 } 3302 3303 if ($fix && $line_fixed && $fixed_line ne $fixed[$linenr - 1]) { 3304 $fixed[$linenr - 1] = $fixed_line; 3305 } 3306 3307 3308 } 3309 3310# check for whitespace before a non-naked semicolon 3311 if ($line =~ /^\+.*\S\s+;\s*$/) { 3312 if (WARN("SPACING", 3313 "space prohibited before semicolon\n" . $herecurr) && 3314 $fix) { 3315 1 while $fixed[$linenr - 1] =~ 3316 s/^(\+.*\S)\s+;/$1;/; 3317 } 3318 } 3319 3320# check for multiple assignments 3321 if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) { 3322 CHK("MULTIPLE_ASSIGNMENTS", 3323 "multiple assignments should be avoided\n" . $herecurr); 3324 } 3325 3326## # check for multiple declarations, allowing for a function declaration 3327## # continuation. 3328## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ && 3329## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) { 3330## 3331## # Remove any bracketed sections to ensure we do not 3332## # falsly report the parameters of functions. 3333## my $ln = $line; 3334## while ($ln =~ s/\([^\(\)]*\)//g) { 3335## } 3336## if ($ln =~ /,/) { 3337## WARN("MULTIPLE_DECLARATION", 3338## "declaring multiple variables together should be avoided\n" . $herecurr); 3339## } 3340## } 3341 3342#need space before brace following if, while, etc 3343 if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\){/) || 3344 $line =~ /do\{/) { 3345 if (ERROR("SPACING", 3346 "space required before the open brace '{'\n" . $herecurr) && 3347 $fix) { 3348 $fixed[$linenr - 1] =~ s/^(\+.*(?:do|\))){/$1 {/; 3349 } 3350 } 3351 3352## # check for blank lines before declarations 3353## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ && 3354## $prevrawline =~ /^.\s*$/) { 3355## WARN("SPACING", 3356## "No blank lines before declarations\n" . $hereprev); 3357## } 3358## 3359 3360# closing brace should have a space following it when it has anything 3361# on the line 3362 if ($line =~ /}(?!(?:,|;|\)))\S/) { 3363 if (ERROR("SPACING", 3364 "space required after that close brace '}'\n" . $herecurr) && 3365 $fix) { 3366 $fixed[$linenr - 1] =~ 3367 s/}((?!(?:,|;|\)))\S)/} $1/; 3368 } 3369 } 3370 3371# check spacing on square brackets 3372 if ($line =~ /\[\s/ && $line !~ /\[\s*$/) { 3373 if (ERROR("SPACING", 3374 "space prohibited after that open square bracket '['\n" . $herecurr) && 3375 $fix) { 3376 $fixed[$linenr - 1] =~ 3377 s/\[\s+/\[/; 3378 } 3379 } 3380 if ($line =~ /\s\]/) { 3381 if (ERROR("SPACING", 3382 "space prohibited before that close square bracket ']'\n" . $herecurr) && 3383 $fix) { 3384 $fixed[$linenr - 1] =~ 3385 s/\s+\]/\]/; 3386 } 3387 } 3388 3389# check spacing on parentheses 3390 if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ && 3391 $line !~ /for\s*\(\s+;/) { 3392 if (ERROR("SPACING", 3393 "space prohibited after that open parenthesis '('\n" . $herecurr) && 3394 $fix) { 3395 $fixed[$linenr - 1] =~ 3396 s/\(\s+/\(/; 3397 } 3398 } 3399 if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ && 3400 $line !~ /for\s*\(.*;\s+\)/ && 3401 $line !~ /:\s+\)/) { 3402 if (ERROR("SPACING", 3403 "space prohibited before that close parenthesis ')'\n" . $herecurr) && 3404 $fix) { 3405 $fixed[$linenr - 1] =~ 3406 s/\s+\)/\)/; 3407 } 3408 } 3409 3410#goto labels aren't indented, allow a single space however 3411 if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and 3412 !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) { 3413 if (WARN("INDENTED_LABEL", 3414 "labels should not be indented\n" . $herecurr) && 3415 $fix) { 3416 $fixed[$linenr - 1] =~ 3417 s/^(.)\s+/$1/; 3418 } 3419 } 3420 3421# Return is not a function. 3422 if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) { 3423 my $spacing = $1; 3424 if ($^V && $^V ge 5.10.0 && 3425 $stat =~ /^.\s*return\s*$balanced_parens\s*;\s*$/) { 3426 ERROR("RETURN_PARENTHESES", 3427 "return is not a function, parentheses are not required\n" . $herecurr); 3428 3429 } elsif ($spacing !~ /\s+/) { 3430 ERROR("SPACING", 3431 "space required before the open parenthesis '('\n" . $herecurr); 3432 } 3433 } 3434 3435# if statements using unnecessary parentheses - ie: if ((foo == bar)) 3436 if ($^V && $^V ge 5.10.0 && 3437 $line =~ /\bif\s*((?:\(\s*){2,})/) { 3438 my $openparens = $1; 3439 my $count = $openparens =~ tr@\(@\(@; 3440 my $msg = ""; 3441 if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) { 3442 my $comp = $4; #Not $1 because of $LvalOrFunc 3443 $msg = " - maybe == should be = ?" if ($comp eq "=="); 3444 WARN("UNNECESSARY_PARENTHESES", 3445 "Unnecessary parentheses$msg\n" . $herecurr); 3446 } 3447 } 3448 3449# Return of what appears to be an errno should normally be -'ve 3450 if ($line =~ /^.\s*return\s*(E[A-Z]*)\s*;/) { 3451 my $name = $1; 3452 if ($name ne 'EOF' && $name ne 'ERROR') { 3453 WARN("USE_NEGATIVE_ERRNO", 3454 "return of an errno should typically be -ve (return -$1)\n" . $herecurr); 3455 } 3456 } 3457 3458# Need a space before open parenthesis after if, while etc 3459 if ($line =~ /\b(if|while|for|switch)\(/) { 3460 if (ERROR("SPACING", 3461 "space required before the open parenthesis '('\n" . $herecurr) && 3462 $fix) { 3463 $fixed[$linenr - 1] =~ 3464 s/\b(if|while|for|switch)\(/$1 \(/; 3465 } 3466 } 3467 3468# Check for illegal assignment in if conditional -- and check for trailing 3469# statements after the conditional. 3470 if ($line =~ /do\s*(?!{)/) { 3471 ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 3472 ctx_statement_block($linenr, $realcnt, 0) 3473 if (!defined $stat); 3474 my ($stat_next) = ctx_statement_block($line_nr_next, 3475 $remain_next, $off_next); 3476 $stat_next =~ s/\n./\n /g; 3477 ##print "stat<$stat> stat_next<$stat_next>\n"; 3478 3479 if ($stat_next =~ /^\s*while\b/) { 3480 # If the statement carries leading newlines, 3481 # then count those as offsets. 3482 my ($whitespace) = 3483 ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s); 3484 my $offset = 3485 statement_rawlines($whitespace) - 1; 3486 3487 $suppress_whiletrailers{$line_nr_next + 3488 $offset} = 1; 3489 } 3490 } 3491 if (!defined $suppress_whiletrailers{$linenr} && 3492 defined($stat) && defined($cond) && 3493 $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) { 3494 my ($s, $c) = ($stat, $cond); 3495 3496 if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) { 3497 ERROR("ASSIGN_IN_IF", 3498 "do not use assignment in if condition\n" . $herecurr); 3499 } 3500 3501 # Find out what is on the end of the line after the 3502 # conditional. 3503 substr($s, 0, length($c), ''); 3504 $s =~ s/\n.*//g; 3505 $s =~ s/$;//g; # Remove any comments 3506 if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ && 3507 $c !~ /}\s*while\s*/) 3508 { 3509 # Find out how long the conditional actually is. 3510 my @newlines = ($c =~ /\n/gs); 3511 my $cond_lines = 1 + $#newlines; 3512 my $stat_real = ''; 3513 3514 $stat_real = raw_line($linenr, $cond_lines) 3515 . "\n" if ($cond_lines); 3516 if (defined($stat_real) && $cond_lines > 1) { 3517 $stat_real = "[...]\n$stat_real"; 3518 } 3519 3520 ERROR("TRAILING_STATEMENTS", 3521 "trailing statements should be on next line\n" . $herecurr . $stat_real); 3522 } 3523 } 3524 3525# Check for bitwise tests written as boolean 3526 if ($line =~ / 3527 (?: 3528 (?:\[|\(|\&\&|\|\|) 3529 \s*0[xX][0-9]+\s* 3530 (?:\&\&|\|\|) 3531 | 3532 (?:\&\&|\|\|) 3533 \s*0[xX][0-9]+\s* 3534 (?:\&\&|\|\||\)|\]) 3535 )/x) 3536 { 3537 WARN("HEXADECIMAL_BOOLEAN_TEST", 3538 "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr); 3539 } 3540 3541# if and else should not have general statements after it 3542 if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) { 3543 my $s = $1; 3544 $s =~ s/$;//g; # Remove any comments 3545 if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) { 3546 ERROR("TRAILING_STATEMENTS", 3547 "trailing statements should be on next line\n" . $herecurr); 3548 } 3549 } 3550# if should not continue a brace 3551 if ($line =~ /}\s*if\b/) { 3552 ERROR("TRAILING_STATEMENTS", 3553 "trailing statements should be on next line\n" . 3554 $herecurr); 3555 } 3556# case and default should not have general statements after them 3557 if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g && 3558 $line !~ /\G(?: 3559 (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$| 3560 \s*return\s+ 3561 )/xg) 3562 { 3563 ERROR("TRAILING_STATEMENTS", 3564 "trailing statements should be on next line\n" . $herecurr); 3565 } 3566 3567 # Check for }<nl>else {, these must be at the same 3568 # indent level to be relevant to each other. 3569 if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ and 3570 $previndent == $indent) { 3571 ERROR("ELSE_AFTER_BRACE", 3572 "else should follow close brace '}'\n" . $hereprev); 3573 } 3574 3575 if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ and 3576 $previndent == $indent) { 3577 my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); 3578 3579 # Find out what is on the end of the line after the 3580 # conditional. 3581 substr($s, 0, length($c), ''); 3582 $s =~ s/\n.*//g; 3583 3584 if ($s =~ /^\s*;/) { 3585 ERROR("WHILE_AFTER_BRACE", 3586 "while should follow close brace '}'\n" . $hereprev); 3587 } 3588 } 3589 3590#Specific variable tests 3591 while ($line =~ m{($Constant|$Lval)}g) { 3592 my $var = $1; 3593 3594#gcc binary extension 3595 if ($var =~ /^$Binary$/) { 3596 if (WARN("GCC_BINARY_CONSTANT", 3597 "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) && 3598 $fix) { 3599 my $hexval = sprintf("0x%x", oct($var)); 3600 $fixed[$linenr - 1] =~ 3601 s/\b$var\b/$hexval/; 3602 } 3603 } 3604 3605#CamelCase 3606 if ($var !~ /^$Constant$/ && 3607 $var =~ /[A-Z][a-z]|[a-z][A-Z]/ && 3608#Ignore Page<foo> variants 3609 $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ && 3610#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show) 3611 $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/) { 3612 while ($var =~ m{($Ident)}g) { 3613 my $word = $1; 3614 next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/); 3615 if ($check) { 3616 seed_camelcase_includes(); 3617 if (!$file && !$camelcase_file_seeded) { 3618 seed_camelcase_file($realfile); 3619 $camelcase_file_seeded = 1; 3620 } 3621 } 3622 if (!defined $camelcase{$word}) { 3623 $camelcase{$word} = 1; 3624 CHK("CAMELCASE", 3625 "Avoid CamelCase: <$word>\n" . $herecurr); 3626 } 3627 } 3628 } 3629 } 3630 3631#no spaces allowed after \ in define 3632 if ($line =~ /\#\s*define.*\\\s+$/) { 3633 if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION", 3634 "Whitespace after \\ makes next lines useless\n" . $herecurr) && 3635 $fix) { 3636 $fixed[$linenr - 1] =~ s/\s+$//; 3637 } 3638 } 3639 3640#warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line) 3641 if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) { 3642 my $file = "$1.h"; 3643 my $checkfile = "include/linux/$file"; 3644 if (-f "$root/$checkfile" && 3645 $realfile ne $checkfile && 3646 $1 !~ /$allowed_asm_includes/) 3647 { 3648 if ($realfile =~ m{^arch/}) { 3649 CHK("ARCH_INCLUDE_LINUX", 3650 "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr); 3651 } else { 3652 WARN("INCLUDE_LINUX", 3653 "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr); 3654 } 3655 } 3656 } 3657 3658# multi-statement macros should be enclosed in a do while loop, grab the 3659# first statement and ensure its the whole macro if its not enclosed 3660# in a known good container 3661 if ($realfile !~ m@/vmlinux.lds.h$@ && 3662 $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) { 3663 my $ln = $linenr; 3664 my $cnt = $realcnt; 3665 my ($off, $dstat, $dcond, $rest); 3666 my $ctx = ''; 3667 ($dstat, $dcond, $ln, $cnt, $off) = 3668 ctx_statement_block($linenr, $realcnt, 0); 3669 $ctx = $dstat; 3670 #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n"; 3671 #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n"; 3672 3673 $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//; 3674 $dstat =~ s/$;//g; 3675 $dstat =~ s/\\\n.//g; 3676 $dstat =~ s/^\s*//s; 3677 $dstat =~ s/\s*$//s; 3678 3679 # Flatten any parentheses and braces 3680 while ($dstat =~ s/\([^\(\)]*\)/1/ || 3681 $dstat =~ s/\{[^\{\}]*\}/1/ || 3682 $dstat =~ s/\[[^\[\]]*\]/1/) 3683 { 3684 } 3685 3686 # Flatten any obvious string concatentation. 3687 while ($dstat =~ s/("X*")\s*$Ident/$1/ || 3688 $dstat =~ s/$Ident\s*("X*")/$1/) 3689 { 3690 } 3691 3692 my $exceptions = qr{ 3693 $Declare| 3694 module_param_named| 3695 MODULE_PARM_DESC| 3696 DECLARE_PER_CPU| 3697 DEFINE_PER_CPU| 3698 __typeof__\(| 3699 union| 3700 struct| 3701 \.$Ident\s*=\s*| 3702 ^\"|\"$ 3703 }x; 3704 #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n"; 3705 if ($dstat ne '' && 3706 $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(), 3707 $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo(); 3708 $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz 3709 $dstat !~ /^'X'$/ && # character constants 3710 $dstat !~ /$exceptions/ && 3711 $dstat !~ /^\.$Ident\s*=/ && # .foo = 3712 $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo 3713 $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...) 3714 $dstat !~ /^for\s*$Constant$/ && # for (...) 3715 $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar() 3716 $dstat !~ /^do\s*{/ && # do {... 3717 $dstat !~ /^\(\{/ && # ({... 3718 $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/) 3719 { 3720 $ctx =~ s/\n*$//; 3721 my $herectx = $here . "\n"; 3722 my $cnt = statement_rawlines($ctx); 3723 3724 for (my $n = 0; $n < $cnt; $n++) { 3725 $herectx .= raw_line($linenr, $n) . "\n"; 3726 } 3727 3728 if ($dstat =~ /;/) { 3729 ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE", 3730 "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx"); 3731 } else { 3732 ERROR("COMPLEX_MACRO", 3733 "Macros with complex values should be enclosed in parenthesis\n" . "$herectx"); 3734 } 3735 } 3736 3737# check for line continuations outside of #defines, preprocessor #, and asm 3738 3739 } else { 3740 if ($prevline !~ /^..*\\$/ && 3741 $line !~ /^\+\s*\#.*\\$/ && # preprocessor 3742 $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm 3743 $line =~ /^\+.*\\$/) { 3744 WARN("LINE_CONTINUATIONS", 3745 "Avoid unnecessary line continuations\n" . $herecurr); 3746 } 3747 } 3748 3749# do {} while (0) macro tests: 3750# single-statement macros do not need to be enclosed in do while (0) loop, 3751# macro should not end with a semicolon 3752 if ($^V && $^V ge 5.10.0 && 3753 $realfile !~ m@/vmlinux.lds.h$@ && 3754 $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) { 3755 my $ln = $linenr; 3756 my $cnt = $realcnt; 3757 my ($off, $dstat, $dcond, $rest); 3758 my $ctx = ''; 3759 ($dstat, $dcond, $ln, $cnt, $off) = 3760 ctx_statement_block($linenr, $realcnt, 0); 3761 $ctx = $dstat; 3762 3763 $dstat =~ s/\\\n.//g; 3764 3765 if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) { 3766 my $stmts = $2; 3767 my $semis = $3; 3768 3769 $ctx =~ s/\n*$//; 3770 my $cnt = statement_rawlines($ctx); 3771 my $herectx = $here . "\n"; 3772 3773 for (my $n = 0; $n < $cnt; $n++) { 3774 $herectx .= raw_line($linenr, $n) . "\n"; 3775 } 3776 3777 if (($stmts =~ tr/;/;/) == 1 && 3778 $stmts !~ /^\s*(if|while|for|switch)\b/) { 3779 WARN("SINGLE_STATEMENT_DO_WHILE_MACRO", 3780 "Single statement macros should not use a do {} while (0) loop\n" . "$herectx"); 3781 } 3782 if (defined $semis && $semis ne "") { 3783 WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON", 3784 "do {} while (0) macros should not be semicolon terminated\n" . "$herectx"); 3785 } 3786 } 3787 } 3788 3789# make sure symbols are always wrapped with VMLINUX_SYMBOL() ... 3790# all assignments may have only one of the following with an assignment: 3791# . 3792# ALIGN(...) 3793# VMLINUX_SYMBOL(...) 3794 if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) { 3795 WARN("MISSING_VMLINUX_SYMBOL", 3796 "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr); 3797 } 3798 3799# check for redundant bracing round if etc 3800 if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { 3801 my ($level, $endln, @chunks) = 3802 ctx_statement_full($linenr, $realcnt, 1); 3803 #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n"; 3804 #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n"; 3805 if ($#chunks > 0 && $level == 0) { 3806 my @allowed = (); 3807 my $allow = 0; 3808 my $seen = 0; 3809 my $herectx = $here . "\n"; 3810 my $ln = $linenr - 1; 3811 for my $chunk (@chunks) { 3812 my ($cond, $block) = @{$chunk}; 3813 3814 # If the condition carries leading newlines, then count those as offsets. 3815 my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s); 3816 my $offset = statement_rawlines($whitespace) - 1; 3817 3818 $allowed[$allow] = 0; 3819 #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n"; 3820 3821 # We have looked at and allowed this specific line. 3822 $suppress_ifbraces{$ln + $offset} = 1; 3823 3824 $herectx .= "$rawlines[$ln + $offset]\n[...]\n"; 3825 $ln += statement_rawlines($block) - 1; 3826 3827 substr($block, 0, length($cond), ''); 3828 3829 $seen++ if ($block =~ /^\s*{/); 3830 3831 #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n"; 3832 if (statement_lines($cond) > 1) { 3833 #print "APW: ALLOWED: cond<$cond>\n"; 3834 $allowed[$allow] = 1; 3835 } 3836 if ($block =~/\b(?:if|for|while)\b/) { 3837 #print "APW: ALLOWED: block<$block>\n"; 3838 $allowed[$allow] = 1; 3839 } 3840 if (statement_block_size($block) > 1) { 3841 #print "APW: ALLOWED: lines block<$block>\n"; 3842 $allowed[$allow] = 1; 3843 } 3844 $allow++; 3845 } 3846 if ($seen) { 3847 my $sum_allowed = 0; 3848 foreach (@allowed) { 3849 $sum_allowed += $_; 3850 } 3851 if ($sum_allowed == 0) { 3852 WARN("BRACES", 3853 "braces {} are not necessary for any arm of this statement\n" . $herectx); 3854 } elsif ($sum_allowed != $allow && 3855 $seen != $allow) { 3856 CHK("BRACES", 3857 "braces {} should be used on all arms of this statement\n" . $herectx); 3858 } 3859 } 3860 } 3861 } 3862 if (!defined $suppress_ifbraces{$linenr - 1} && 3863 $line =~ /\b(if|while|for|else)\b/) { 3864 my $allowed = 0; 3865 3866 # Check the pre-context. 3867 if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) { 3868 #print "APW: ALLOWED: pre<$1>\n"; 3869 $allowed = 1; 3870 } 3871 3872 my ($level, $endln, @chunks) = 3873 ctx_statement_full($linenr, $realcnt, $-[0]); 3874 3875 # Check the condition. 3876 my ($cond, $block) = @{$chunks[0]}; 3877 #print "CHECKING<$linenr> cond<$cond> block<$block>\n"; 3878 if (defined $cond) { 3879 substr($block, 0, length($cond), ''); 3880 } 3881 if (statement_lines($cond) > 1) { 3882 #print "APW: ALLOWED: cond<$cond>\n"; 3883 $allowed = 1; 3884 } 3885 if ($block =~/\b(?:if|for|while)\b/) { 3886 #print "APW: ALLOWED: block<$block>\n"; 3887 $allowed = 1; 3888 } 3889 if (statement_block_size($block) > 1) { 3890 #print "APW: ALLOWED: lines block<$block>\n"; 3891 $allowed = 1; 3892 } 3893 # Check the post-context. 3894 if (defined $chunks[1]) { 3895 my ($cond, $block) = @{$chunks[1]}; 3896 if (defined $cond) { 3897 substr($block, 0, length($cond), ''); 3898 } 3899 if ($block =~ /^\s*\{/) { 3900 #print "APW: ALLOWED: chunk-1 block<$block>\n"; 3901 $allowed = 1; 3902 } 3903 } 3904 if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) { 3905 my $herectx = $here . "\n"; 3906 my $cnt = statement_rawlines($block); 3907 3908 for (my $n = 0; $n < $cnt; $n++) { 3909 $herectx .= raw_line($linenr, $n) . "\n"; 3910 } 3911 3912 WARN("BRACES", 3913 "braces {} are not necessary for single statement blocks\n" . $herectx); 3914 } 3915 } 3916 3917# check for unnecessary blank lines around braces 3918 if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) { 3919 CHK("BRACES", 3920 "Blank lines aren't necessary before a close brace '}'\n" . $hereprev); 3921 } 3922 if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) { 3923 CHK("BRACES", 3924 "Blank lines aren't necessary after an open brace '{'\n" . $hereprev); 3925 } 3926 3927# no volatiles please 3928 my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b}; 3929 if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) { 3930 WARN("VOLATILE", 3931 "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr); 3932 } 3933 3934# warn about #if 0 3935 if ($line =~ /^.\s*\#\s*if\s+0\b/) { 3936 CHK("REDUNDANT_CODE", 3937 "if this code is redundant consider removing it\n" . 3938 $herecurr); 3939 } 3940 3941# check for needless "if (<foo>) fn(<foo>)" uses 3942 if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) { 3943 my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;'; 3944 if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) { 3945 WARN('NEEDLESS_IF', 3946 "$1(NULL) is safe this check is probably not required\n" . $hereprev); 3947 } 3948 } 3949 3950# check for bad placement of section $InitAttribute (e.g.: __initdata) 3951 if ($line =~ /(\b$InitAttribute\b)/) { 3952 my $attr = $1; 3953 if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) { 3954 my $ptr = $1; 3955 my $var = $2; 3956 if ((($ptr =~ /\b(union|struct)\s+$attr\b/ && 3957 ERROR("MISPLACED_INIT", 3958 "$attr should be placed after $var\n" . $herecurr)) || 3959 ($ptr !~ /\b(union|struct)\s+$attr\b/ && 3960 WARN("MISPLACED_INIT", 3961 "$attr should be placed after $var\n" . $herecurr))) && 3962 $fix) { 3963 $fixed[$linenr - 1] =~ 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; 3964 } 3965 } 3966 } 3967 3968# check for $InitAttributeData (ie: __initdata) with const 3969 if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) { 3970 my $attr = $1; 3971 $attr =~ /($InitAttributePrefix)(.*)/; 3972 my $attr_prefix = $1; 3973 my $attr_type = $2; 3974 if (ERROR("INIT_ATTRIBUTE", 3975 "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) && 3976 $fix) { 3977 $fixed[$linenr - 1] =~ 3978 s/$InitAttributeData/${attr_prefix}initconst/; 3979 } 3980 } 3981 3982# check for $InitAttributeConst (ie: __initconst) without const 3983 if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) { 3984 my $attr = $1; 3985 if (ERROR("INIT_ATTRIBUTE", 3986 "Use of $attr requires a separate use of const\n" . $herecurr) && 3987 $fix) { 3988 my $lead = $fixed[$linenr - 1] =~ 3989 /(^\+\s*(?:static\s+))/; 3990 $lead = rtrim($1); 3991 $lead = "$lead " if ($lead !~ /^\+$/); 3992 $lead = "${lead}const "; 3993 $fixed[$linenr - 1] =~ s/(^\+\s*(?:static\s+))/$lead/; 3994 } 3995 } 3996 3997# prefer usleep_range over udelay 3998 if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) { 3999 # ignore udelay's < 10, however 4000 if (! ($1 < 10) ) { 4001 CHK("USLEEP_RANGE", 4002 "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $line); 4003 } 4004 } 4005 4006# warn about unexpectedly long msleep's 4007 if ($line =~ /\bmsleep\s*\((\d+)\);/) { 4008 if ($1 < 20) { 4009 WARN("MSLEEP", 4010 "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $line); 4011 } 4012 } 4013 4014# check for comparisons of jiffies 4015 if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) { 4016 WARN("JIFFIES_COMPARISON", 4017 "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr); 4018 } 4019 4020# check for comparisons of get_jiffies_64() 4021 if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) { 4022 WARN("JIFFIES_COMPARISON", 4023 "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr); 4024 } 4025 4026# warn about #ifdefs in C files 4027# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { 4028# print "#ifdef in C files should be avoided\n"; 4029# print "$herecurr"; 4030# $clean = 0; 4031# } 4032 4033# warn about spacing in #ifdefs 4034 if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) { 4035 if (ERROR("SPACING", 4036 "exactly one space required after that #$1\n" . $herecurr) && 4037 $fix) { 4038 $fixed[$linenr - 1] =~ 4039 s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /; 4040 } 4041 4042 } 4043 4044# check for spinlock_t definitions without a comment. 4045 if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ || 4046 $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) { 4047 my $which = $1; 4048 if (!ctx_has_comment($first_line, $linenr)) { 4049 CHK("UNCOMMENTED_DEFINITION", 4050 "$1 definition without comment\n" . $herecurr); 4051 } 4052 } 4053# check for memory barriers without a comment. 4054 if ($line =~ /\b(mb|rmb|wmb|read_barrier_depends|smp_mb|smp_rmb|smp_wmb|smp_read_barrier_depends)\(/) { 4055 if (!ctx_has_comment($first_line, $linenr)) { 4056 WARN("MEMORY_BARRIER", 4057 "memory barrier without comment\n" . $herecurr); 4058 } 4059 } 4060# check of hardware specific defines 4061 if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) { 4062 CHK("ARCH_DEFINES", 4063 "architecture specific defines should be avoided\n" . $herecurr); 4064 } 4065 4066# Check that the storage class is at the beginning of a declaration 4067 if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) { 4068 WARN("STORAGE_CLASS", 4069 "storage class should be at the beginning of the declaration\n" . $herecurr) 4070 } 4071 4072# check the location of the inline attribute, that it is between 4073# storage class and type. 4074 if ($line =~ /\b$Type\s+$Inline\b/ || 4075 $line =~ /\b$Inline\s+$Storage\b/) { 4076 ERROR("INLINE_LOCATION", 4077 "inline keyword should sit between storage class and type\n" . $herecurr); 4078 } 4079 4080# Check for __inline__ and __inline, prefer inline 4081 if ($realfile !~ m@\binclude/uapi/@ && 4082 $line =~ /\b(__inline__|__inline)\b/) { 4083 if (WARN("INLINE", 4084 "plain inline is preferred over $1\n" . $herecurr) && 4085 $fix) { 4086 $fixed[$linenr - 1] =~ s/\b(__inline__|__inline)\b/inline/; 4087 4088 } 4089 } 4090 4091# Check for __attribute__ packed, prefer __packed 4092 if ($realfile !~ m@\binclude/uapi/@ && 4093 $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) { 4094 WARN("PREFER_PACKED", 4095 "__packed is preferred over __attribute__((packed))\n" . $herecurr); 4096 } 4097# Check for new packed members, warn to use care 4098 if ($line =~ /\b(__attribute__\s*\(\s*\(.*\bpacked|__packed)\b/) { 4099 WARN("NEW_PACKED", 4100 "Adding new packed members is to be done with care\n" . $herecurr); 4101 } 4102 4103# Check for __attribute__ aligned, prefer __aligned 4104 if ($realfile !~ m@\binclude/uapi/@ && 4105 $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) { 4106 WARN("PREFER_ALIGNED", 4107 "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr); 4108 } 4109 4110# Check for __attribute__ format(printf, prefer __printf 4111 if ($realfile !~ m@\binclude/uapi/@ && 4112 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) { 4113 if (WARN("PREFER_PRINTF", 4114 "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) && 4115 $fix) { 4116 $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex; 4117 4118 } 4119 } 4120 4121# Check for __attribute__ format(scanf, prefer __scanf 4122 if ($realfile !~ m@\binclude/uapi/@ && 4123 $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) { 4124 if (WARN("PREFER_SCANF", 4125 "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) && 4126 $fix) { 4127 $fixed[$linenr - 1] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex; 4128 } 4129 } 4130 4131# check for sizeof(&) 4132 if ($line =~ /\bsizeof\s*\(\s*\&/) { 4133 WARN("SIZEOF_ADDRESS", 4134 "sizeof(& should be avoided\n" . $herecurr); 4135 } 4136 4137# check for sizeof without parenthesis 4138 if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) { 4139 if (WARN("SIZEOF_PARENTHESIS", 4140 "sizeof $1 should be sizeof($1)\n" . $herecurr) && 4141 $fix) { 4142 $fixed[$linenr - 1] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex; 4143 } 4144 } 4145 4146# check for line continuations in quoted strings with odd counts of " 4147 if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) { 4148 WARN("LINE_CONTINUATIONS", 4149 "Avoid line continuations in quoted strings\n" . $herecurr); 4150 } 4151 4152# check for struct spinlock declarations 4153 if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) { 4154 WARN("USE_SPINLOCK_T", 4155 "struct spinlock should be spinlock_t\n" . $herecurr); 4156 } 4157 4158# check for seq_printf uses that could be seq_puts 4159 if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) { 4160 my $fmt = get_quoted_string($line, $rawline); 4161 if ($fmt ne "" && $fmt !~ /[^\\]\%/) { 4162 if (WARN("PREFER_SEQ_PUTS", 4163 "Prefer seq_puts to seq_printf\n" . $herecurr) && 4164 $fix) { 4165 $fixed[$linenr - 1] =~ s/\bseq_printf\b/seq_puts/; 4166 } 4167 } 4168 } 4169 4170# Check for misused memsets 4171 if ($^V && $^V ge 5.10.0 && 4172 defined $stat && 4173 $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/s) { 4174 4175 my $ms_addr = $2; 4176 my $ms_val = $7; 4177 my $ms_size = $12; 4178 4179 if ($ms_size =~ /^(0x|)0$/i) { 4180 ERROR("MEMSET", 4181 "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n"); 4182 } elsif ($ms_size =~ /^(0x|)1$/i) { 4183 WARN("MEMSET", 4184 "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n"); 4185 } 4186 } 4187 4188# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar) 4189 if ($^V && $^V ge 5.10.0 && 4190 $line =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/s) { 4191 if (WARN("PREFER_ETHER_ADDR_COPY", 4192 "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . $herecurr) && 4193 $fix) { 4194 $fixed[$linenr - 1] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/; 4195 } 4196 } 4197 4198# typecasts on min/max could be min_t/max_t 4199 if ($^V && $^V ge 5.10.0 && 4200 defined $stat && 4201 $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) { 4202 if (defined $2 || defined $7) { 4203 my $call = $1; 4204 my $cast1 = deparenthesize($2); 4205 my $arg1 = $3; 4206 my $cast2 = deparenthesize($7); 4207 my $arg2 = $8; 4208 my $cast; 4209 4210 if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) { 4211 $cast = "$cast1 or $cast2"; 4212 } elsif ($cast1 ne "") { 4213 $cast = $cast1; 4214 } else { 4215 $cast = $cast2; 4216 } 4217 WARN("MINMAX", 4218 "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n"); 4219 } 4220 } 4221 4222# check usleep_range arguments 4223 if ($^V && $^V ge 5.10.0 && 4224 defined $stat && 4225 $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) { 4226 my $min = $1; 4227 my $max = $7; 4228 if ($min eq $max) { 4229 WARN("USLEEP_RANGE", 4230 "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n"); 4231 } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ && 4232 $min > $max) { 4233 WARN("USLEEP_RANGE", 4234 "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n"); 4235 } 4236 } 4237 4238# check for naked sscanf 4239 if ($^V && $^V ge 5.10.0 && 4240 defined $stat && 4241 $stat =~ /\bsscanf\b/ && 4242 ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ && 4243 $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ && 4244 $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) { 4245 my $lc = $stat =~ tr@\n@@; 4246 $lc = $lc + $linenr; 4247 my $stat_real = raw_line($linenr, 0); 4248 for (my $count = $linenr + 1; $count <= $lc; $count++) { 4249 $stat_real = $stat_real . "\n" . raw_line($count, 0); 4250 } 4251 WARN("NAKED_SSCANF", 4252 "unchecked sscanf return value\n" . "$here\n$stat_real\n"); 4253 } 4254 4255# check for new externs in .h files. 4256 if ($realfile =~ /\.h$/ && 4257 $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) { 4258 if (CHK("AVOID_EXTERNS", 4259 "extern prototypes should be avoided in .h files\n" . $herecurr) && 4260 $fix) { 4261 $fixed[$linenr - 1] =~ s/(.*)\bextern\b\s*(.*)/$1$2/; 4262 } 4263 } 4264 4265# check for new externs in .c files. 4266 if ($realfile =~ /\.c$/ && defined $stat && 4267 $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s) 4268 { 4269 my $function_name = $1; 4270 my $paren_space = $2; 4271 4272 my $s = $stat; 4273 if (defined $cond) { 4274 substr($s, 0, length($cond), ''); 4275 } 4276 if ($s =~ /^\s*;/ && 4277 $function_name ne 'uninitialized_var') 4278 { 4279 WARN("AVOID_EXTERNS", 4280 "externs should be avoided in .c files\n" . $herecurr); 4281 } 4282 4283 if ($paren_space =~ /\n/) { 4284 WARN("FUNCTION_ARGUMENTS", 4285 "arguments for function declarations should follow identifier\n" . $herecurr); 4286 } 4287 4288 } elsif ($realfile =~ /\.c$/ && defined $stat && 4289 $stat =~ /^.\s*extern\s+/) 4290 { 4291 WARN("AVOID_EXTERNS", 4292 "externs should be avoided in .c files\n" . $herecurr); 4293 } 4294 4295# checks for new __setup's 4296 if ($rawline =~ /\b__setup\("([^"]*)"/) { 4297 my $name = $1; 4298 4299 if (!grep(/$name/, @setup_docs)) { 4300 CHK("UNDOCUMENTED_SETUP", 4301 "__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr); 4302 } 4303 } 4304 4305# check for pointless casting of kmalloc return 4306 if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) { 4307 WARN("UNNECESSARY_CASTS", 4308 "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr); 4309 } 4310 4311# alloc style 4312# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...) 4313 if ($^V && $^V ge 5.10.0 && 4314 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) { 4315 CHK("ALLOC_SIZEOF_STRUCT", 4316 "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr); 4317 } 4318 4319# check for krealloc arg reuse 4320 if ($^V && $^V ge 5.10.0 && 4321 $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) { 4322 WARN("KREALLOC_ARG_REUSE", 4323 "Reusing the krealloc arg is almost always a bug\n" . $herecurr); 4324 } 4325 4326# check for alloc argument mismatch 4327 if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) { 4328 WARN("ALLOC_ARRAY_ARGS", 4329 "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr); 4330 } 4331 4332# check for GFP_NOWAIT use 4333 if ($line =~ /\b__GFP_NOFAIL\b/) { 4334 WARN("__GFP_NOFAIL", 4335 "Use of __GFP_NOFAIL is deprecated, no new users should be added\n" . $herecurr); 4336 } 4337 4338# check for multiple semicolons 4339 if ($line =~ /;\s*;\s*$/) { 4340 if (WARN("ONE_SEMICOLON", 4341 "Statements terminations use 1 semicolon\n" . $herecurr) && 4342 $fix) { 4343 $fixed[$linenr - 1] =~ s/(\s*;\s*){2,}$/;/g; 4344 } 4345 } 4346 4347# check for case / default statements not preceded by break/fallthrough/switch 4348 if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) { 4349 my $has_break = 0; 4350 my $has_statement = 0; 4351 my $count = 0; 4352 my $prevline = $linenr; 4353 while ($prevline > 1 && $count < 3 && !$has_break) { 4354 $prevline--; 4355 my $rline = $rawlines[$prevline - 1]; 4356 my $fline = $lines[$prevline - 1]; 4357 last if ($fline =~ /^\@\@/); 4358 next if ($fline =~ /^\-/); 4359 next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/); 4360 $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i); 4361 next if ($fline =~ /^.[\s$;]*$/); 4362 $has_statement = 1; 4363 $count++; 4364 $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|return\b|goto\b|continue\b)/); 4365 } 4366 if (!$has_break && $has_statement) { 4367 WARN("MISSING_BREAK", 4368 "Possible switch case/default not preceded by break or fallthrough comment\n" . $herecurr); 4369 } 4370 } 4371 4372# check for switch/default statements without a break; 4373 if ($^V && $^V ge 5.10.0 && 4374 defined $stat && 4375 $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) { 4376 my $ctx = ''; 4377 my $herectx = $here . "\n"; 4378 my $cnt = statement_rawlines($stat); 4379 for (my $n = 0; $n < $cnt; $n++) { 4380 $herectx .= raw_line($linenr, $n) . "\n"; 4381 } 4382 WARN("DEFAULT_NO_BREAK", 4383 "switch default: should use break\n" . $herectx); 4384 } 4385 4386# check for gcc specific __FUNCTION__ 4387 if ($line =~ /\b__FUNCTION__\b/) { 4388 if (WARN("USE_FUNC", 4389 "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) && 4390 $fix) { 4391 $fixed[$linenr - 1] =~ s/\b__FUNCTION__\b/__func__/g; 4392 } 4393 } 4394 4395# check for use of yield() 4396 if ($line =~ /\byield\s*\(\s*\)/) { 4397 WARN("YIELD", 4398 "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr); 4399 } 4400 4401# check for comparisons against true and false 4402 if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) { 4403 my $lead = $1; 4404 my $arg = $2; 4405 my $test = $3; 4406 my $otype = $4; 4407 my $trail = $5; 4408 my $op = "!"; 4409 4410 ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i); 4411 4412 my $type = lc($otype); 4413 if ($type =~ /^(?:true|false)$/) { 4414 if (("$test" eq "==" && "$type" eq "true") || 4415 ("$test" eq "!=" && "$type" eq "false")) { 4416 $op = ""; 4417 } 4418 4419 CHK("BOOL_COMPARISON", 4420 "Using comparison to $otype is error prone\n" . $herecurr); 4421 4422## maybe suggesting a correct construct would better 4423## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr); 4424 4425 } 4426 } 4427 4428# check for semaphores initialized locked 4429 if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) { 4430 WARN("CONSIDER_COMPLETION", 4431 "consider using a completion\n" . $herecurr); 4432 } 4433 4434# recommend kstrto* over simple_strto* and strict_strto* 4435 if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) { 4436 WARN("CONSIDER_KSTRTO", 4437 "$1 is obsolete, use k$3 instead\n" . $herecurr); 4438 } 4439 4440# check for __initcall(), use device_initcall() explicitly please 4441 if ($line =~ /^.\s*__initcall\s*\(/) { 4442 WARN("USE_DEVICE_INITCALL", 4443 "please use device_initcall() instead of __initcall()\n" . $herecurr); 4444 } 4445 4446# check for various ops structs, ensure they are const. 4447 my $struct_ops = qr{acpi_dock_ops| 4448 address_space_operations| 4449 backlight_ops| 4450 block_device_operations| 4451 dentry_operations| 4452 dev_pm_ops| 4453 dma_map_ops| 4454 extent_io_ops| 4455 file_lock_operations| 4456 file_operations| 4457 hv_ops| 4458 ide_dma_ops| 4459 intel_dvo_dev_ops| 4460 item_operations| 4461 iwl_ops| 4462 kgdb_arch| 4463 kgdb_io| 4464 kset_uevent_ops| 4465 lock_manager_operations| 4466 microcode_ops| 4467 mtrr_ops| 4468 neigh_ops| 4469 nlmsvc_binding| 4470 pci_raw_ops| 4471 pipe_buf_operations| 4472 platform_hibernation_ops| 4473 platform_suspend_ops| 4474 proto_ops| 4475 rpc_pipe_ops| 4476 seq_operations| 4477 snd_ac97_build_ops| 4478 soc_pcmcia_socket_ops| 4479 stacktrace_ops| 4480 sysfs_ops| 4481 tty_operations| 4482 usb_mon_operations| 4483 wd_ops}x; 4484 if ($line !~ /\bconst\b/ && 4485 $line =~ /\bstruct\s+($struct_ops)\b/) { 4486 WARN("CONST_STRUCT", 4487 "struct $1 should normally be const\n" . 4488 $herecurr); 4489 } 4490 4491# use of NR_CPUS is usually wrong 4492# ignore definitions of NR_CPUS and usage to define arrays as likely right 4493 if ($line =~ /\bNR_CPUS\b/ && 4494 $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ && 4495 $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ && 4496 $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ && 4497 $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ && 4498 $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/) 4499 { 4500 WARN("NR_CPUS", 4501 "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr); 4502 } 4503 4504# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong. 4505 if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) { 4506 ERROR("DEFINE_ARCH_HAS", 4507 "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr); 4508 } 4509 4510# check for %L{u,d,i} in strings 4511 my $string; 4512 while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) { 4513 $string = substr($rawline, $-[1], $+[1] - $-[1]); 4514 $string =~ s/%%/__/g; 4515 if ($string =~ /(?<!%)%L[udi]/) { 4516 WARN("PRINTF_L", 4517 "\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr); 4518 last; 4519 } 4520 } 4521 4522# whine mightly about in_atomic 4523 if ($line =~ /\bin_atomic\s*\(/) { 4524 if ($realfile =~ m@^drivers/@) { 4525 ERROR("IN_ATOMIC", 4526 "do not use in_atomic in drivers\n" . $herecurr); 4527 } elsif ($realfile !~ m@^kernel/@) { 4528 WARN("IN_ATOMIC", 4529 "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr); 4530 } 4531 } 4532 4533# check for lockdep_set_novalidate_class 4534 if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ || 4535 $line =~ /__lockdep_no_validate__\s*\)/ ) { 4536 if ($realfile !~ m@^kernel/lockdep@ && 4537 $realfile !~ m@^include/linux/lockdep@ && 4538 $realfile !~ m@^drivers/base/core@) { 4539 ERROR("LOCKDEP", 4540 "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr); 4541 } 4542 } 4543 4544 if ($line =~ /debugfs_create_file.*S_IWUGO/ || 4545 $line =~ /DEVICE_ATTR.*S_IWUGO/ ) { 4546 WARN("EXPORTED_WORLD_WRITABLE", 4547 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr); 4548 } 4549 } 4550 4551 # If we have no input at all, then there is nothing to report on 4552 # so just keep quiet. 4553 if ($#rawlines == -1) { 4554 exit(0); 4555 } 4556 4557 # In mailback mode only produce a report in the negative, for 4558 # things that appear to be patches. 4559 if ($mailback && ($clean == 1 || !$is_patch)) { 4560 exit(0); 4561 } 4562 4563 # This is not a patch, and we are are in 'no-patch' mode so 4564 # just keep quiet. 4565 if (!$chk_patch && !$is_patch) { 4566 exit(0); 4567 } 4568 4569 if (!$is_patch) { 4570 ERROR("NOT_UNIFIED_DIFF", 4571 "Does not appear to be a unified-diff format patch\n"); 4572 } 4573 if ($is_patch && $chk_signoff && $signoff == 0) { 4574 ERROR("MISSING_SIGN_OFF", 4575 "Missing Signed-off-by: line(s)\n"); 4576 } 4577 4578 print report_dump(); 4579 if ($summary && !($clean == 1 && $quiet == 1)) { 4580 print "$filename " if ($summary_file); 4581 print "total: $cnt_error errors, $cnt_warn warnings, " . 4582 (($check)? "$cnt_chk checks, " : "") . 4583 "$cnt_lines lines checked\n"; 4584 print "\n" if ($quiet == 0); 4585 } 4586 4587 if ($quiet == 0) { 4588 4589 if ($^V lt 5.10.0) { 4590 print("NOTE: perl $^V is not modern enough to detect all possible issues.\n"); 4591 print("An upgrade to at least perl v5.10.0 is suggested.\n\n"); 4592 } 4593 4594 # If there were whitespace errors which cleanpatch can fix 4595 # then suggest that. 4596 if ($rpt_cleaners) { 4597 print "NOTE: whitespace errors detected, you may wish to use scripts/cleanpatch or\n"; 4598 print " scripts/cleanfile\n\n"; 4599 $rpt_cleaners = 0; 4600 } 4601 } 4602 4603 hash_show_words(\%use_type, "Used"); 4604 hash_show_words(\%ignore_type, "Ignored"); 4605 4606 if ($clean == 0 && $fix && "@rawlines" ne "@fixed") { 4607 my $newfile = $filename; 4608 $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace); 4609 my $linecount = 0; 4610 my $f; 4611 4612 open($f, '>', $newfile) 4613 or die "$P: Can't open $newfile for write\n"; 4614 foreach my $fixed_line (@fixed) { 4615 $linecount++; 4616 if ($file) { 4617 if ($linecount > 3) { 4618 $fixed_line =~ s/^\+//; 4619 print $f $fixed_line. "\n"; 4620 } 4621 } else { 4622 print $f $fixed_line . "\n"; 4623 } 4624 } 4625 close($f); 4626 4627 if (!$quiet) { 4628 print << "EOM"; 4629Wrote EXPERIMENTAL --fix correction(s) to '$newfile' 4630 4631Do _NOT_ trust the results written to this file. 4632Do _NOT_ submit these changes without inspecting them for correctness. 4633 4634This EXPERIMENTAL file is simply a convenience to help rewrite patches. 4635No warranties, expressed or implied... 4636 4637EOM 4638 } 4639 } 4640 4641 if ($clean == 1 && $quiet == 0) { 4642 print "$vname has no obvious style problems and is ready for submission.\n" 4643 } 4644 if ($clean == 0 && $quiet == 0) { 4645 print << "EOM"; 4646$vname has style problems, please review. 4647 4648If any of these errors are false positives, please report 4649them to the maintainer, see CHECKPATCH in MAINTAINERS. 4650EOM 4651 } 4652 4653 return $clean; 4654} 4655