16305db96SHeinrich Schuchardt#!/usr/bin/env perl 2dd88ab32SMasahiro Yamada# (c) 2001, Dave Jones. (the file handling bit) 3dd88ab32SMasahiro Yamada# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit) 4dd88ab32SMasahiro Yamada# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite) 5dd88ab32SMasahiro Yamada# (c) 2008-2010 Andy Whitcroft <apw@canonical.com> 6dd88ab32SMasahiro Yamada# Licensed under the terms of the GNU GPL License version 2 7dd88ab32SMasahiro Yamada 8dd88ab32SMasahiro Yamadause strict; 96305db96SHeinrich Schuchardtuse warnings; 106b9709d9STom Riniuse POSIX; 11c10e0f5bSDan Murphyuse File::Basename; 12c10e0f5bSDan Murphyuse Cwd 'abs_path'; 136305db96SHeinrich Schuchardtuse Term::ANSIColor qw(:constants); 14dd88ab32SMasahiro Yamada 15dd88ab32SMasahiro Yamadamy $P = $0; 16c10e0f5bSDan Murphymy $D = dirname(abs_path($P)); 17dd88ab32SMasahiro Yamada 18dd88ab32SMasahiro Yamadamy $V = '0.32'; 19dd88ab32SMasahiro Yamada 20dd88ab32SMasahiro Yamadause Getopt::Long qw(:config no_auto_abbrev); 21dd88ab32SMasahiro Yamada 22dd88ab32SMasahiro Yamadamy $quiet = 0; 23dd88ab32SMasahiro Yamadamy $tree = 1; 24dd88ab32SMasahiro Yamadamy $chk_signoff = 1; 25dd88ab32SMasahiro Yamadamy $chk_patch = 1; 26dd88ab32SMasahiro Yamadamy $tst_only; 27dd88ab32SMasahiro Yamadamy $emacs = 0; 28dd88ab32SMasahiro Yamadamy $terse = 0; 296305db96SHeinrich Schuchardtmy $showfile = 0; 30dd88ab32SMasahiro Yamadamy $file = 0; 316305db96SHeinrich Schuchardtmy $git = 0; 326305db96SHeinrich Schuchardtmy %git_commits = (); 33dd88ab32SMasahiro Yamadamy $check = 0; 346305db96SHeinrich Schuchardtmy $check_orig = 0; 35dd88ab32SMasahiro Yamadamy $summary = 1; 36dd88ab32SMasahiro Yamadamy $mailback = 0; 37dd88ab32SMasahiro Yamadamy $summary_file = 0; 38dd88ab32SMasahiro Yamadamy $show_types = 0; 396305db96SHeinrich Schuchardtmy $list_types = 0; 406b9709d9STom Rinimy $fix = 0; 416b9709d9STom Rinimy $fix_inplace = 0; 42dd88ab32SMasahiro Yamadamy $root; 43dd88ab32SMasahiro Yamadamy %debug; 446b9709d9STom Rinimy %camelcase = (); 456b9709d9STom Rinimy %use_type = (); 466b9709d9STom Rinimy @use = (); 47dd88ab32SMasahiro Yamadamy %ignore_type = (); 48dd88ab32SMasahiro Yamadamy @ignore = (); 49dd88ab32SMasahiro Yamadamy $help = 0; 50dd88ab32SMasahiro Yamadamy $configuration_file = ".checkpatch.conf"; 51dd88ab32SMasahiro Yamadamy $max_line_length = 80; 526b9709d9STom Rinimy $ignore_perl_version = 0; 536b9709d9STom Rinimy $minimum_perl_version = 5.10.0; 546305db96SHeinrich Schuchardtmy $min_conf_desc_length = 4; 55c10e0f5bSDan Murphymy $spelling_file = "$D/spelling.txt"; 56c10e0f5bSDan Murphymy $codespell = 0; 57c10e0f5bSDan Murphymy $codespellfile = "/usr/share/codespell/dictionary.txt"; 586305db96SHeinrich Schuchardtmy $conststructsfile = "$D/const_structs.checkpatch"; 596305db96SHeinrich Schuchardtmy $typedefsfile = ""; 606305db96SHeinrich Schuchardtmy $color = "auto"; 616305db96SHeinrich Schuchardtmy $allow_c99_comments = 1; 62dd88ab32SMasahiro Yamada 63dd88ab32SMasahiro Yamadasub help { 64dd88ab32SMasahiro Yamada my ($exitcode) = @_; 65dd88ab32SMasahiro Yamada 66dd88ab32SMasahiro Yamada print << "EOM"; 67dd88ab32SMasahiro YamadaUsage: $P [OPTION]... [FILE]... 68dd88ab32SMasahiro YamadaVersion: $V 69dd88ab32SMasahiro Yamada 70dd88ab32SMasahiro YamadaOptions: 71dd88ab32SMasahiro Yamada -q, --quiet quiet 72dd88ab32SMasahiro Yamada --no-tree run without a kernel tree 73dd88ab32SMasahiro Yamada --no-signoff do not check for 'Signed-off-by' line 74dd88ab32SMasahiro Yamada --patch treat FILE as patchfile (default) 75dd88ab32SMasahiro Yamada --emacs emacs compile window format 76dd88ab32SMasahiro Yamada --terse one line per report 776305db96SHeinrich Schuchardt --showfile emit diffed file position, not input file position 786305db96SHeinrich Schuchardt -g, --git treat FILE as a single commit or git revision range 796305db96SHeinrich Schuchardt single git commit with: 806305db96SHeinrich Schuchardt <rev> 816305db96SHeinrich Schuchardt <rev>^ 826305db96SHeinrich Schuchardt <rev>~n 836305db96SHeinrich Schuchardt multiple git commits with: 846305db96SHeinrich Schuchardt <rev1>..<rev2> 856305db96SHeinrich Schuchardt <rev1>...<rev2> 866305db96SHeinrich Schuchardt <rev>-<count> 876305db96SHeinrich Schuchardt git merges are ignored 88dd88ab32SMasahiro Yamada -f, --file treat FILE as regular source file 89dd88ab32SMasahiro Yamada --subjective, --strict enable more subjective tests 906305db96SHeinrich Schuchardt --list-types list the possible message types 916b9709d9STom Rini --types TYPE(,TYPE2...) show only these comma separated message types 92dd88ab32SMasahiro Yamada --ignore TYPE(,TYPE2...) ignore various comma separated message types 936305db96SHeinrich Schuchardt --show-types show the specific message type in the output 94dd88ab32SMasahiro Yamada --max-line-length=n set the maximum line length, if exceeded, warn 956305db96SHeinrich Schuchardt --min-conf-desc-length=n set the min description length, if shorter, warn 96dd88ab32SMasahiro Yamada --root=PATH PATH to the kernel tree root 97dd88ab32SMasahiro Yamada --no-summary suppress the per-file summary 98dd88ab32SMasahiro Yamada --mailback only produce a report in case of warnings/errors 99dd88ab32SMasahiro Yamada --summary-file include the filename in summary 100dd88ab32SMasahiro Yamada --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of 101dd88ab32SMasahiro Yamada 'values', 'possible', 'type', and 'attr' (default 102dd88ab32SMasahiro Yamada is all off) 103dd88ab32SMasahiro Yamada --test-only=WORD report only warnings/errors containing WORD 104dd88ab32SMasahiro Yamada literally 1056b9709d9STom Rini --fix EXPERIMENTAL - may create horrible results 1066b9709d9STom Rini If correctable single-line errors exist, create 1076b9709d9STom Rini "<inputfile>.EXPERIMENTAL-checkpatch-fixes" 1086b9709d9STom Rini with potential errors corrected to the preferred 1096b9709d9STom Rini checkpatch style 1106b9709d9STom Rini --fix-inplace EXPERIMENTAL - may create horrible results 1116b9709d9STom Rini Is the same as --fix, but overwrites the input 1126b9709d9STom Rini file. It's your fault if there's no backup or git 1136b9709d9STom Rini --ignore-perl-version override checking of perl version. expect 1146b9709d9STom Rini runtime errors. 115c10e0f5bSDan Murphy --codespell Use the codespell dictionary for spelling/typos 1166305db96SHeinrich Schuchardt (default:/usr/share/codespell/dictionary.txt) 117c10e0f5bSDan Murphy --codespellfile Use this codespell dictionary 1186305db96SHeinrich Schuchardt --typedefsfile Read additional types from this file 1196305db96SHeinrich Schuchardt --color[=WHEN] Use colors 'always', 'never', or only when output 1206305db96SHeinrich Schuchardt is a terminal ('auto'). Default is 'auto'. 121dd88ab32SMasahiro Yamada -h, --help, --version display this help and exit 122dd88ab32SMasahiro Yamada 123dd88ab32SMasahiro YamadaWhen FILE is - read standard input. 124dd88ab32SMasahiro YamadaEOM 125dd88ab32SMasahiro Yamada 126dd88ab32SMasahiro Yamada exit($exitcode); 127dd88ab32SMasahiro Yamada} 128dd88ab32SMasahiro Yamada 1296305db96SHeinrich Schuchardtsub uniq { 1306305db96SHeinrich Schuchardt my %seen; 1316305db96SHeinrich Schuchardt return grep { !$seen{$_}++ } @_; 1326305db96SHeinrich Schuchardt} 1336305db96SHeinrich Schuchardt 1346305db96SHeinrich Schuchardtsub list_types { 1356305db96SHeinrich Schuchardt my ($exitcode) = @_; 1366305db96SHeinrich Schuchardt 1376305db96SHeinrich Schuchardt my $count = 0; 1386305db96SHeinrich Schuchardt 1396305db96SHeinrich Schuchardt local $/ = undef; 1406305db96SHeinrich Schuchardt 1416305db96SHeinrich Schuchardt open(my $script, '<', abs_path($P)) or 1426305db96SHeinrich Schuchardt die "$P: Can't read '$P' $!\n"; 1436305db96SHeinrich Schuchardt 1446305db96SHeinrich Schuchardt my $text = <$script>; 1456305db96SHeinrich Schuchardt close($script); 1466305db96SHeinrich Schuchardt 1476305db96SHeinrich Schuchardt my @types = (); 148*c398f2dfSHeinrich Schuchardt # Also catch when type or level is passed through a variable 149*c398f2dfSHeinrich Schuchardt for ($text =~ /(?:(?:\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) { 1506305db96SHeinrich Schuchardt push (@types, $_); 1516305db96SHeinrich Schuchardt } 1526305db96SHeinrich Schuchardt @types = sort(uniq(@types)); 1536305db96SHeinrich Schuchardt print("#\tMessage type\n\n"); 1546305db96SHeinrich Schuchardt foreach my $type (@types) { 1556305db96SHeinrich Schuchardt print(++$count . "\t" . $type . "\n"); 1566305db96SHeinrich Schuchardt } 1576305db96SHeinrich Schuchardt 1586305db96SHeinrich Schuchardt exit($exitcode); 1596305db96SHeinrich Schuchardt} 1606305db96SHeinrich Schuchardt 161dd88ab32SMasahiro Yamadamy $conf = which_conf($configuration_file); 162dd88ab32SMasahiro Yamadaif (-f $conf) { 163dd88ab32SMasahiro Yamada my @conf_args; 164dd88ab32SMasahiro Yamada open(my $conffile, '<', "$conf") 165dd88ab32SMasahiro Yamada or warn "$P: Can't find a readable $configuration_file file $!\n"; 166dd88ab32SMasahiro Yamada 167dd88ab32SMasahiro Yamada while (<$conffile>) { 168dd88ab32SMasahiro Yamada my $line = $_; 169dd88ab32SMasahiro Yamada 170dd88ab32SMasahiro Yamada $line =~ s/\s*\n?$//g; 171dd88ab32SMasahiro Yamada $line =~ s/^\s*//g; 172dd88ab32SMasahiro Yamada $line =~ s/\s+/ /g; 173dd88ab32SMasahiro Yamada 174dd88ab32SMasahiro Yamada next if ($line =~ m/^\s*#/); 175dd88ab32SMasahiro Yamada next if ($line =~ m/^\s*$/); 176dd88ab32SMasahiro Yamada 177dd88ab32SMasahiro Yamada my @words = split(" ", $line); 178dd88ab32SMasahiro Yamada foreach my $word (@words) { 179dd88ab32SMasahiro Yamada last if ($word =~ m/^#/); 180dd88ab32SMasahiro Yamada push (@conf_args, $word); 181dd88ab32SMasahiro Yamada } 182dd88ab32SMasahiro Yamada } 183dd88ab32SMasahiro Yamada close($conffile); 184dd88ab32SMasahiro Yamada unshift(@ARGV, @conf_args) if @conf_args; 185dd88ab32SMasahiro Yamada} 186dd88ab32SMasahiro Yamada 1876305db96SHeinrich Schuchardt# Perl's Getopt::Long allows options to take optional arguments after a space. 1886305db96SHeinrich Schuchardt# Prevent --color by itself from consuming other arguments 1896305db96SHeinrich Schuchardtforeach (@ARGV) { 1906305db96SHeinrich Schuchardt if ($_ eq "--color" || $_ eq "-color") { 1916305db96SHeinrich Schuchardt $_ = "--color=$color"; 1926305db96SHeinrich Schuchardt } 1936305db96SHeinrich Schuchardt} 1946305db96SHeinrich Schuchardt 195dd88ab32SMasahiro YamadaGetOptions( 196dd88ab32SMasahiro Yamada 'q|quiet+' => \$quiet, 197dd88ab32SMasahiro Yamada 'tree!' => \$tree, 198dd88ab32SMasahiro Yamada 'signoff!' => \$chk_signoff, 199dd88ab32SMasahiro Yamada 'patch!' => \$chk_patch, 200dd88ab32SMasahiro Yamada 'emacs!' => \$emacs, 201dd88ab32SMasahiro Yamada 'terse!' => \$terse, 2026305db96SHeinrich Schuchardt 'showfile!' => \$showfile, 203dd88ab32SMasahiro Yamada 'f|file!' => \$file, 2046305db96SHeinrich Schuchardt 'g|git!' => \$git, 205dd88ab32SMasahiro Yamada 'subjective!' => \$check, 206dd88ab32SMasahiro Yamada 'strict!' => \$check, 207dd88ab32SMasahiro Yamada 'ignore=s' => \@ignore, 2086b9709d9STom Rini 'types=s' => \@use, 209dd88ab32SMasahiro Yamada 'show-types!' => \$show_types, 2106305db96SHeinrich Schuchardt 'list-types!' => \$list_types, 211dd88ab32SMasahiro Yamada 'max-line-length=i' => \$max_line_length, 2126305db96SHeinrich Schuchardt 'min-conf-desc-length=i' => \$min_conf_desc_length, 213dd88ab32SMasahiro Yamada 'root=s' => \$root, 214dd88ab32SMasahiro Yamada 'summary!' => \$summary, 215dd88ab32SMasahiro Yamada 'mailback!' => \$mailback, 216dd88ab32SMasahiro Yamada 'summary-file!' => \$summary_file, 2176b9709d9STom Rini 'fix!' => \$fix, 2186b9709d9STom Rini 'fix-inplace!' => \$fix_inplace, 2196b9709d9STom Rini 'ignore-perl-version!' => \$ignore_perl_version, 220dd88ab32SMasahiro Yamada 'debug=s' => \%debug, 221dd88ab32SMasahiro Yamada 'test-only=s' => \$tst_only, 222c10e0f5bSDan Murphy 'codespell!' => \$codespell, 223c10e0f5bSDan Murphy 'codespellfile=s' => \$codespellfile, 2246305db96SHeinrich Schuchardt 'typedefsfile=s' => \$typedefsfile, 2256305db96SHeinrich Schuchardt 'color=s' => \$color, 2266305db96SHeinrich Schuchardt 'no-color' => \$color, #keep old behaviors of -nocolor 2276305db96SHeinrich Schuchardt 'nocolor' => \$color, #keep old behaviors of -nocolor 228dd88ab32SMasahiro Yamada 'h|help' => \$help, 229dd88ab32SMasahiro Yamada 'version' => \$help 230dd88ab32SMasahiro Yamada) or help(1); 231dd88ab32SMasahiro Yamada 232dd88ab32SMasahiro Yamadahelp(0) if ($help); 233dd88ab32SMasahiro Yamada 2346305db96SHeinrich Schuchardtlist_types(0) if ($list_types); 2356305db96SHeinrich Schuchardt 2366b9709d9STom Rini$fix = 1 if ($fix_inplace); 2376305db96SHeinrich Schuchardt$check_orig = $check; 2386b9709d9STom Rini 239dd88ab32SMasahiro Yamadamy $exit = 0; 240dd88ab32SMasahiro Yamada 2416b9709d9STom Riniif ($^V && $^V lt $minimum_perl_version) { 2426b9709d9STom Rini printf "$P: requires at least perl version %vd\n", $minimum_perl_version; 2436b9709d9STom Rini if (!$ignore_perl_version) { 2446b9709d9STom Rini exit(1); 2456b9709d9STom Rini } 2466b9709d9STom Rini} 2476b9709d9STom Rini 2486305db96SHeinrich Schuchardt#if no filenames are given, push '-' to read patch from stdin 249dd88ab32SMasahiro Yamadaif ($#ARGV < 0) { 2506305db96SHeinrich Schuchardt push(@ARGV, '-'); 2516305db96SHeinrich Schuchardt} 2526305db96SHeinrich Schuchardt 2536305db96SHeinrich Schuchardtif ($color =~ /^[01]$/) { 2546305db96SHeinrich Schuchardt $color = !$color; 2556305db96SHeinrich Schuchardt} elsif ($color =~ /^always$/i) { 2566305db96SHeinrich Schuchardt $color = 1; 2576305db96SHeinrich Schuchardt} elsif ($color =~ /^never$/i) { 2586305db96SHeinrich Schuchardt $color = 0; 2596305db96SHeinrich Schuchardt} elsif ($color =~ /^auto$/i) { 2606305db96SHeinrich Schuchardt $color = (-t STDOUT); 2616305db96SHeinrich Schuchardt} else { 2626305db96SHeinrich Schuchardt die "Invalid color mode: $color\n"; 263dd88ab32SMasahiro Yamada} 264dd88ab32SMasahiro Yamada 2656b9709d9STom Rinisub hash_save_array_words { 2666b9709d9STom Rini my ($hashRef, $arrayRef) = @_; 2676b9709d9STom Rini 2686b9709d9STom Rini my @array = split(/,/, join(',', @$arrayRef)); 2696b9709d9STom Rini foreach my $word (@array) { 270dd88ab32SMasahiro Yamada $word =~ s/\s*\n?$//g; 271dd88ab32SMasahiro Yamada $word =~ s/^\s*//g; 272dd88ab32SMasahiro Yamada $word =~ s/\s+/ /g; 273dd88ab32SMasahiro Yamada $word =~ tr/[a-z]/[A-Z]/; 274dd88ab32SMasahiro Yamada 275dd88ab32SMasahiro Yamada next if ($word =~ m/^\s*#/); 276dd88ab32SMasahiro Yamada next if ($word =~ m/^\s*$/); 277dd88ab32SMasahiro Yamada 2786b9709d9STom Rini $hashRef->{$word}++; 279dd88ab32SMasahiro Yamada } 2806b9709d9STom Rini} 2816b9709d9STom Rini 2826b9709d9STom Rinisub hash_show_words { 2836b9709d9STom Rini my ($hashRef, $prefix) = @_; 2846b9709d9STom Rini 2856305db96SHeinrich Schuchardt if (keys %$hashRef) { 2866305db96SHeinrich Schuchardt print "\nNOTE: $prefix message types:"; 2876b9709d9STom Rini foreach my $word (sort keys %$hashRef) { 2886b9709d9STom Rini print " $word"; 2896b9709d9STom Rini } 2906305db96SHeinrich Schuchardt print "\n"; 2916b9709d9STom Rini } 2926b9709d9STom Rini} 2936b9709d9STom Rini 2946b9709d9STom Rinihash_save_array_words(\%ignore_type, \@ignore); 2956b9709d9STom Rinihash_save_array_words(\%use_type, \@use); 296dd88ab32SMasahiro Yamada 297dd88ab32SMasahiro Yamadamy $dbg_values = 0; 298dd88ab32SMasahiro Yamadamy $dbg_possible = 0; 299dd88ab32SMasahiro Yamadamy $dbg_type = 0; 300dd88ab32SMasahiro Yamadamy $dbg_attr = 0; 301dd88ab32SMasahiro Yamadafor my $key (keys %debug) { 302dd88ab32SMasahiro Yamada ## no critic 303dd88ab32SMasahiro Yamada eval "\${dbg_$key} = '$debug{$key}';"; 304dd88ab32SMasahiro Yamada die "$@" if ($@); 305dd88ab32SMasahiro Yamada} 306dd88ab32SMasahiro Yamada 307dd88ab32SMasahiro Yamadamy $rpt_cleaners = 0; 308dd88ab32SMasahiro Yamada 309dd88ab32SMasahiro Yamadaif ($terse) { 310dd88ab32SMasahiro Yamada $emacs = 1; 311dd88ab32SMasahiro Yamada $quiet++; 312dd88ab32SMasahiro Yamada} 313dd88ab32SMasahiro Yamada 314dd88ab32SMasahiro Yamadaif ($tree) { 315dd88ab32SMasahiro Yamada if (defined $root) { 316dd88ab32SMasahiro Yamada if (!top_of_kernel_tree($root)) { 317dd88ab32SMasahiro Yamada die "$P: $root: --root does not point at a valid tree\n"; 318dd88ab32SMasahiro Yamada } 319dd88ab32SMasahiro Yamada } else { 320dd88ab32SMasahiro Yamada if (top_of_kernel_tree('.')) { 321dd88ab32SMasahiro Yamada $root = '.'; 322dd88ab32SMasahiro Yamada } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ && 323dd88ab32SMasahiro Yamada top_of_kernel_tree($1)) { 324dd88ab32SMasahiro Yamada $root = $1; 325dd88ab32SMasahiro Yamada } 326dd88ab32SMasahiro Yamada } 327dd88ab32SMasahiro Yamada 328dd88ab32SMasahiro Yamada if (!defined $root) { 329dd88ab32SMasahiro Yamada print "Must be run from the top-level dir. of a kernel tree\n"; 330dd88ab32SMasahiro Yamada exit(2); 331dd88ab32SMasahiro Yamada } 332dd88ab32SMasahiro Yamada} 333dd88ab32SMasahiro Yamada 334dd88ab32SMasahiro Yamadamy $emitted_corrupt = 0; 335dd88ab32SMasahiro Yamada 336dd88ab32SMasahiro Yamadaour $Ident = qr{ 337dd88ab32SMasahiro Yamada [A-Za-z_][A-Za-z\d_]* 338dd88ab32SMasahiro Yamada (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)* 339dd88ab32SMasahiro Yamada }x; 340dd88ab32SMasahiro Yamadaour $Storage = qr{extern|static|asmlinkage}; 341dd88ab32SMasahiro Yamadaour $Sparse = qr{ 342dd88ab32SMasahiro Yamada __user| 343dd88ab32SMasahiro Yamada __kernel| 344dd88ab32SMasahiro Yamada __force| 345dd88ab32SMasahiro Yamada __iomem| 346dd88ab32SMasahiro Yamada __must_check| 347dd88ab32SMasahiro Yamada __init_refok| 348dd88ab32SMasahiro Yamada __kprobes| 349dd88ab32SMasahiro Yamada __ref| 3506305db96SHeinrich Schuchardt __rcu| 3516305db96SHeinrich Schuchardt __private 352dd88ab32SMasahiro Yamada }x; 3536b9709d9STom Riniour $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)}; 3546b9709d9STom Riniour $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)}; 3556b9709d9STom Riniour $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)}; 3566b9709d9STom Riniour $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)}; 3576b9709d9STom Riniour $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit}; 358dd88ab32SMasahiro Yamada 359dd88ab32SMasahiro Yamada# Notes to $Attribute: 360dd88ab32SMasahiro Yamada# We need \b after 'init' otherwise 'initconst' will cause a false positive in a check 361dd88ab32SMasahiro Yamadaour $Attribute = qr{ 362dd88ab32SMasahiro Yamada const| 363dd88ab32SMasahiro Yamada __percpu| 364dd88ab32SMasahiro Yamada __nocast| 365dd88ab32SMasahiro Yamada __safe| 3666305db96SHeinrich Schuchardt __bitwise| 367dd88ab32SMasahiro Yamada __packed__| 368dd88ab32SMasahiro Yamada __packed2__| 369dd88ab32SMasahiro Yamada __naked| 370dd88ab32SMasahiro Yamada __maybe_unused| 371dd88ab32SMasahiro Yamada __always_unused| 372dd88ab32SMasahiro Yamada __noreturn| 373dd88ab32SMasahiro Yamada __used| 374dd88ab32SMasahiro Yamada __cold| 3756305db96SHeinrich Schuchardt __pure| 376dd88ab32SMasahiro Yamada __noclone| 377dd88ab32SMasahiro Yamada __deprecated| 378dd88ab32SMasahiro Yamada __read_mostly| 379dd88ab32SMasahiro Yamada __kprobes| 3806b9709d9STom Rini $InitAttribute| 381dd88ab32SMasahiro Yamada ____cacheline_aligned| 382dd88ab32SMasahiro Yamada ____cacheline_aligned_in_smp| 383dd88ab32SMasahiro Yamada ____cacheline_internodealigned_in_smp| 384dd88ab32SMasahiro Yamada __weak 385dd88ab32SMasahiro Yamada }x; 386dd88ab32SMasahiro Yamadaour $Modifier; 3876305db96SHeinrich Schuchardtour $Inline = qr{inline|__always_inline|noinline|__inline|__inline__}; 388dd88ab32SMasahiro Yamadaour $Member = qr{->$Ident|\.$Ident|\[[^]]*\]}; 389dd88ab32SMasahiro Yamadaour $Lval = qr{$Ident(?:$Member)*}; 390dd88ab32SMasahiro Yamada 3916b9709d9STom Riniour $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u}; 3926b9709d9STom Riniour $Binary = qr{(?i)0b[01]+$Int_type?}; 3936b9709d9STom Riniour $Hex = qr{(?i)0x[0-9a-f]+$Int_type?}; 3946b9709d9STom Riniour $Int = qr{[0-9]+$Int_type?}; 3956305db96SHeinrich Schuchardtour $Octal = qr{0[0-7]+$Int_type?}; 396*c398f2dfSHeinrich Schuchardtour $String = qr{"[X\t]*"}; 397dd88ab32SMasahiro Yamadaour $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?}; 398dd88ab32SMasahiro Yamadaour $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?}; 399dd88ab32SMasahiro Yamadaour $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?}; 400dd88ab32SMasahiro Yamadaour $Float = qr{$Float_hex|$Float_dec|$Float_int}; 4016305db96SHeinrich Schuchardtour $Constant = qr{$Float|$Binary|$Octal|$Hex|$Int}; 402dd88ab32SMasahiro Yamadaour $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=}; 4036305db96SHeinrich Schuchardtour $Compare = qr{<=|>=|==|!=|<|(?<!-)>}; 4046b9709d9STom Riniour $Arithmetic = qr{\+|-|\*|\/|%}; 405dd88ab32SMasahiro Yamadaour $Operators = qr{ 406dd88ab32SMasahiro Yamada <=|>=|==|!=| 407dd88ab32SMasahiro Yamada =>|->|<<|>>|<|>|!|~| 4086b9709d9STom Rini &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic 409dd88ab32SMasahiro Yamada }x; 410dd88ab32SMasahiro Yamada 4116305db96SHeinrich Schuchardtour $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x; 4126305db96SHeinrich Schuchardt 4136305db96SHeinrich Schuchardtour $BasicType; 414dd88ab32SMasahiro Yamadaour $NonptrType; 4156305db96SHeinrich Schuchardtour $NonptrTypeMisordered; 4166b9709d9STom Riniour $NonptrTypeWithAttr; 417dd88ab32SMasahiro Yamadaour $Type; 4186305db96SHeinrich Schuchardtour $TypeMisordered; 419dd88ab32SMasahiro Yamadaour $Declare; 4206305db96SHeinrich Schuchardtour $DeclareMisordered; 421dd88ab32SMasahiro Yamada 422dd88ab32SMasahiro Yamadaour $NON_ASCII_UTF8 = qr{ 423dd88ab32SMasahiro Yamada [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte 424dd88ab32SMasahiro Yamada | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs 425dd88ab32SMasahiro Yamada | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte 426dd88ab32SMasahiro Yamada | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates 427dd88ab32SMasahiro Yamada | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 428dd88ab32SMasahiro Yamada | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 429dd88ab32SMasahiro Yamada | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 430dd88ab32SMasahiro Yamada}x; 431dd88ab32SMasahiro Yamada 432dd88ab32SMasahiro Yamadaour $UTF8 = qr{ 433dd88ab32SMasahiro Yamada [\x09\x0A\x0D\x20-\x7E] # ASCII 434dd88ab32SMasahiro Yamada | $NON_ASCII_UTF8 435dd88ab32SMasahiro Yamada}x; 436dd88ab32SMasahiro Yamada 4376305db96SHeinrich Schuchardtour $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t}; 4386305db96SHeinrich Schuchardtour $typeOtherOSTypedefs = qr{(?x: 4396305db96SHeinrich Schuchardt u_(?:char|short|int|long) | # bsd 4406305db96SHeinrich Schuchardt u(?:nchar|short|int|long) # sysv 4416305db96SHeinrich Schuchardt)}; 4426305db96SHeinrich Schuchardtour $typeKernelTypedefs = qr{(?x: 443dd88ab32SMasahiro Yamada (?:__)?(?:u|s|be|le)(?:8|16|32|64)| 444dd88ab32SMasahiro Yamada atomic_t 445dd88ab32SMasahiro Yamada)}; 4466305db96SHeinrich Schuchardtour $typeTypedefs = qr{(?x: 4476305db96SHeinrich Schuchardt $typeC99Typedefs\b| 4486305db96SHeinrich Schuchardt $typeOtherOSTypedefs\b| 4496305db96SHeinrich Schuchardt $typeKernelTypedefs\b 4506305db96SHeinrich Schuchardt)}; 4516305db96SHeinrich Schuchardt 4526305db96SHeinrich Schuchardtour $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b}; 453dd88ab32SMasahiro Yamada 454dd88ab32SMasahiro Yamadaour $logFunctions = qr{(?x: 4556305db96SHeinrich Schuchardt printk(?:_ratelimited|_once|_deferred_once|_deferred|)| 4566b9709d9STom Rini (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)| 457*c398f2dfSHeinrich Schuchardt TP_printk| 458dd88ab32SMasahiro Yamada WARN(?:_RATELIMIT|_ONCE|)| 459dd88ab32SMasahiro Yamada panic| 4606b9709d9STom Rini MODULE_[A-Z_]+| 4616b9709d9STom Rini seq_vprintf|seq_printf|seq_puts 462dd88ab32SMasahiro Yamada)}; 463dd88ab32SMasahiro Yamada 464dd88ab32SMasahiro Yamadaour $signature_tags = qr{(?xi: 465dd88ab32SMasahiro Yamada Signed-off-by:| 466dd88ab32SMasahiro Yamada Acked-by:| 467dd88ab32SMasahiro Yamada Tested-by:| 468dd88ab32SMasahiro Yamada Reviewed-by:| 469dd88ab32SMasahiro Yamada Reported-by:| 4706b9709d9STom Rini Suggested-by:| 471dd88ab32SMasahiro Yamada To:| 472dd88ab32SMasahiro Yamada Cc: 473dd88ab32SMasahiro Yamada)}; 474dd88ab32SMasahiro Yamada 4756305db96SHeinrich Schuchardtour @typeListMisordered = ( 4766305db96SHeinrich Schuchardt qr{char\s+(?:un)?signed}, 4776305db96SHeinrich Schuchardt qr{int\s+(?:(?:un)?signed\s+)?short\s}, 4786305db96SHeinrich Schuchardt qr{int\s+short(?:\s+(?:un)?signed)}, 4796305db96SHeinrich Schuchardt qr{short\s+int(?:\s+(?:un)?signed)}, 4806305db96SHeinrich Schuchardt qr{(?:un)?signed\s+int\s+short}, 4816305db96SHeinrich Schuchardt qr{short\s+(?:un)?signed}, 4826305db96SHeinrich Schuchardt qr{long\s+int\s+(?:un)?signed}, 4836305db96SHeinrich Schuchardt qr{int\s+long\s+(?:un)?signed}, 4846305db96SHeinrich Schuchardt qr{long\s+(?:un)?signed\s+int}, 4856305db96SHeinrich Schuchardt qr{int\s+(?:un)?signed\s+long}, 4866305db96SHeinrich Schuchardt qr{int\s+(?:un)?signed}, 4876305db96SHeinrich Schuchardt qr{int\s+long\s+long\s+(?:un)?signed}, 4886305db96SHeinrich Schuchardt qr{long\s+long\s+int\s+(?:un)?signed}, 4896305db96SHeinrich Schuchardt qr{long\s+long\s+(?:un)?signed\s+int}, 4906305db96SHeinrich Schuchardt qr{long\s+long\s+(?:un)?signed}, 4916305db96SHeinrich Schuchardt qr{long\s+(?:un)?signed}, 4926305db96SHeinrich Schuchardt); 4936305db96SHeinrich Schuchardt 494dd88ab32SMasahiro Yamadaour @typeList = ( 495dd88ab32SMasahiro Yamada qr{void}, 4966305db96SHeinrich Schuchardt qr{(?:(?:un)?signed\s+)?char}, 4976305db96SHeinrich Schuchardt qr{(?:(?:un)?signed\s+)?short\s+int}, 4986305db96SHeinrich Schuchardt qr{(?:(?:un)?signed\s+)?short}, 4996305db96SHeinrich Schuchardt qr{(?:(?:un)?signed\s+)?int}, 5006305db96SHeinrich Schuchardt qr{(?:(?:un)?signed\s+)?long\s+int}, 5016305db96SHeinrich Schuchardt qr{(?:(?:un)?signed\s+)?long\s+long\s+int}, 5026305db96SHeinrich Schuchardt qr{(?:(?:un)?signed\s+)?long\s+long}, 5036305db96SHeinrich Schuchardt qr{(?:(?:un)?signed\s+)?long}, 5046305db96SHeinrich Schuchardt qr{(?:un)?signed}, 505dd88ab32SMasahiro Yamada qr{float}, 506dd88ab32SMasahiro Yamada qr{double}, 507dd88ab32SMasahiro Yamada qr{bool}, 508dd88ab32SMasahiro Yamada qr{struct\s+$Ident}, 509dd88ab32SMasahiro Yamada qr{union\s+$Ident}, 510dd88ab32SMasahiro Yamada qr{enum\s+$Ident}, 511dd88ab32SMasahiro Yamada qr{${Ident}_t}, 512dd88ab32SMasahiro Yamada qr{${Ident}_handler}, 513dd88ab32SMasahiro Yamada qr{${Ident}_handler_fn}, 5146305db96SHeinrich Schuchardt @typeListMisordered, 515dd88ab32SMasahiro Yamada); 5166305db96SHeinrich Schuchardt 5176305db96SHeinrich Schuchardtour $C90_int_types = qr{(?x: 5186305db96SHeinrich Schuchardt long\s+long\s+int\s+(?:un)?signed| 5196305db96SHeinrich Schuchardt long\s+long\s+(?:un)?signed\s+int| 5206305db96SHeinrich Schuchardt long\s+long\s+(?:un)?signed| 5216305db96SHeinrich Schuchardt (?:(?:un)?signed\s+)?long\s+long\s+int| 5226305db96SHeinrich Schuchardt (?:(?:un)?signed\s+)?long\s+long| 5236305db96SHeinrich Schuchardt int\s+long\s+long\s+(?:un)?signed| 5246305db96SHeinrich Schuchardt int\s+(?:(?:un)?signed\s+)?long\s+long| 5256305db96SHeinrich Schuchardt 5266305db96SHeinrich Schuchardt long\s+int\s+(?:un)?signed| 5276305db96SHeinrich Schuchardt long\s+(?:un)?signed\s+int| 5286305db96SHeinrich Schuchardt long\s+(?:un)?signed| 5296305db96SHeinrich Schuchardt (?:(?:un)?signed\s+)?long\s+int| 5306305db96SHeinrich Schuchardt (?:(?:un)?signed\s+)?long| 5316305db96SHeinrich Schuchardt int\s+long\s+(?:un)?signed| 5326305db96SHeinrich Schuchardt int\s+(?:(?:un)?signed\s+)?long| 5336305db96SHeinrich Schuchardt 5346305db96SHeinrich Schuchardt int\s+(?:un)?signed| 5356305db96SHeinrich Schuchardt (?:(?:un)?signed\s+)?int 5366305db96SHeinrich Schuchardt)}; 5376305db96SHeinrich Schuchardt 5386305db96SHeinrich Schuchardtour @typeListFile = (); 5396b9709d9STom Riniour @typeListWithAttr = ( 5406b9709d9STom Rini @typeList, 5416b9709d9STom Rini qr{struct\s+$InitAttribute\s+$Ident}, 5426b9709d9STom Rini qr{union\s+$InitAttribute\s+$Ident}, 5436b9709d9STom Rini); 5446b9709d9STom Rini 545dd88ab32SMasahiro Yamadaour @modifierList = ( 546dd88ab32SMasahiro Yamada qr{fastcall}, 547dd88ab32SMasahiro Yamada); 5486305db96SHeinrich Schuchardtour @modifierListFile = (); 5496305db96SHeinrich Schuchardt 5506305db96SHeinrich Schuchardtour @mode_permission_funcs = ( 5516305db96SHeinrich Schuchardt ["module_param", 3], 5526305db96SHeinrich Schuchardt ["module_param_(?:array|named|string)", 4], 5536305db96SHeinrich Schuchardt ["module_param_array_named", 5], 5546305db96SHeinrich Schuchardt ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2], 5556305db96SHeinrich Schuchardt ["proc_create(?:_data|)", 2], 5566305db96SHeinrich Schuchardt ["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2], 5576305db96SHeinrich Schuchardt ["IIO_DEV_ATTR_[A-Z_]+", 1], 5586305db96SHeinrich Schuchardt ["SENSOR_(?:DEVICE_|)ATTR_2", 2], 5596305db96SHeinrich Schuchardt ["SENSOR_TEMPLATE(?:_2|)", 3], 5606305db96SHeinrich Schuchardt ["__ATTR", 2], 5616305db96SHeinrich Schuchardt); 5626305db96SHeinrich Schuchardt 5636305db96SHeinrich Schuchardt#Create a search pattern for all these functions to speed up a loop below 5646305db96SHeinrich Schuchardtour $mode_perms_search = ""; 5656305db96SHeinrich Schuchardtforeach my $entry (@mode_permission_funcs) { 5666305db96SHeinrich Schuchardt $mode_perms_search .= '|' if ($mode_perms_search ne ""); 5676305db96SHeinrich Schuchardt $mode_perms_search .= $entry->[0]; 5686305db96SHeinrich Schuchardt} 569*c398f2dfSHeinrich Schuchardt$mode_perms_search = "(?:${mode_perms_search})"; 5706305db96SHeinrich Schuchardt 5716305db96SHeinrich Schuchardtour $mode_perms_world_writable = qr{ 5726305db96SHeinrich Schuchardt S_IWUGO | 5736305db96SHeinrich Schuchardt S_IWOTH | 5746305db96SHeinrich Schuchardt S_IRWXUGO | 5756305db96SHeinrich Schuchardt S_IALLUGO | 5766305db96SHeinrich Schuchardt 0[0-7][0-7][2367] 5776305db96SHeinrich Schuchardt}x; 5786305db96SHeinrich Schuchardt 5796305db96SHeinrich Schuchardtour %mode_permission_string_types = ( 5806305db96SHeinrich Schuchardt "S_IRWXU" => 0700, 5816305db96SHeinrich Schuchardt "S_IRUSR" => 0400, 5826305db96SHeinrich Schuchardt "S_IWUSR" => 0200, 5836305db96SHeinrich Schuchardt "S_IXUSR" => 0100, 5846305db96SHeinrich Schuchardt "S_IRWXG" => 0070, 5856305db96SHeinrich Schuchardt "S_IRGRP" => 0040, 5866305db96SHeinrich Schuchardt "S_IWGRP" => 0020, 5876305db96SHeinrich Schuchardt "S_IXGRP" => 0010, 5886305db96SHeinrich Schuchardt "S_IRWXO" => 0007, 5896305db96SHeinrich Schuchardt "S_IROTH" => 0004, 5906305db96SHeinrich Schuchardt "S_IWOTH" => 0002, 5916305db96SHeinrich Schuchardt "S_IXOTH" => 0001, 5926305db96SHeinrich Schuchardt "S_IRWXUGO" => 0777, 5936305db96SHeinrich Schuchardt "S_IRUGO" => 0444, 5946305db96SHeinrich Schuchardt "S_IWUGO" => 0222, 5956305db96SHeinrich Schuchardt "S_IXUGO" => 0111, 5966305db96SHeinrich Schuchardt); 5976305db96SHeinrich Schuchardt 5986305db96SHeinrich Schuchardt#Create a search pattern for all these strings to speed up a loop below 5996305db96SHeinrich Schuchardtour $mode_perms_string_search = ""; 6006305db96SHeinrich Schuchardtforeach my $entry (keys %mode_permission_string_types) { 6016305db96SHeinrich Schuchardt $mode_perms_string_search .= '|' if ($mode_perms_string_search ne ""); 6026305db96SHeinrich Schuchardt $mode_perms_string_search .= $entry; 6036305db96SHeinrich Schuchardt} 604*c398f2dfSHeinrich Schuchardtour $single_mode_perms_string_search = "(?:${mode_perms_string_search})"; 605*c398f2dfSHeinrich Schuchardtour $multi_mode_perms_string_search = qr{ 606*c398f2dfSHeinrich Schuchardt ${single_mode_perms_string_search} 607*c398f2dfSHeinrich Schuchardt (?:\s*\|\s*${single_mode_perms_string_search})* 608*c398f2dfSHeinrich Schuchardt}x; 609*c398f2dfSHeinrich Schuchardt 610*c398f2dfSHeinrich Schuchardtsub perms_to_octal { 611*c398f2dfSHeinrich Schuchardt my ($string) = @_; 612*c398f2dfSHeinrich Schuchardt 613*c398f2dfSHeinrich Schuchardt return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/); 614*c398f2dfSHeinrich Schuchardt 615*c398f2dfSHeinrich Schuchardt my $val = ""; 616*c398f2dfSHeinrich Schuchardt my $oval = ""; 617*c398f2dfSHeinrich Schuchardt my $to = 0; 618*c398f2dfSHeinrich Schuchardt my $curpos = 0; 619*c398f2dfSHeinrich Schuchardt my $lastpos = 0; 620*c398f2dfSHeinrich Schuchardt while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) { 621*c398f2dfSHeinrich Schuchardt $curpos = pos($string); 622*c398f2dfSHeinrich Schuchardt my $match = $2; 623*c398f2dfSHeinrich Schuchardt my $omatch = $1; 624*c398f2dfSHeinrich Schuchardt last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos)); 625*c398f2dfSHeinrich Schuchardt $lastpos = $curpos; 626*c398f2dfSHeinrich Schuchardt $to |= $mode_permission_string_types{$match}; 627*c398f2dfSHeinrich Schuchardt $val .= '\s*\|\s*' if ($val ne ""); 628*c398f2dfSHeinrich Schuchardt $val .= $match; 629*c398f2dfSHeinrich Schuchardt $oval .= $omatch; 630*c398f2dfSHeinrich Schuchardt } 631*c398f2dfSHeinrich Schuchardt $oval =~ s/^\s*\|\s*//; 632*c398f2dfSHeinrich Schuchardt $oval =~ s/\s*\|\s*$//; 633*c398f2dfSHeinrich Schuchardt return sprintf("%04o", $to); 634*c398f2dfSHeinrich Schuchardt} 635dd88ab32SMasahiro Yamada 636dd88ab32SMasahiro Yamadaour $allowed_asm_includes = qr{(?x: 637dd88ab32SMasahiro Yamada irq| 6386305db96SHeinrich Schuchardt memory| 6396305db96SHeinrich Schuchardt time| 6406305db96SHeinrich Schuchardt reboot 641dd88ab32SMasahiro Yamada)}; 642dd88ab32SMasahiro Yamada# memory.h: ARM has a custom one 643dd88ab32SMasahiro Yamada 644c10e0f5bSDan Murphy# Load common spelling mistakes and build regular expression list. 645c10e0f5bSDan Murphymy $misspellings; 646c10e0f5bSDan Murphymy %spelling_fix; 647c10e0f5bSDan Murphy 648c10e0f5bSDan Murphyif (open(my $spelling, '<', $spelling_file)) { 649c10e0f5bSDan Murphy while (<$spelling>) { 650c10e0f5bSDan Murphy my $line = $_; 651c10e0f5bSDan Murphy 652c10e0f5bSDan Murphy $line =~ s/\s*\n?$//g; 653c10e0f5bSDan Murphy $line =~ s/^\s*//g; 654c10e0f5bSDan Murphy 655c10e0f5bSDan Murphy next if ($line =~ m/^\s*#/); 656c10e0f5bSDan Murphy next if ($line =~ m/^\s*$/); 657c10e0f5bSDan Murphy 658c10e0f5bSDan Murphy my ($suspect, $fix) = split(/\|\|/, $line); 659c10e0f5bSDan Murphy 660c10e0f5bSDan Murphy $spelling_fix{$suspect} = $fix; 661c10e0f5bSDan Murphy } 662c10e0f5bSDan Murphy close($spelling); 663c10e0f5bSDan Murphy} else { 664c10e0f5bSDan Murphy warn "No typos will be found - file '$spelling_file': $!\n"; 665c10e0f5bSDan Murphy} 666c10e0f5bSDan Murphy 667c10e0f5bSDan Murphyif ($codespell) { 668c10e0f5bSDan Murphy if (open(my $spelling, '<', $codespellfile)) { 669c10e0f5bSDan Murphy while (<$spelling>) { 670c10e0f5bSDan Murphy my $line = $_; 671c10e0f5bSDan Murphy 672c10e0f5bSDan Murphy $line =~ s/\s*\n?$//g; 673c10e0f5bSDan Murphy $line =~ s/^\s*//g; 674c10e0f5bSDan Murphy 675c10e0f5bSDan Murphy next if ($line =~ m/^\s*#/); 676c10e0f5bSDan Murphy next if ($line =~ m/^\s*$/); 677c10e0f5bSDan Murphy next if ($line =~ m/, disabled/i); 678c10e0f5bSDan Murphy 679c10e0f5bSDan Murphy $line =~ s/,.*$//; 680c10e0f5bSDan Murphy 681c10e0f5bSDan Murphy my ($suspect, $fix) = split(/->/, $line); 682c10e0f5bSDan Murphy 683c10e0f5bSDan Murphy $spelling_fix{$suspect} = $fix; 684c10e0f5bSDan Murphy } 685c10e0f5bSDan Murphy close($spelling); 686c10e0f5bSDan Murphy } else { 687c10e0f5bSDan Murphy warn "No codespell typos will be found - file '$codespellfile': $!\n"; 688c10e0f5bSDan Murphy } 689c10e0f5bSDan Murphy} 690c10e0f5bSDan Murphy 691c10e0f5bSDan Murphy$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix; 692c10e0f5bSDan Murphy 6936305db96SHeinrich Schuchardtsub read_words { 6946305db96SHeinrich Schuchardt my ($wordsRef, $file) = @_; 6956305db96SHeinrich Schuchardt 6966305db96SHeinrich Schuchardt if (open(my $words, '<', $file)) { 6976305db96SHeinrich Schuchardt while (<$words>) { 6986305db96SHeinrich Schuchardt my $line = $_; 6996305db96SHeinrich Schuchardt 7006305db96SHeinrich Schuchardt $line =~ s/\s*\n?$//g; 7016305db96SHeinrich Schuchardt $line =~ s/^\s*//g; 7026305db96SHeinrich Schuchardt 7036305db96SHeinrich Schuchardt next if ($line =~ m/^\s*#/); 7046305db96SHeinrich Schuchardt next if ($line =~ m/^\s*$/); 7056305db96SHeinrich Schuchardt if ($line =~ /\s/) { 7066305db96SHeinrich Schuchardt print("$file: '$line' invalid - ignored\n"); 7076305db96SHeinrich Schuchardt next; 7086305db96SHeinrich Schuchardt } 7096305db96SHeinrich Schuchardt 7106305db96SHeinrich Schuchardt $$wordsRef .= '|' if ($$wordsRef ne ""); 7116305db96SHeinrich Schuchardt $$wordsRef .= $line; 7126305db96SHeinrich Schuchardt } 7136305db96SHeinrich Schuchardt close($file); 7146305db96SHeinrich Schuchardt return 1; 7156305db96SHeinrich Schuchardt } 7166305db96SHeinrich Schuchardt 7176305db96SHeinrich Schuchardt return 0; 7186305db96SHeinrich Schuchardt} 7196305db96SHeinrich Schuchardt 7206305db96SHeinrich Schuchardtmy $const_structs = ""; 7216305db96SHeinrich Schuchardtread_words(\$const_structs, $conststructsfile) 7226305db96SHeinrich Schuchardt or warn "No structs that should be const will be found - file '$conststructsfile': $!\n"; 7236305db96SHeinrich Schuchardt 7246305db96SHeinrich Schuchardtmy $typeOtherTypedefs = ""; 7256305db96SHeinrich Schuchardtif (length($typedefsfile)) { 7266305db96SHeinrich Schuchardt read_words(\$typeOtherTypedefs, $typedefsfile) 7276305db96SHeinrich Schuchardt or warn "No additional types will be considered - file '$typedefsfile': $!\n"; 7286305db96SHeinrich Schuchardt} 7296305db96SHeinrich Schuchardt$typeTypedefs .= '|' . $typeOtherTypedefs if ($typeOtherTypedefs ne ""); 730c10e0f5bSDan Murphy 731dd88ab32SMasahiro Yamadasub build_types { 7326305db96SHeinrich Schuchardt my $mods = "(?x: \n" . join("|\n ", (@modifierList, @modifierListFile)) . "\n)"; 7336305db96SHeinrich Schuchardt my $all = "(?x: \n" . join("|\n ", (@typeList, @typeListFile)) . "\n)"; 7346305db96SHeinrich Schuchardt my $Misordered = "(?x: \n" . join("|\n ", @typeListMisordered) . "\n)"; 7356b9709d9STom Rini my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)"; 736dd88ab32SMasahiro Yamada $Modifier = qr{(?:$Attribute|$Sparse|$mods)}; 7376305db96SHeinrich Schuchardt $BasicType = qr{ 7386305db96SHeinrich Schuchardt (?:$typeTypedefs\b)| 7396305db96SHeinrich Schuchardt (?:${all}\b) 7406305db96SHeinrich Schuchardt }x; 741dd88ab32SMasahiro Yamada $NonptrType = qr{ 742dd88ab32SMasahiro Yamada (?:$Modifier\s+|const\s+)* 743dd88ab32SMasahiro Yamada (?: 744dd88ab32SMasahiro Yamada (?:typeof|__typeof__)\s*\([^\)]*\)| 745dd88ab32SMasahiro Yamada (?:$typeTypedefs\b)| 746dd88ab32SMasahiro Yamada (?:${all}\b) 747dd88ab32SMasahiro Yamada ) 748dd88ab32SMasahiro Yamada (?:\s+$Modifier|\s+const)* 749dd88ab32SMasahiro Yamada }x; 7506305db96SHeinrich Schuchardt $NonptrTypeMisordered = qr{ 7516305db96SHeinrich Schuchardt (?:$Modifier\s+|const\s+)* 7526305db96SHeinrich Schuchardt (?: 7536305db96SHeinrich Schuchardt (?:${Misordered}\b) 7546305db96SHeinrich Schuchardt ) 7556305db96SHeinrich Schuchardt (?:\s+$Modifier|\s+const)* 7566305db96SHeinrich Schuchardt }x; 7576b9709d9STom Rini $NonptrTypeWithAttr = qr{ 7586b9709d9STom Rini (?:$Modifier\s+|const\s+)* 7596b9709d9STom Rini (?: 7606b9709d9STom Rini (?:typeof|__typeof__)\s*\([^\)]*\)| 7616b9709d9STom Rini (?:$typeTypedefs\b)| 7626b9709d9STom Rini (?:${allWithAttr}\b) 7636b9709d9STom Rini ) 7646b9709d9STom Rini (?:\s+$Modifier|\s+const)* 7656b9709d9STom Rini }x; 766dd88ab32SMasahiro Yamada $Type = qr{ 767dd88ab32SMasahiro Yamada $NonptrType 7686305db96SHeinrich Schuchardt (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)? 769dd88ab32SMasahiro Yamada (?:\s+$Inline|\s+$Modifier)* 770dd88ab32SMasahiro Yamada }x; 7716305db96SHeinrich Schuchardt $TypeMisordered = qr{ 7726305db96SHeinrich Schuchardt $NonptrTypeMisordered 7736305db96SHeinrich Schuchardt (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)? 7746305db96SHeinrich Schuchardt (?:\s+$Inline|\s+$Modifier)* 7756305db96SHeinrich Schuchardt }x; 7766305db96SHeinrich Schuchardt $Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type}; 7776305db96SHeinrich Schuchardt $DeclareMisordered = qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered}; 778dd88ab32SMasahiro Yamada} 779dd88ab32SMasahiro Yamadabuild_types(); 780dd88ab32SMasahiro Yamada 781dd88ab32SMasahiro Yamadaour $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*}; 782dd88ab32SMasahiro Yamada 783dd88ab32SMasahiro Yamada# Using $balanced_parens, $LvalOrFunc, or $FuncArg 784dd88ab32SMasahiro Yamada# requires at least perl version v5.10.0 785dd88ab32SMasahiro Yamada# Any use must be runtime checked with $^V 786dd88ab32SMasahiro Yamada 787dd88ab32SMasahiro Yamadaour $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/; 7886305db96SHeinrich Schuchardtour $LvalOrFunc = qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*}; 7896305db96SHeinrich Schuchardtour $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)}; 7906305db96SHeinrich Schuchardt 7916305db96SHeinrich Schuchardtour $declaration_macros = qr{(?x: 7926305db96SHeinrich Schuchardt (?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(| 7936305db96SHeinrich Schuchardt (?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(| 794*c398f2dfSHeinrich Schuchardt (?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(| 795*c398f2dfSHeinrich Schuchardt (?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\( 7966305db96SHeinrich Schuchardt)}; 797dd88ab32SMasahiro Yamada 798dd88ab32SMasahiro Yamadasub deparenthesize { 799dd88ab32SMasahiro Yamada my ($string) = @_; 800dd88ab32SMasahiro Yamada return "" if (!defined($string)); 8016305db96SHeinrich Schuchardt 8026305db96SHeinrich Schuchardt while ($string =~ /^\s*\(.*\)\s*$/) { 8036305db96SHeinrich Schuchardt $string =~ s@^\s*\(\s*@@; 8046305db96SHeinrich Schuchardt $string =~ s@\s*\)\s*$@@; 8056305db96SHeinrich Schuchardt } 8066305db96SHeinrich Schuchardt 807dd88ab32SMasahiro Yamada $string =~ s@\s+@ @g; 8086305db96SHeinrich Schuchardt 809dd88ab32SMasahiro Yamada return $string; 810dd88ab32SMasahiro Yamada} 811dd88ab32SMasahiro Yamada 8126b9709d9STom Rinisub seed_camelcase_file { 8136b9709d9STom Rini my ($file) = @_; 8146b9709d9STom Rini 8156b9709d9STom Rini return if (!(-f $file)); 8166b9709d9STom Rini 8176b9709d9STom Rini local $/; 8186b9709d9STom Rini 8196b9709d9STom Rini open(my $include_file, '<', "$file") 8206b9709d9STom Rini or warn "$P: Can't read '$file' $!\n"; 8216b9709d9STom Rini my $text = <$include_file>; 8226b9709d9STom Rini close($include_file); 8236b9709d9STom Rini 8246b9709d9STom Rini my @lines = split('\n', $text); 8256b9709d9STom Rini 8266b9709d9STom Rini foreach my $line (@lines) { 8276b9709d9STom Rini next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/); 8286b9709d9STom Rini if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) { 8296b9709d9STom Rini $camelcase{$1} = 1; 8306b9709d9STom Rini } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) { 8316b9709d9STom Rini $camelcase{$1} = 1; 8326b9709d9STom Rini } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) { 8336b9709d9STom Rini $camelcase{$1} = 1; 8346b9709d9STom Rini } 8356b9709d9STom Rini } 8366b9709d9STom Rini} 8376b9709d9STom Rini 8386305db96SHeinrich Schuchardtsub is_maintained_obsolete { 8396305db96SHeinrich Schuchardt my ($filename) = @_; 8406305db96SHeinrich Schuchardt 8416305db96SHeinrich Schuchardt return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl")); 8426305db96SHeinrich Schuchardt 8436305db96SHeinrich Schuchardt my $status = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`; 8446305db96SHeinrich Schuchardt 8456305db96SHeinrich Schuchardt return $status =~ /obsolete/i; 8466305db96SHeinrich Schuchardt} 8476305db96SHeinrich Schuchardt 8486b9709d9STom Rinimy $camelcase_seeded = 0; 8496b9709d9STom Rinisub seed_camelcase_includes { 8506b9709d9STom Rini return if ($camelcase_seeded); 8516b9709d9STom Rini 8526b9709d9STom Rini my $files; 8536b9709d9STom Rini my $camelcase_cache = ""; 8546b9709d9STom Rini my @include_files = (); 8556b9709d9STom Rini 8566b9709d9STom Rini $camelcase_seeded = 1; 8576b9709d9STom Rini 8586b9709d9STom Rini if (-e ".git") { 8596b9709d9STom Rini my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`; 8606b9709d9STom Rini chomp $git_last_include_commit; 8616b9709d9STom Rini $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit"; 8626b9709d9STom Rini } else { 8636b9709d9STom Rini my $last_mod_date = 0; 8646b9709d9STom Rini $files = `find $root/include -name "*.h"`; 8656b9709d9STom Rini @include_files = split('\n', $files); 8666b9709d9STom Rini foreach my $file (@include_files) { 8676b9709d9STom Rini my $date = POSIX::strftime("%Y%m%d%H%M", 8686b9709d9STom Rini localtime((stat $file)[9])); 8696b9709d9STom Rini $last_mod_date = $date if ($last_mod_date < $date); 8706b9709d9STom Rini } 8716b9709d9STom Rini $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date"; 8726b9709d9STom Rini } 8736b9709d9STom Rini 8746b9709d9STom Rini if ($camelcase_cache ne "" && -f $camelcase_cache) { 8756b9709d9STom Rini open(my $camelcase_file, '<', "$camelcase_cache") 8766b9709d9STom Rini or warn "$P: Can't read '$camelcase_cache' $!\n"; 8776b9709d9STom Rini while (<$camelcase_file>) { 8786b9709d9STom Rini chomp; 8796b9709d9STom Rini $camelcase{$_} = 1; 8806b9709d9STom Rini } 8816b9709d9STom Rini close($camelcase_file); 8826b9709d9STom Rini 8836b9709d9STom Rini return; 8846b9709d9STom Rini } 8856b9709d9STom Rini 8866b9709d9STom Rini if (-e ".git") { 8876b9709d9STom Rini $files = `git ls-files "include/*.h"`; 8886b9709d9STom Rini @include_files = split('\n', $files); 8896b9709d9STom Rini } 8906b9709d9STom Rini 8916b9709d9STom Rini foreach my $file (@include_files) { 8926b9709d9STom Rini seed_camelcase_file($file); 8936b9709d9STom Rini } 8946b9709d9STom Rini 8956b9709d9STom Rini if ($camelcase_cache ne "") { 8966b9709d9STom Rini unlink glob ".checkpatch-camelcase.*"; 8976b9709d9STom Rini open(my $camelcase_file, '>', "$camelcase_cache") 8986b9709d9STom Rini or warn "$P: Can't write '$camelcase_cache' $!\n"; 8996b9709d9STom Rini foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) { 9006b9709d9STom Rini print $camelcase_file ("$_\n"); 9016b9709d9STom Rini } 9026b9709d9STom Rini close($camelcase_file); 9036b9709d9STom Rini } 9046b9709d9STom Rini} 9056b9709d9STom Rini 9066305db96SHeinrich Schuchardtsub git_commit_info { 9076305db96SHeinrich Schuchardt my ($commit, $id, $desc) = @_; 9086305db96SHeinrich Schuchardt 9096305db96SHeinrich Schuchardt return ($id, $desc) if ((which("git") eq "") || !(-e ".git")); 9106305db96SHeinrich Schuchardt 9116305db96SHeinrich Schuchardt my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`; 9126305db96SHeinrich Schuchardt $output =~ s/^\s*//gm; 9136305db96SHeinrich Schuchardt my @lines = split("\n", $output); 9146305db96SHeinrich Schuchardt 9156305db96SHeinrich Schuchardt return ($id, $desc) if ($#lines < 0); 9166305db96SHeinrich Schuchardt 9176305db96SHeinrich Schuchardt if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) { 9186305db96SHeinrich Schuchardt# Maybe one day convert this block of bash into something that returns 9196305db96SHeinrich Schuchardt# all matching commit ids, but it's very slow... 9206305db96SHeinrich Schuchardt# 9216305db96SHeinrich Schuchardt# echo "checking commits $1..." 9226305db96SHeinrich Schuchardt# git rev-list --remotes | grep -i "^$1" | 9236305db96SHeinrich Schuchardt# while read line ; do 9246305db96SHeinrich Schuchardt# git log --format='%H %s' -1 $line | 9256305db96SHeinrich Schuchardt# echo "commit $(cut -c 1-12,41-)" 9266305db96SHeinrich Schuchardt# done 9276305db96SHeinrich Schuchardt } elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) { 9286305db96SHeinrich Schuchardt $id = undef; 9296305db96SHeinrich Schuchardt } else { 9306305db96SHeinrich Schuchardt $id = substr($lines[0], 0, 12); 9316305db96SHeinrich Schuchardt $desc = substr($lines[0], 41); 9326305db96SHeinrich Schuchardt } 9336305db96SHeinrich Schuchardt 9346305db96SHeinrich Schuchardt return ($id, $desc); 9356305db96SHeinrich Schuchardt} 9366305db96SHeinrich Schuchardt 937dd88ab32SMasahiro Yamada$chk_signoff = 0 if ($file); 938dd88ab32SMasahiro Yamada 939dd88ab32SMasahiro Yamadamy @rawlines = (); 940dd88ab32SMasahiro Yamadamy @lines = (); 9416b9709d9STom Rinimy @fixed = (); 9426305db96SHeinrich Schuchardtmy @fixed_inserted = (); 9436305db96SHeinrich Schuchardtmy @fixed_deleted = (); 944c10e0f5bSDan Murphymy $fixlinenr = -1; 945c10e0f5bSDan Murphy 9466305db96SHeinrich Schuchardt# If input is git commits, extract all commits from the commit expressions. 9476305db96SHeinrich Schuchardt# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'. 9486305db96SHeinrich Schuchardtdie "$P: No git repository found\n" if ($git && !-e ".git"); 9496305db96SHeinrich Schuchardt 9506305db96SHeinrich Schuchardtif ($git) { 9516305db96SHeinrich Schuchardt my @commits = (); 9526305db96SHeinrich Schuchardt foreach my $commit_expr (@ARGV) { 9536305db96SHeinrich Schuchardt my $git_range; 9546305db96SHeinrich Schuchardt if ($commit_expr =~ m/^(.*)-(\d+)$/) { 9556305db96SHeinrich Schuchardt $git_range = "-$2 $1"; 9566305db96SHeinrich Schuchardt } elsif ($commit_expr =~ m/\.\./) { 9576305db96SHeinrich Schuchardt $git_range = "$commit_expr"; 9586305db96SHeinrich Schuchardt } else { 9596305db96SHeinrich Schuchardt $git_range = "-1 $commit_expr"; 9606305db96SHeinrich Schuchardt } 9616305db96SHeinrich Schuchardt my $lines = `git log --no-color --no-merges --pretty=format:'%H %s' $git_range`; 9626305db96SHeinrich Schuchardt foreach my $line (split(/\n/, $lines)) { 9636305db96SHeinrich Schuchardt $line =~ /^([0-9a-fA-F]{40,40}) (.*)$/; 9646305db96SHeinrich Schuchardt next if (!defined($1) || !defined($2)); 9656305db96SHeinrich Schuchardt my $sha1 = $1; 9666305db96SHeinrich Schuchardt my $subject = $2; 9676305db96SHeinrich Schuchardt unshift(@commits, $sha1); 9686305db96SHeinrich Schuchardt $git_commits{$sha1} = $subject; 9696305db96SHeinrich Schuchardt } 9706305db96SHeinrich Schuchardt } 9716305db96SHeinrich Schuchardt die "$P: no git commits after extraction!\n" if (@commits == 0); 9726305db96SHeinrich Schuchardt @ARGV = @commits; 9736305db96SHeinrich Schuchardt} 9746305db96SHeinrich Schuchardt 9756305db96SHeinrich Schuchardtmy $vname; 976dd88ab32SMasahiro Yamadafor my $filename (@ARGV) { 977dd88ab32SMasahiro Yamada my $FILE; 9786305db96SHeinrich Schuchardt if ($git) { 9796305db96SHeinrich Schuchardt open($FILE, '-|', "git format-patch -M --stdout -1 $filename") || 9806305db96SHeinrich Schuchardt die "$P: $filename: git format-patch failed - $!\n"; 9816305db96SHeinrich Schuchardt } elsif ($file) { 982dd88ab32SMasahiro Yamada open($FILE, '-|', "diff -u /dev/null $filename") || 983dd88ab32SMasahiro Yamada die "$P: $filename: diff failed - $!\n"; 984dd88ab32SMasahiro Yamada } elsif ($filename eq '-') { 985dd88ab32SMasahiro Yamada open($FILE, '<&STDIN'); 986dd88ab32SMasahiro Yamada } else { 987dd88ab32SMasahiro Yamada open($FILE, '<', "$filename") || 988dd88ab32SMasahiro Yamada die "$P: $filename: open failed - $!\n"; 989dd88ab32SMasahiro Yamada } 990dd88ab32SMasahiro Yamada if ($filename eq '-') { 991dd88ab32SMasahiro Yamada $vname = 'Your patch'; 9926305db96SHeinrich Schuchardt } elsif ($git) { 9936305db96SHeinrich Schuchardt $vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")'; 994dd88ab32SMasahiro Yamada } else { 995dd88ab32SMasahiro Yamada $vname = $filename; 996dd88ab32SMasahiro Yamada } 997dd88ab32SMasahiro Yamada while (<$FILE>) { 998dd88ab32SMasahiro Yamada chomp; 999dd88ab32SMasahiro Yamada push(@rawlines, $_); 1000dd88ab32SMasahiro Yamada } 1001dd88ab32SMasahiro Yamada close($FILE); 10026305db96SHeinrich Schuchardt 10036305db96SHeinrich Schuchardt if ($#ARGV > 0 && $quiet == 0) { 10046305db96SHeinrich Schuchardt print '-' x length($vname) . "\n"; 10056305db96SHeinrich Schuchardt print "$vname\n"; 10066305db96SHeinrich Schuchardt print '-' x length($vname) . "\n"; 10076305db96SHeinrich Schuchardt } 10086305db96SHeinrich Schuchardt 1009dd88ab32SMasahiro Yamada if (!process($filename)) { 1010dd88ab32SMasahiro Yamada $exit = 1; 1011dd88ab32SMasahiro Yamada } 1012dd88ab32SMasahiro Yamada @rawlines = (); 1013dd88ab32SMasahiro Yamada @lines = (); 10146b9709d9STom Rini @fixed = (); 10156305db96SHeinrich Schuchardt @fixed_inserted = (); 10166305db96SHeinrich Schuchardt @fixed_deleted = (); 10176305db96SHeinrich Schuchardt $fixlinenr = -1; 10186305db96SHeinrich Schuchardt @modifierListFile = (); 10196305db96SHeinrich Schuchardt @typeListFile = (); 10206305db96SHeinrich Schuchardt build_types(); 10216305db96SHeinrich Schuchardt} 10226305db96SHeinrich Schuchardt 10236305db96SHeinrich Schuchardtif (!$quiet) { 10246305db96SHeinrich Schuchardt hash_show_words(\%use_type, "Used"); 10256305db96SHeinrich Schuchardt hash_show_words(\%ignore_type, "Ignored"); 10266305db96SHeinrich Schuchardt 10276305db96SHeinrich Schuchardt if ($^V lt 5.10.0) { 10286305db96SHeinrich Schuchardt print << "EOM" 10296305db96SHeinrich Schuchardt 10306305db96SHeinrich SchuchardtNOTE: perl $^V is not modern enough to detect all possible issues. 10316305db96SHeinrich Schuchardt An upgrade to at least perl v5.10.0 is suggested. 10326305db96SHeinrich SchuchardtEOM 10336305db96SHeinrich Schuchardt } 10346305db96SHeinrich Schuchardt if ($exit) { 10356305db96SHeinrich Schuchardt print << "EOM" 10366305db96SHeinrich Schuchardt 10376305db96SHeinrich SchuchardtNOTE: If any of the errors are false positives, please report 10386305db96SHeinrich Schuchardt them to the maintainer, see CHECKPATCH in MAINTAINERS. 10396305db96SHeinrich SchuchardtEOM 10406305db96SHeinrich Schuchardt } 1041dd88ab32SMasahiro Yamada} 1042dd88ab32SMasahiro Yamada 1043dd88ab32SMasahiro Yamadaexit($exit); 1044dd88ab32SMasahiro Yamada 1045dd88ab32SMasahiro Yamadasub top_of_kernel_tree { 1046dd88ab32SMasahiro Yamada my ($root) = @_; 1047dd88ab32SMasahiro Yamada 1048dd88ab32SMasahiro Yamada my @tree_check = ( 10496b9709d9STom Rini "COPYING", "CREDITS", "Kbuild", "MAINTAINERS", "Makefile", 1050dd88ab32SMasahiro Yamada "README", "Documentation", "arch", "include", "drivers", 1051dd88ab32SMasahiro Yamada "fs", "init", "ipc", "kernel", "lib", "scripts", 1052dd88ab32SMasahiro Yamada ); 1053dd88ab32SMasahiro Yamada 1054dd88ab32SMasahiro Yamada foreach my $check (@tree_check) { 1055dd88ab32SMasahiro Yamada if (! -e $root . '/' . $check) { 1056dd88ab32SMasahiro Yamada return 0; 1057dd88ab32SMasahiro Yamada } 1058dd88ab32SMasahiro Yamada } 1059dd88ab32SMasahiro Yamada return 1; 1060dd88ab32SMasahiro Yamada} 1061dd88ab32SMasahiro Yamada 1062dd88ab32SMasahiro Yamadasub parse_email { 1063dd88ab32SMasahiro Yamada my ($formatted_email) = @_; 1064dd88ab32SMasahiro Yamada 1065dd88ab32SMasahiro Yamada my $name = ""; 1066dd88ab32SMasahiro Yamada my $address = ""; 1067dd88ab32SMasahiro Yamada my $comment = ""; 1068dd88ab32SMasahiro Yamada 1069dd88ab32SMasahiro Yamada if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) { 1070dd88ab32SMasahiro Yamada $name = $1; 1071dd88ab32SMasahiro Yamada $address = $2; 1072dd88ab32SMasahiro Yamada $comment = $3 if defined $3; 1073dd88ab32SMasahiro Yamada } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) { 1074dd88ab32SMasahiro Yamada $address = $1; 1075dd88ab32SMasahiro Yamada $comment = $2 if defined $2; 1076dd88ab32SMasahiro Yamada } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) { 1077dd88ab32SMasahiro Yamada $address = $1; 1078dd88ab32SMasahiro Yamada $comment = $2 if defined $2; 1079*c398f2dfSHeinrich Schuchardt $formatted_email =~ s/\Q$address\E.*$//; 1080dd88ab32SMasahiro Yamada $name = $formatted_email; 10816b9709d9STom Rini $name = trim($name); 1082dd88ab32SMasahiro Yamada $name =~ s/^\"|\"$//g; 1083dd88ab32SMasahiro Yamada # If there's a name left after stripping spaces and 1084dd88ab32SMasahiro Yamada # leading quotes, and the address doesn't have both 1085dd88ab32SMasahiro Yamada # leading and trailing angle brackets, the address 1086dd88ab32SMasahiro Yamada # is invalid. ie: 1087dd88ab32SMasahiro Yamada # "joe smith joe@smith.com" bad 1088dd88ab32SMasahiro Yamada # "joe smith <joe@smith.com" bad 1089dd88ab32SMasahiro Yamada if ($name ne "" && $address !~ /^<[^>]+>$/) { 1090dd88ab32SMasahiro Yamada $name = ""; 1091dd88ab32SMasahiro Yamada $address = ""; 1092dd88ab32SMasahiro Yamada $comment = ""; 1093dd88ab32SMasahiro Yamada } 1094dd88ab32SMasahiro Yamada } 1095dd88ab32SMasahiro Yamada 10966b9709d9STom Rini $name = trim($name); 1097dd88ab32SMasahiro Yamada $name =~ s/^\"|\"$//g; 10986b9709d9STom Rini $address = trim($address); 1099dd88ab32SMasahiro Yamada $address =~ s/^\<|\>$//g; 1100dd88ab32SMasahiro Yamada 1101dd88ab32SMasahiro Yamada if ($name =~ /[^\w \-]/i) { ##has "must quote" chars 1102dd88ab32SMasahiro Yamada $name =~ s/(?<!\\)"/\\"/g; ##escape quotes 1103dd88ab32SMasahiro Yamada $name = "\"$name\""; 1104dd88ab32SMasahiro Yamada } 1105dd88ab32SMasahiro Yamada 1106dd88ab32SMasahiro Yamada return ($name, $address, $comment); 1107dd88ab32SMasahiro Yamada} 1108dd88ab32SMasahiro Yamada 1109dd88ab32SMasahiro Yamadasub format_email { 1110dd88ab32SMasahiro Yamada my ($name, $address) = @_; 1111dd88ab32SMasahiro Yamada 1112dd88ab32SMasahiro Yamada my $formatted_email; 1113dd88ab32SMasahiro Yamada 11146b9709d9STom Rini $name = trim($name); 1115dd88ab32SMasahiro Yamada $name =~ s/^\"|\"$//g; 11166b9709d9STom Rini $address = trim($address); 1117dd88ab32SMasahiro Yamada 1118dd88ab32SMasahiro Yamada if ($name =~ /[^\w \-]/i) { ##has "must quote" chars 1119dd88ab32SMasahiro Yamada $name =~ s/(?<!\\)"/\\"/g; ##escape quotes 1120dd88ab32SMasahiro Yamada $name = "\"$name\""; 1121dd88ab32SMasahiro Yamada } 1122dd88ab32SMasahiro Yamada 1123dd88ab32SMasahiro Yamada if ("$name" eq "") { 1124dd88ab32SMasahiro Yamada $formatted_email = "$address"; 1125dd88ab32SMasahiro Yamada } else { 1126dd88ab32SMasahiro Yamada $formatted_email = "$name <$address>"; 1127dd88ab32SMasahiro Yamada } 1128dd88ab32SMasahiro Yamada 1129dd88ab32SMasahiro Yamada return $formatted_email; 1130dd88ab32SMasahiro Yamada} 1131dd88ab32SMasahiro Yamada 11326305db96SHeinrich Schuchardtsub which { 11336305db96SHeinrich Schuchardt my ($bin) = @_; 11346305db96SHeinrich Schuchardt 11356305db96SHeinrich Schuchardt foreach my $path (split(/:/, $ENV{PATH})) { 11366305db96SHeinrich Schuchardt if (-e "$path/$bin") { 11376305db96SHeinrich Schuchardt return "$path/$bin"; 11386305db96SHeinrich Schuchardt } 11396305db96SHeinrich Schuchardt } 11406305db96SHeinrich Schuchardt 11416305db96SHeinrich Schuchardt return ""; 11426305db96SHeinrich Schuchardt} 11436305db96SHeinrich Schuchardt 1144dd88ab32SMasahiro Yamadasub which_conf { 1145dd88ab32SMasahiro Yamada my ($conf) = @_; 1146dd88ab32SMasahiro Yamada 1147dd88ab32SMasahiro Yamada foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) { 1148dd88ab32SMasahiro Yamada if (-e "$path/$conf") { 1149dd88ab32SMasahiro Yamada return "$path/$conf"; 1150dd88ab32SMasahiro Yamada } 1151dd88ab32SMasahiro Yamada } 1152dd88ab32SMasahiro Yamada 1153dd88ab32SMasahiro Yamada return ""; 1154dd88ab32SMasahiro Yamada} 1155dd88ab32SMasahiro Yamada 1156dd88ab32SMasahiro Yamadasub expand_tabs { 1157dd88ab32SMasahiro Yamada my ($str) = @_; 1158dd88ab32SMasahiro Yamada 1159dd88ab32SMasahiro Yamada my $res = ''; 1160dd88ab32SMasahiro Yamada my $n = 0; 1161dd88ab32SMasahiro Yamada for my $c (split(//, $str)) { 1162dd88ab32SMasahiro Yamada if ($c eq "\t") { 1163dd88ab32SMasahiro Yamada $res .= ' '; 1164dd88ab32SMasahiro Yamada $n++; 1165dd88ab32SMasahiro Yamada for (; ($n % 8) != 0; $n++) { 1166dd88ab32SMasahiro Yamada $res .= ' '; 1167dd88ab32SMasahiro Yamada } 1168dd88ab32SMasahiro Yamada next; 1169dd88ab32SMasahiro Yamada } 1170dd88ab32SMasahiro Yamada $res .= $c; 1171dd88ab32SMasahiro Yamada $n++; 1172dd88ab32SMasahiro Yamada } 1173dd88ab32SMasahiro Yamada 1174dd88ab32SMasahiro Yamada return $res; 1175dd88ab32SMasahiro Yamada} 1176dd88ab32SMasahiro Yamadasub copy_spacing { 1177dd88ab32SMasahiro Yamada (my $res = shift) =~ tr/\t/ /c; 1178dd88ab32SMasahiro Yamada return $res; 1179dd88ab32SMasahiro Yamada} 1180dd88ab32SMasahiro Yamada 1181dd88ab32SMasahiro Yamadasub line_stats { 1182dd88ab32SMasahiro Yamada my ($line) = @_; 1183dd88ab32SMasahiro Yamada 1184dd88ab32SMasahiro Yamada # Drop the diff line leader and expand tabs 1185dd88ab32SMasahiro Yamada $line =~ s/^.//; 1186dd88ab32SMasahiro Yamada $line = expand_tabs($line); 1187dd88ab32SMasahiro Yamada 1188dd88ab32SMasahiro Yamada # Pick the indent from the front of the line. 1189dd88ab32SMasahiro Yamada my ($white) = ($line =~ /^(\s*)/); 1190dd88ab32SMasahiro Yamada 1191dd88ab32SMasahiro Yamada return (length($line), length($white)); 1192dd88ab32SMasahiro Yamada} 1193dd88ab32SMasahiro Yamada 1194dd88ab32SMasahiro Yamadamy $sanitise_quote = ''; 1195dd88ab32SMasahiro Yamada 1196dd88ab32SMasahiro Yamadasub sanitise_line_reset { 1197dd88ab32SMasahiro Yamada my ($in_comment) = @_; 1198dd88ab32SMasahiro Yamada 1199dd88ab32SMasahiro Yamada if ($in_comment) { 1200dd88ab32SMasahiro Yamada $sanitise_quote = '*/'; 1201dd88ab32SMasahiro Yamada } else { 1202dd88ab32SMasahiro Yamada $sanitise_quote = ''; 1203dd88ab32SMasahiro Yamada } 1204dd88ab32SMasahiro Yamada} 1205dd88ab32SMasahiro Yamadasub sanitise_line { 1206dd88ab32SMasahiro Yamada my ($line) = @_; 1207dd88ab32SMasahiro Yamada 1208dd88ab32SMasahiro Yamada my $res = ''; 1209dd88ab32SMasahiro Yamada my $l = ''; 1210dd88ab32SMasahiro Yamada 1211dd88ab32SMasahiro Yamada my $qlen = 0; 1212dd88ab32SMasahiro Yamada my $off = 0; 1213dd88ab32SMasahiro Yamada my $c; 1214dd88ab32SMasahiro Yamada 1215dd88ab32SMasahiro Yamada # Always copy over the diff marker. 1216dd88ab32SMasahiro Yamada $res = substr($line, 0, 1); 1217dd88ab32SMasahiro Yamada 1218dd88ab32SMasahiro Yamada for ($off = 1; $off < length($line); $off++) { 1219dd88ab32SMasahiro Yamada $c = substr($line, $off, 1); 1220dd88ab32SMasahiro Yamada 1221*c398f2dfSHeinrich Schuchardt # Comments we are whacking completely including the begin 1222dd88ab32SMasahiro Yamada # and end, all to $;. 1223dd88ab32SMasahiro Yamada if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') { 1224dd88ab32SMasahiro Yamada $sanitise_quote = '*/'; 1225dd88ab32SMasahiro Yamada 1226dd88ab32SMasahiro Yamada substr($res, $off, 2, "$;$;"); 1227dd88ab32SMasahiro Yamada $off++; 1228dd88ab32SMasahiro Yamada next; 1229dd88ab32SMasahiro Yamada } 1230dd88ab32SMasahiro Yamada if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') { 1231dd88ab32SMasahiro Yamada $sanitise_quote = ''; 1232dd88ab32SMasahiro Yamada substr($res, $off, 2, "$;$;"); 1233dd88ab32SMasahiro Yamada $off++; 1234dd88ab32SMasahiro Yamada next; 1235dd88ab32SMasahiro Yamada } 1236dd88ab32SMasahiro Yamada if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') { 1237dd88ab32SMasahiro Yamada $sanitise_quote = '//'; 1238dd88ab32SMasahiro Yamada 1239dd88ab32SMasahiro Yamada substr($res, $off, 2, $sanitise_quote); 1240dd88ab32SMasahiro Yamada $off++; 1241dd88ab32SMasahiro Yamada next; 1242dd88ab32SMasahiro Yamada } 1243dd88ab32SMasahiro Yamada 1244dd88ab32SMasahiro Yamada # A \ in a string means ignore the next character. 1245dd88ab32SMasahiro Yamada if (($sanitise_quote eq "'" || $sanitise_quote eq '"') && 1246dd88ab32SMasahiro Yamada $c eq "\\") { 1247dd88ab32SMasahiro Yamada substr($res, $off, 2, 'XX'); 1248dd88ab32SMasahiro Yamada $off++; 1249dd88ab32SMasahiro Yamada next; 1250dd88ab32SMasahiro Yamada } 1251dd88ab32SMasahiro Yamada # Regular quotes. 1252dd88ab32SMasahiro Yamada if ($c eq "'" || $c eq '"') { 1253dd88ab32SMasahiro Yamada if ($sanitise_quote eq '') { 1254dd88ab32SMasahiro Yamada $sanitise_quote = $c; 1255dd88ab32SMasahiro Yamada 1256dd88ab32SMasahiro Yamada substr($res, $off, 1, $c); 1257dd88ab32SMasahiro Yamada next; 1258dd88ab32SMasahiro Yamada } elsif ($sanitise_quote eq $c) { 1259dd88ab32SMasahiro Yamada $sanitise_quote = ''; 1260dd88ab32SMasahiro Yamada } 1261dd88ab32SMasahiro Yamada } 1262dd88ab32SMasahiro Yamada 1263dd88ab32SMasahiro Yamada #print "c<$c> SQ<$sanitise_quote>\n"; 1264dd88ab32SMasahiro Yamada if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") { 1265dd88ab32SMasahiro Yamada substr($res, $off, 1, $;); 1266dd88ab32SMasahiro Yamada } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") { 1267dd88ab32SMasahiro Yamada substr($res, $off, 1, $;); 1268dd88ab32SMasahiro Yamada } elsif ($off != 0 && $sanitise_quote && $c ne "\t") { 1269dd88ab32SMasahiro Yamada substr($res, $off, 1, 'X'); 1270dd88ab32SMasahiro Yamada } else { 1271dd88ab32SMasahiro Yamada substr($res, $off, 1, $c); 1272dd88ab32SMasahiro Yamada } 1273dd88ab32SMasahiro Yamada } 1274dd88ab32SMasahiro Yamada 1275dd88ab32SMasahiro Yamada if ($sanitise_quote eq '//') { 1276dd88ab32SMasahiro Yamada $sanitise_quote = ''; 1277dd88ab32SMasahiro Yamada } 1278dd88ab32SMasahiro Yamada 1279dd88ab32SMasahiro Yamada # The pathname on a #include may be surrounded by '<' and '>'. 1280dd88ab32SMasahiro Yamada if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) { 1281dd88ab32SMasahiro Yamada my $clean = 'X' x length($1); 1282dd88ab32SMasahiro Yamada $res =~ s@\<.*\>@<$clean>@; 1283dd88ab32SMasahiro Yamada 1284dd88ab32SMasahiro Yamada # The whole of a #error is a string. 1285dd88ab32SMasahiro Yamada } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) { 1286dd88ab32SMasahiro Yamada my $clean = 'X' x length($1); 1287dd88ab32SMasahiro Yamada $res =~ s@(\#\s*(?:error|warning)\s+).*@$1$clean@; 1288dd88ab32SMasahiro Yamada } 1289dd88ab32SMasahiro Yamada 12906305db96SHeinrich Schuchardt if ($allow_c99_comments && $res =~ m@(//.*$)@) { 12916305db96SHeinrich Schuchardt my $match = $1; 12926305db96SHeinrich Schuchardt $res =~ s/\Q$match\E/"$;" x length($match)/e; 12936305db96SHeinrich Schuchardt } 12946305db96SHeinrich Schuchardt 1295dd88ab32SMasahiro Yamada return $res; 1296dd88ab32SMasahiro Yamada} 1297dd88ab32SMasahiro Yamada 12986b9709d9STom Rinisub get_quoted_string { 12996b9709d9STom Rini my ($line, $rawline) = @_; 13006b9709d9STom Rini 1301*c398f2dfSHeinrich Schuchardt return "" if (!defined($line) || !defined($rawline)); 13026305db96SHeinrich Schuchardt return "" if ($line !~ m/($String)/g); 13036b9709d9STom Rini return substr($rawline, $-[0], $+[0] - $-[0]); 13046b9709d9STom Rini} 13056b9709d9STom Rini 1306dd88ab32SMasahiro Yamadasub ctx_statement_block { 1307dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 1308dd88ab32SMasahiro Yamada my $line = $linenr - 1; 1309dd88ab32SMasahiro Yamada my $blk = ''; 1310dd88ab32SMasahiro Yamada my $soff = $off; 1311dd88ab32SMasahiro Yamada my $coff = $off - 1; 1312dd88ab32SMasahiro Yamada my $coff_set = 0; 1313dd88ab32SMasahiro Yamada 1314dd88ab32SMasahiro Yamada my $loff = 0; 1315dd88ab32SMasahiro Yamada 1316dd88ab32SMasahiro Yamada my $type = ''; 1317dd88ab32SMasahiro Yamada my $level = 0; 1318dd88ab32SMasahiro Yamada my @stack = (); 1319dd88ab32SMasahiro Yamada my $p; 1320dd88ab32SMasahiro Yamada my $c; 1321dd88ab32SMasahiro Yamada my $len = 0; 1322dd88ab32SMasahiro Yamada 1323dd88ab32SMasahiro Yamada my $remainder; 1324dd88ab32SMasahiro Yamada while (1) { 1325dd88ab32SMasahiro Yamada @stack = (['', 0]) if ($#stack == -1); 1326dd88ab32SMasahiro Yamada 1327dd88ab32SMasahiro Yamada #warn "CSB: blk<$blk> remain<$remain>\n"; 1328dd88ab32SMasahiro Yamada # If we are about to drop off the end, pull in more 1329dd88ab32SMasahiro Yamada # context. 1330dd88ab32SMasahiro Yamada if ($off >= $len) { 1331dd88ab32SMasahiro Yamada for (; $remain > 0; $line++) { 1332dd88ab32SMasahiro Yamada last if (!defined $lines[$line]); 1333dd88ab32SMasahiro Yamada next if ($lines[$line] =~ /^-/); 1334dd88ab32SMasahiro Yamada $remain--; 1335dd88ab32SMasahiro Yamada $loff = $len; 1336dd88ab32SMasahiro Yamada $blk .= $lines[$line] . "\n"; 1337dd88ab32SMasahiro Yamada $len = length($blk); 1338dd88ab32SMasahiro Yamada $line++; 1339dd88ab32SMasahiro Yamada last; 1340dd88ab32SMasahiro Yamada } 1341dd88ab32SMasahiro Yamada # Bail if there is no further context. 1342dd88ab32SMasahiro Yamada #warn "CSB: blk<$blk> off<$off> len<$len>\n"; 1343dd88ab32SMasahiro Yamada if ($off >= $len) { 1344dd88ab32SMasahiro Yamada last; 1345dd88ab32SMasahiro Yamada } 1346dd88ab32SMasahiro Yamada if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) { 1347dd88ab32SMasahiro Yamada $level++; 1348dd88ab32SMasahiro Yamada $type = '#'; 1349dd88ab32SMasahiro Yamada } 1350dd88ab32SMasahiro Yamada } 1351dd88ab32SMasahiro Yamada $p = $c; 1352dd88ab32SMasahiro Yamada $c = substr($blk, $off, 1); 1353dd88ab32SMasahiro Yamada $remainder = substr($blk, $off); 1354dd88ab32SMasahiro Yamada 1355dd88ab32SMasahiro Yamada #warn "CSB: c<$c> type<$type> level<$level> remainder<$remainder> coff_set<$coff_set>\n"; 1356dd88ab32SMasahiro Yamada 1357dd88ab32SMasahiro Yamada # Handle nested #if/#else. 1358dd88ab32SMasahiro Yamada if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) { 1359dd88ab32SMasahiro Yamada push(@stack, [ $type, $level ]); 1360dd88ab32SMasahiro Yamada } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) { 1361dd88ab32SMasahiro Yamada ($type, $level) = @{$stack[$#stack - 1]}; 1362dd88ab32SMasahiro Yamada } elsif ($remainder =~ /^#\s*endif\b/) { 1363dd88ab32SMasahiro Yamada ($type, $level) = @{pop(@stack)}; 1364dd88ab32SMasahiro Yamada } 1365dd88ab32SMasahiro Yamada 1366dd88ab32SMasahiro Yamada # Statement ends at the ';' or a close '}' at the 1367dd88ab32SMasahiro Yamada # outermost level. 1368dd88ab32SMasahiro Yamada if ($level == 0 && $c eq ';') { 1369dd88ab32SMasahiro Yamada last; 1370dd88ab32SMasahiro Yamada } 1371dd88ab32SMasahiro Yamada 1372dd88ab32SMasahiro Yamada # An else is really a conditional as long as its not else if 1373dd88ab32SMasahiro Yamada if ($level == 0 && $coff_set == 0 && 1374dd88ab32SMasahiro Yamada (!defined($p) || $p =~ /(?:\s|\}|\+)/) && 1375dd88ab32SMasahiro Yamada $remainder =~ /^(else)(?:\s|{)/ && 1376dd88ab32SMasahiro Yamada $remainder !~ /^else\s+if\b/) { 1377dd88ab32SMasahiro Yamada $coff = $off + length($1) - 1; 1378dd88ab32SMasahiro Yamada $coff_set = 1; 1379dd88ab32SMasahiro Yamada #warn "CSB: mark coff<$coff> soff<$soff> 1<$1>\n"; 1380dd88ab32SMasahiro Yamada #warn "[" . substr($blk, $soff, $coff - $soff + 1) . "]\n"; 1381dd88ab32SMasahiro Yamada } 1382dd88ab32SMasahiro Yamada 1383dd88ab32SMasahiro Yamada if (($type eq '' || $type eq '(') && $c eq '(') { 1384dd88ab32SMasahiro Yamada $level++; 1385dd88ab32SMasahiro Yamada $type = '('; 1386dd88ab32SMasahiro Yamada } 1387dd88ab32SMasahiro Yamada if ($type eq '(' && $c eq ')') { 1388dd88ab32SMasahiro Yamada $level--; 1389dd88ab32SMasahiro Yamada $type = ($level != 0)? '(' : ''; 1390dd88ab32SMasahiro Yamada 1391dd88ab32SMasahiro Yamada if ($level == 0 && $coff < $soff) { 1392dd88ab32SMasahiro Yamada $coff = $off; 1393dd88ab32SMasahiro Yamada $coff_set = 1; 1394dd88ab32SMasahiro Yamada #warn "CSB: mark coff<$coff>\n"; 1395dd88ab32SMasahiro Yamada } 1396dd88ab32SMasahiro Yamada } 1397dd88ab32SMasahiro Yamada if (($type eq '' || $type eq '{') && $c eq '{') { 1398dd88ab32SMasahiro Yamada $level++; 1399dd88ab32SMasahiro Yamada $type = '{'; 1400dd88ab32SMasahiro Yamada } 1401dd88ab32SMasahiro Yamada if ($type eq '{' && $c eq '}') { 1402dd88ab32SMasahiro Yamada $level--; 1403dd88ab32SMasahiro Yamada $type = ($level != 0)? '{' : ''; 1404dd88ab32SMasahiro Yamada 1405dd88ab32SMasahiro Yamada if ($level == 0) { 1406dd88ab32SMasahiro Yamada if (substr($blk, $off + 1, 1) eq ';') { 1407dd88ab32SMasahiro Yamada $off++; 1408dd88ab32SMasahiro Yamada } 1409dd88ab32SMasahiro Yamada last; 1410dd88ab32SMasahiro Yamada } 1411dd88ab32SMasahiro Yamada } 1412dd88ab32SMasahiro Yamada # Preprocessor commands end at the newline unless escaped. 1413dd88ab32SMasahiro Yamada if ($type eq '#' && $c eq "\n" && $p ne "\\") { 1414dd88ab32SMasahiro Yamada $level--; 1415dd88ab32SMasahiro Yamada $type = ''; 1416dd88ab32SMasahiro Yamada $off++; 1417dd88ab32SMasahiro Yamada last; 1418dd88ab32SMasahiro Yamada } 1419dd88ab32SMasahiro Yamada $off++; 1420dd88ab32SMasahiro Yamada } 1421dd88ab32SMasahiro Yamada # We are truly at the end, so shuffle to the next line. 1422dd88ab32SMasahiro Yamada if ($off == $len) { 1423dd88ab32SMasahiro Yamada $loff = $len + 1; 1424dd88ab32SMasahiro Yamada $line++; 1425dd88ab32SMasahiro Yamada $remain--; 1426dd88ab32SMasahiro Yamada } 1427dd88ab32SMasahiro Yamada 1428dd88ab32SMasahiro Yamada my $statement = substr($blk, $soff, $off - $soff + 1); 1429dd88ab32SMasahiro Yamada my $condition = substr($blk, $soff, $coff - $soff + 1); 1430dd88ab32SMasahiro Yamada 1431dd88ab32SMasahiro Yamada #warn "STATEMENT<$statement>\n"; 1432dd88ab32SMasahiro Yamada #warn "CONDITION<$condition>\n"; 1433dd88ab32SMasahiro Yamada 1434dd88ab32SMasahiro Yamada #print "coff<$coff> soff<$off> loff<$loff>\n"; 1435dd88ab32SMasahiro Yamada 1436dd88ab32SMasahiro Yamada return ($statement, $condition, 1437dd88ab32SMasahiro Yamada $line, $remain + 1, $off - $loff + 1, $level); 1438dd88ab32SMasahiro Yamada} 1439dd88ab32SMasahiro Yamada 1440dd88ab32SMasahiro Yamadasub statement_lines { 1441dd88ab32SMasahiro Yamada my ($stmt) = @_; 1442dd88ab32SMasahiro Yamada 1443dd88ab32SMasahiro Yamada # Strip the diff line prefixes and rip blank lines at start and end. 1444dd88ab32SMasahiro Yamada $stmt =~ s/(^|\n)./$1/g; 1445dd88ab32SMasahiro Yamada $stmt =~ s/^\s*//; 1446dd88ab32SMasahiro Yamada $stmt =~ s/\s*$//; 1447dd88ab32SMasahiro Yamada 1448dd88ab32SMasahiro Yamada my @stmt_lines = ($stmt =~ /\n/g); 1449dd88ab32SMasahiro Yamada 1450dd88ab32SMasahiro Yamada return $#stmt_lines + 2; 1451dd88ab32SMasahiro Yamada} 1452dd88ab32SMasahiro Yamada 1453dd88ab32SMasahiro Yamadasub statement_rawlines { 1454dd88ab32SMasahiro Yamada my ($stmt) = @_; 1455dd88ab32SMasahiro Yamada 1456dd88ab32SMasahiro Yamada my @stmt_lines = ($stmt =~ /\n/g); 1457dd88ab32SMasahiro Yamada 1458dd88ab32SMasahiro Yamada return $#stmt_lines + 2; 1459dd88ab32SMasahiro Yamada} 1460dd88ab32SMasahiro Yamada 1461dd88ab32SMasahiro Yamadasub statement_block_size { 1462dd88ab32SMasahiro Yamada my ($stmt) = @_; 1463dd88ab32SMasahiro Yamada 1464dd88ab32SMasahiro Yamada $stmt =~ s/(^|\n)./$1/g; 1465dd88ab32SMasahiro Yamada $stmt =~ s/^\s*{//; 1466dd88ab32SMasahiro Yamada $stmt =~ s/}\s*$//; 1467dd88ab32SMasahiro Yamada $stmt =~ s/^\s*//; 1468dd88ab32SMasahiro Yamada $stmt =~ s/\s*$//; 1469dd88ab32SMasahiro Yamada 1470dd88ab32SMasahiro Yamada my @stmt_lines = ($stmt =~ /\n/g); 1471dd88ab32SMasahiro Yamada my @stmt_statements = ($stmt =~ /;/g); 1472dd88ab32SMasahiro Yamada 1473dd88ab32SMasahiro Yamada my $stmt_lines = $#stmt_lines + 2; 1474dd88ab32SMasahiro Yamada my $stmt_statements = $#stmt_statements + 1; 1475dd88ab32SMasahiro Yamada 1476dd88ab32SMasahiro Yamada if ($stmt_lines > $stmt_statements) { 1477dd88ab32SMasahiro Yamada return $stmt_lines; 1478dd88ab32SMasahiro Yamada } else { 1479dd88ab32SMasahiro Yamada return $stmt_statements; 1480dd88ab32SMasahiro Yamada } 1481dd88ab32SMasahiro Yamada} 1482dd88ab32SMasahiro Yamada 1483dd88ab32SMasahiro Yamadasub ctx_statement_full { 1484dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 1485dd88ab32SMasahiro Yamada my ($statement, $condition, $level); 1486dd88ab32SMasahiro Yamada 1487dd88ab32SMasahiro Yamada my (@chunks); 1488dd88ab32SMasahiro Yamada 1489dd88ab32SMasahiro Yamada # Grab the first conditional/block pair. 1490dd88ab32SMasahiro Yamada ($statement, $condition, $linenr, $remain, $off, $level) = 1491dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $remain, $off); 1492dd88ab32SMasahiro Yamada #print "F: c<$condition> s<$statement> remain<$remain>\n"; 1493dd88ab32SMasahiro Yamada push(@chunks, [ $condition, $statement ]); 1494dd88ab32SMasahiro Yamada if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) { 1495dd88ab32SMasahiro Yamada return ($level, $linenr, @chunks); 1496dd88ab32SMasahiro Yamada } 1497dd88ab32SMasahiro Yamada 1498dd88ab32SMasahiro Yamada # Pull in the following conditional/block pairs and see if they 1499dd88ab32SMasahiro Yamada # could continue the statement. 1500dd88ab32SMasahiro Yamada for (;;) { 1501dd88ab32SMasahiro Yamada ($statement, $condition, $linenr, $remain, $off, $level) = 1502dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $remain, $off); 1503dd88ab32SMasahiro Yamada #print "C: c<$condition> s<$statement> remain<$remain>\n"; 1504dd88ab32SMasahiro Yamada last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s)); 1505dd88ab32SMasahiro Yamada #print "C: push\n"; 1506dd88ab32SMasahiro Yamada push(@chunks, [ $condition, $statement ]); 1507dd88ab32SMasahiro Yamada } 1508dd88ab32SMasahiro Yamada 1509dd88ab32SMasahiro Yamada return ($level, $linenr, @chunks); 1510dd88ab32SMasahiro Yamada} 1511dd88ab32SMasahiro Yamada 1512dd88ab32SMasahiro Yamadasub ctx_block_get { 1513dd88ab32SMasahiro Yamada my ($linenr, $remain, $outer, $open, $close, $off) = @_; 1514dd88ab32SMasahiro Yamada my $line; 1515dd88ab32SMasahiro Yamada my $start = $linenr - 1; 1516dd88ab32SMasahiro Yamada my $blk = ''; 1517dd88ab32SMasahiro Yamada my @o; 1518dd88ab32SMasahiro Yamada my @c; 1519dd88ab32SMasahiro Yamada my @res = (); 1520dd88ab32SMasahiro Yamada 1521dd88ab32SMasahiro Yamada my $level = 0; 1522dd88ab32SMasahiro Yamada my @stack = ($level); 1523dd88ab32SMasahiro Yamada for ($line = $start; $remain > 0; $line++) { 1524dd88ab32SMasahiro Yamada next if ($rawlines[$line] =~ /^-/); 1525dd88ab32SMasahiro Yamada $remain--; 1526dd88ab32SMasahiro Yamada 1527dd88ab32SMasahiro Yamada $blk .= $rawlines[$line]; 1528dd88ab32SMasahiro Yamada 1529dd88ab32SMasahiro Yamada # Handle nested #if/#else. 1530dd88ab32SMasahiro Yamada if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) { 1531dd88ab32SMasahiro Yamada push(@stack, $level); 1532dd88ab32SMasahiro Yamada } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) { 1533dd88ab32SMasahiro Yamada $level = $stack[$#stack - 1]; 1534dd88ab32SMasahiro Yamada } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) { 1535dd88ab32SMasahiro Yamada $level = pop(@stack); 1536dd88ab32SMasahiro Yamada } 1537dd88ab32SMasahiro Yamada 1538dd88ab32SMasahiro Yamada foreach my $c (split(//, $lines[$line])) { 1539dd88ab32SMasahiro Yamada ##print "C<$c>L<$level><$open$close>O<$off>\n"; 1540dd88ab32SMasahiro Yamada if ($off > 0) { 1541dd88ab32SMasahiro Yamada $off--; 1542dd88ab32SMasahiro Yamada next; 1543dd88ab32SMasahiro Yamada } 1544dd88ab32SMasahiro Yamada 1545dd88ab32SMasahiro Yamada if ($c eq $close && $level > 0) { 1546dd88ab32SMasahiro Yamada $level--; 1547dd88ab32SMasahiro Yamada last if ($level == 0); 1548dd88ab32SMasahiro Yamada } elsif ($c eq $open) { 1549dd88ab32SMasahiro Yamada $level++; 1550dd88ab32SMasahiro Yamada } 1551dd88ab32SMasahiro Yamada } 1552dd88ab32SMasahiro Yamada 1553dd88ab32SMasahiro Yamada if (!$outer || $level <= 1) { 1554dd88ab32SMasahiro Yamada push(@res, $rawlines[$line]); 1555dd88ab32SMasahiro Yamada } 1556dd88ab32SMasahiro Yamada 1557dd88ab32SMasahiro Yamada last if ($level == 0); 1558dd88ab32SMasahiro Yamada } 1559dd88ab32SMasahiro Yamada 1560dd88ab32SMasahiro Yamada return ($level, @res); 1561dd88ab32SMasahiro Yamada} 1562dd88ab32SMasahiro Yamadasub ctx_block_outer { 1563dd88ab32SMasahiro Yamada my ($linenr, $remain) = @_; 1564dd88ab32SMasahiro Yamada 1565dd88ab32SMasahiro Yamada my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0); 1566dd88ab32SMasahiro Yamada return @r; 1567dd88ab32SMasahiro Yamada} 1568dd88ab32SMasahiro Yamadasub ctx_block { 1569dd88ab32SMasahiro Yamada my ($linenr, $remain) = @_; 1570dd88ab32SMasahiro Yamada 1571dd88ab32SMasahiro Yamada my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0); 1572dd88ab32SMasahiro Yamada return @r; 1573dd88ab32SMasahiro Yamada} 1574dd88ab32SMasahiro Yamadasub ctx_statement { 1575dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 1576dd88ab32SMasahiro Yamada 1577dd88ab32SMasahiro Yamada my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off); 1578dd88ab32SMasahiro Yamada return @r; 1579dd88ab32SMasahiro Yamada} 1580dd88ab32SMasahiro Yamadasub ctx_block_level { 1581dd88ab32SMasahiro Yamada my ($linenr, $remain) = @_; 1582dd88ab32SMasahiro Yamada 1583dd88ab32SMasahiro Yamada return ctx_block_get($linenr, $remain, 0, '{', '}', 0); 1584dd88ab32SMasahiro Yamada} 1585dd88ab32SMasahiro Yamadasub ctx_statement_level { 1586dd88ab32SMasahiro Yamada my ($linenr, $remain, $off) = @_; 1587dd88ab32SMasahiro Yamada 1588dd88ab32SMasahiro Yamada return ctx_block_get($linenr, $remain, 0, '(', ')', $off); 1589dd88ab32SMasahiro Yamada} 1590dd88ab32SMasahiro Yamada 1591dd88ab32SMasahiro Yamadasub ctx_locate_comment { 1592dd88ab32SMasahiro Yamada my ($first_line, $end_line) = @_; 1593dd88ab32SMasahiro Yamada 1594dd88ab32SMasahiro Yamada # Catch a comment on the end of the line itself. 1595dd88ab32SMasahiro Yamada my ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@); 1596dd88ab32SMasahiro Yamada return $current_comment if (defined $current_comment); 1597dd88ab32SMasahiro Yamada 1598dd88ab32SMasahiro Yamada # Look through the context and try and figure out if there is a 1599dd88ab32SMasahiro Yamada # comment. 1600dd88ab32SMasahiro Yamada my $in_comment = 0; 1601dd88ab32SMasahiro Yamada $current_comment = ''; 1602dd88ab32SMasahiro Yamada for (my $linenr = $first_line; $linenr < $end_line; $linenr++) { 1603dd88ab32SMasahiro Yamada my $line = $rawlines[$linenr - 1]; 1604dd88ab32SMasahiro Yamada #warn " $line\n"; 1605dd88ab32SMasahiro Yamada if ($linenr == $first_line and $line =~ m@^.\s*\*@) { 1606dd88ab32SMasahiro Yamada $in_comment = 1; 1607dd88ab32SMasahiro Yamada } 1608dd88ab32SMasahiro Yamada if ($line =~ m@/\*@) { 1609dd88ab32SMasahiro Yamada $in_comment = 1; 1610dd88ab32SMasahiro Yamada } 1611dd88ab32SMasahiro Yamada if (!$in_comment && $current_comment ne '') { 1612dd88ab32SMasahiro Yamada $current_comment = ''; 1613dd88ab32SMasahiro Yamada } 1614dd88ab32SMasahiro Yamada $current_comment .= $line . "\n" if ($in_comment); 1615dd88ab32SMasahiro Yamada if ($line =~ m@\*/@) { 1616dd88ab32SMasahiro Yamada $in_comment = 0; 1617dd88ab32SMasahiro Yamada } 1618dd88ab32SMasahiro Yamada } 1619dd88ab32SMasahiro Yamada 1620dd88ab32SMasahiro Yamada chomp($current_comment); 1621dd88ab32SMasahiro Yamada return($current_comment); 1622dd88ab32SMasahiro Yamada} 1623dd88ab32SMasahiro Yamadasub ctx_has_comment { 1624dd88ab32SMasahiro Yamada my ($first_line, $end_line) = @_; 1625dd88ab32SMasahiro Yamada my $cmt = ctx_locate_comment($first_line, $end_line); 1626dd88ab32SMasahiro Yamada 1627dd88ab32SMasahiro Yamada ##print "LINE: $rawlines[$end_line - 1 ]\n"; 1628dd88ab32SMasahiro Yamada ##print "CMMT: $cmt\n"; 1629dd88ab32SMasahiro Yamada 1630dd88ab32SMasahiro Yamada return ($cmt ne ''); 1631dd88ab32SMasahiro Yamada} 1632dd88ab32SMasahiro Yamada 1633dd88ab32SMasahiro Yamadasub raw_line { 1634dd88ab32SMasahiro Yamada my ($linenr, $cnt) = @_; 1635dd88ab32SMasahiro Yamada 1636dd88ab32SMasahiro Yamada my $offset = $linenr - 1; 1637dd88ab32SMasahiro Yamada $cnt++; 1638dd88ab32SMasahiro Yamada 1639dd88ab32SMasahiro Yamada my $line; 1640dd88ab32SMasahiro Yamada while ($cnt) { 1641dd88ab32SMasahiro Yamada $line = $rawlines[$offset++]; 1642dd88ab32SMasahiro Yamada next if (defined($line) && $line =~ /^-/); 1643dd88ab32SMasahiro Yamada $cnt--; 1644dd88ab32SMasahiro Yamada } 1645dd88ab32SMasahiro Yamada 1646dd88ab32SMasahiro Yamada return $line; 1647dd88ab32SMasahiro Yamada} 1648dd88ab32SMasahiro Yamada 1649*c398f2dfSHeinrich Schuchardtsub get_stat_real { 1650*c398f2dfSHeinrich Schuchardt my ($linenr, $lc) = @_; 1651*c398f2dfSHeinrich Schuchardt 1652*c398f2dfSHeinrich Schuchardt my $stat_real = raw_line($linenr, 0); 1653*c398f2dfSHeinrich Schuchardt for (my $count = $linenr + 1; $count <= $lc; $count++) { 1654*c398f2dfSHeinrich Schuchardt $stat_real = $stat_real . "\n" . raw_line($count, 0); 1655*c398f2dfSHeinrich Schuchardt } 1656*c398f2dfSHeinrich Schuchardt 1657*c398f2dfSHeinrich Schuchardt return $stat_real; 1658*c398f2dfSHeinrich Schuchardt} 1659*c398f2dfSHeinrich Schuchardt 1660*c398f2dfSHeinrich Schuchardtsub get_stat_here { 1661*c398f2dfSHeinrich Schuchardt my ($linenr, $cnt, $here) = @_; 1662*c398f2dfSHeinrich Schuchardt 1663*c398f2dfSHeinrich Schuchardt my $herectx = $here . "\n"; 1664*c398f2dfSHeinrich Schuchardt for (my $n = 0; $n < $cnt; $n++) { 1665*c398f2dfSHeinrich Schuchardt $herectx .= raw_line($linenr, $n) . "\n"; 1666*c398f2dfSHeinrich Schuchardt } 1667*c398f2dfSHeinrich Schuchardt 1668*c398f2dfSHeinrich Schuchardt return $herectx; 1669*c398f2dfSHeinrich Schuchardt} 1670*c398f2dfSHeinrich Schuchardt 1671dd88ab32SMasahiro Yamadasub cat_vet { 1672dd88ab32SMasahiro Yamada my ($vet) = @_; 1673dd88ab32SMasahiro Yamada my ($res, $coded); 1674dd88ab32SMasahiro Yamada 1675dd88ab32SMasahiro Yamada $res = ''; 1676dd88ab32SMasahiro Yamada while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) { 1677dd88ab32SMasahiro Yamada $res .= $1; 1678dd88ab32SMasahiro Yamada if ($2 ne '') { 1679dd88ab32SMasahiro Yamada $coded = sprintf("^%c", unpack('C', $2) + 64); 1680dd88ab32SMasahiro Yamada $res .= $coded; 1681dd88ab32SMasahiro Yamada } 1682dd88ab32SMasahiro Yamada } 1683dd88ab32SMasahiro Yamada $res =~ s/$/\$/; 1684dd88ab32SMasahiro Yamada 1685dd88ab32SMasahiro Yamada return $res; 1686dd88ab32SMasahiro Yamada} 1687dd88ab32SMasahiro Yamada 1688dd88ab32SMasahiro Yamadamy $av_preprocessor = 0; 1689dd88ab32SMasahiro Yamadamy $av_pending; 1690dd88ab32SMasahiro Yamadamy @av_paren_type; 1691dd88ab32SMasahiro Yamadamy $av_pend_colon; 1692dd88ab32SMasahiro Yamada 1693dd88ab32SMasahiro Yamadasub annotate_reset { 1694dd88ab32SMasahiro Yamada $av_preprocessor = 0; 1695dd88ab32SMasahiro Yamada $av_pending = '_'; 1696dd88ab32SMasahiro Yamada @av_paren_type = ('E'); 1697dd88ab32SMasahiro Yamada $av_pend_colon = 'O'; 1698dd88ab32SMasahiro Yamada} 1699dd88ab32SMasahiro Yamada 1700dd88ab32SMasahiro Yamadasub annotate_values { 1701dd88ab32SMasahiro Yamada my ($stream, $type) = @_; 1702dd88ab32SMasahiro Yamada 1703dd88ab32SMasahiro Yamada my $res; 1704dd88ab32SMasahiro Yamada my $var = '_' x length($stream); 1705dd88ab32SMasahiro Yamada my $cur = $stream; 1706dd88ab32SMasahiro Yamada 1707dd88ab32SMasahiro Yamada print "$stream\n" if ($dbg_values > 1); 1708dd88ab32SMasahiro Yamada 1709dd88ab32SMasahiro Yamada while (length($cur)) { 1710dd88ab32SMasahiro Yamada @av_paren_type = ('E') if ($#av_paren_type < 0); 1711dd88ab32SMasahiro Yamada print " <" . join('', @av_paren_type) . 1712dd88ab32SMasahiro Yamada "> <$type> <$av_pending>" if ($dbg_values > 1); 1713dd88ab32SMasahiro Yamada if ($cur =~ /^(\s+)/o) { 1714dd88ab32SMasahiro Yamada print "WS($1)\n" if ($dbg_values > 1); 1715dd88ab32SMasahiro Yamada if ($1 =~ /\n/ && $av_preprocessor) { 1716dd88ab32SMasahiro Yamada $type = pop(@av_paren_type); 1717dd88ab32SMasahiro Yamada $av_preprocessor = 0; 1718dd88ab32SMasahiro Yamada } 1719dd88ab32SMasahiro Yamada 1720dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') { 1721dd88ab32SMasahiro Yamada print "CAST($1)\n" if ($dbg_values > 1); 1722dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1723dd88ab32SMasahiro Yamada $type = 'c'; 1724dd88ab32SMasahiro Yamada 1725dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) { 1726dd88ab32SMasahiro Yamada print "DECLARE($1)\n" if ($dbg_values > 1); 1727dd88ab32SMasahiro Yamada $type = 'T'; 1728dd88ab32SMasahiro Yamada 1729dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Modifier)\s*/) { 1730dd88ab32SMasahiro Yamada print "MODIFIER($1)\n" if ($dbg_values > 1); 1731dd88ab32SMasahiro Yamada $type = 'T'; 1732dd88ab32SMasahiro Yamada 1733dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) { 1734dd88ab32SMasahiro Yamada print "DEFINE($1,$2)\n" if ($dbg_values > 1); 1735dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1736dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1737dd88ab32SMasahiro Yamada if ($2 ne '') { 1738dd88ab32SMasahiro Yamada $av_pending = 'N'; 1739dd88ab32SMasahiro Yamada } 1740dd88ab32SMasahiro Yamada $type = 'E'; 1741dd88ab32SMasahiro Yamada 1742dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) { 1743dd88ab32SMasahiro Yamada print "UNDEF($1)\n" if ($dbg_values > 1); 1744dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1745dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1746dd88ab32SMasahiro Yamada 1747dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) { 1748dd88ab32SMasahiro Yamada print "PRE_START($1)\n" if ($dbg_values > 1); 1749dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1750dd88ab32SMasahiro Yamada 1751dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1752dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1753dd88ab32SMasahiro Yamada $type = 'E'; 1754dd88ab32SMasahiro Yamada 1755dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) { 1756dd88ab32SMasahiro Yamada print "PRE_RESTART($1)\n" if ($dbg_values > 1); 1757dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1758dd88ab32SMasahiro Yamada 1759dd88ab32SMasahiro Yamada push(@av_paren_type, $av_paren_type[$#av_paren_type]); 1760dd88ab32SMasahiro Yamada 1761dd88ab32SMasahiro Yamada $type = 'E'; 1762dd88ab32SMasahiro Yamada 1763dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\#\s*(?:endif))/o) { 1764dd88ab32SMasahiro Yamada print "PRE_END($1)\n" if ($dbg_values > 1); 1765dd88ab32SMasahiro Yamada 1766dd88ab32SMasahiro Yamada $av_preprocessor = 1; 1767dd88ab32SMasahiro Yamada 1768dd88ab32SMasahiro Yamada # Assume all arms of the conditional end as this 1769dd88ab32SMasahiro Yamada # one does, and continue as if the #endif was not here. 1770dd88ab32SMasahiro Yamada pop(@av_paren_type); 1771dd88ab32SMasahiro Yamada push(@av_paren_type, $type); 1772dd88ab32SMasahiro Yamada $type = 'E'; 1773dd88ab32SMasahiro Yamada 1774dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\\\n)/o) { 1775dd88ab32SMasahiro Yamada print "PRECONT($1)\n" if ($dbg_values > 1); 1776dd88ab32SMasahiro Yamada 1777dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(__attribute__)\s*\(?/o) { 1778dd88ab32SMasahiro Yamada print "ATTR($1)\n" if ($dbg_values > 1); 1779dd88ab32SMasahiro Yamada $av_pending = $type; 1780dd88ab32SMasahiro Yamada $type = 'N'; 1781dd88ab32SMasahiro Yamada 1782dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { 1783dd88ab32SMasahiro Yamada print "SIZEOF($1)\n" if ($dbg_values > 1); 1784dd88ab32SMasahiro Yamada if (defined $2) { 1785dd88ab32SMasahiro Yamada $av_pending = 'V'; 1786dd88ab32SMasahiro Yamada } 1787dd88ab32SMasahiro Yamada $type = 'N'; 1788dd88ab32SMasahiro Yamada 1789dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(if|while|for)\b/o) { 1790dd88ab32SMasahiro Yamada print "COND($1)\n" if ($dbg_values > 1); 1791dd88ab32SMasahiro Yamada $av_pending = 'E'; 1792dd88ab32SMasahiro Yamada $type = 'N'; 1793dd88ab32SMasahiro Yamada 1794dd88ab32SMasahiro Yamada } elsif ($cur =~/^(case)/o) { 1795dd88ab32SMasahiro Yamada print "CASE($1)\n" if ($dbg_values > 1); 1796dd88ab32SMasahiro Yamada $av_pend_colon = 'C'; 1797dd88ab32SMasahiro Yamada $type = 'N'; 1798dd88ab32SMasahiro Yamada 1799dd88ab32SMasahiro Yamada } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) { 1800dd88ab32SMasahiro Yamada print "KEYWORD($1)\n" if ($dbg_values > 1); 1801dd88ab32SMasahiro Yamada $type = 'N'; 1802dd88ab32SMasahiro Yamada 1803dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\()/o) { 1804dd88ab32SMasahiro Yamada print "PAREN('$1')\n" if ($dbg_values > 1); 1805dd88ab32SMasahiro Yamada push(@av_paren_type, $av_pending); 1806dd88ab32SMasahiro Yamada $av_pending = '_'; 1807dd88ab32SMasahiro Yamada $type = 'N'; 1808dd88ab32SMasahiro Yamada 1809dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\))/o) { 1810dd88ab32SMasahiro Yamada my $new_type = pop(@av_paren_type); 1811dd88ab32SMasahiro Yamada if ($new_type ne '_') { 1812dd88ab32SMasahiro Yamada $type = $new_type; 1813dd88ab32SMasahiro Yamada print "PAREN('$1') -> $type\n" 1814dd88ab32SMasahiro Yamada if ($dbg_values > 1); 1815dd88ab32SMasahiro Yamada } else { 1816dd88ab32SMasahiro Yamada print "PAREN('$1')\n" if ($dbg_values > 1); 1817dd88ab32SMasahiro Yamada } 1818dd88ab32SMasahiro Yamada 1819dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Ident)\s*\(/o) { 1820dd88ab32SMasahiro Yamada print "FUNC($1)\n" if ($dbg_values > 1); 1821dd88ab32SMasahiro Yamada $type = 'V'; 1822dd88ab32SMasahiro Yamada $av_pending = 'V'; 1823dd88ab32SMasahiro Yamada 1824dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) { 1825dd88ab32SMasahiro Yamada if (defined $2 && $type eq 'C' || $type eq 'T') { 1826dd88ab32SMasahiro Yamada $av_pend_colon = 'B'; 1827dd88ab32SMasahiro Yamada } elsif ($type eq 'E') { 1828dd88ab32SMasahiro Yamada $av_pend_colon = 'L'; 1829dd88ab32SMasahiro Yamada } 1830dd88ab32SMasahiro Yamada print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1); 1831dd88ab32SMasahiro Yamada $type = 'V'; 1832dd88ab32SMasahiro Yamada 1833dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Ident|$Constant)/o) { 1834dd88ab32SMasahiro Yamada print "IDENT($1)\n" if ($dbg_values > 1); 1835dd88ab32SMasahiro Yamada $type = 'V'; 1836dd88ab32SMasahiro Yamada 1837dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Assignment)/o) { 1838dd88ab32SMasahiro Yamada print "ASSIGN($1)\n" if ($dbg_values > 1); 1839dd88ab32SMasahiro Yamada $type = 'N'; 1840dd88ab32SMasahiro Yamada 1841dd88ab32SMasahiro Yamada } elsif ($cur =~/^(;|{|})/) { 1842dd88ab32SMasahiro Yamada print "END($1)\n" if ($dbg_values > 1); 1843dd88ab32SMasahiro Yamada $type = 'E'; 1844dd88ab32SMasahiro Yamada $av_pend_colon = 'O'; 1845dd88ab32SMasahiro Yamada 1846dd88ab32SMasahiro Yamada } elsif ($cur =~/^(,)/) { 1847dd88ab32SMasahiro Yamada print "COMMA($1)\n" if ($dbg_values > 1); 1848dd88ab32SMasahiro Yamada $type = 'C'; 1849dd88ab32SMasahiro Yamada 1850dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\?)/o) { 1851dd88ab32SMasahiro Yamada print "QUESTION($1)\n" if ($dbg_values > 1); 1852dd88ab32SMasahiro Yamada $type = 'N'; 1853dd88ab32SMasahiro Yamada 1854dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(:)/o) { 1855dd88ab32SMasahiro Yamada print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1); 1856dd88ab32SMasahiro Yamada 1857dd88ab32SMasahiro Yamada substr($var, length($res), 1, $av_pend_colon); 1858dd88ab32SMasahiro Yamada if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') { 1859dd88ab32SMasahiro Yamada $type = 'E'; 1860dd88ab32SMasahiro Yamada } else { 1861dd88ab32SMasahiro Yamada $type = 'N'; 1862dd88ab32SMasahiro Yamada } 1863dd88ab32SMasahiro Yamada $av_pend_colon = 'O'; 1864dd88ab32SMasahiro Yamada 1865dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(\[)/o) { 1866dd88ab32SMasahiro Yamada print "CLOSE($1)\n" if ($dbg_values > 1); 1867dd88ab32SMasahiro Yamada $type = 'N'; 1868dd88ab32SMasahiro Yamada 1869dd88ab32SMasahiro Yamada } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) { 1870dd88ab32SMasahiro Yamada my $variant; 1871dd88ab32SMasahiro Yamada 1872dd88ab32SMasahiro Yamada print "OPV($1)\n" if ($dbg_values > 1); 1873dd88ab32SMasahiro Yamada if ($type eq 'V') { 1874dd88ab32SMasahiro Yamada $variant = 'B'; 1875dd88ab32SMasahiro Yamada } else { 1876dd88ab32SMasahiro Yamada $variant = 'U'; 1877dd88ab32SMasahiro Yamada } 1878dd88ab32SMasahiro Yamada 1879dd88ab32SMasahiro Yamada substr($var, length($res), 1, $variant); 1880dd88ab32SMasahiro Yamada $type = 'N'; 1881dd88ab32SMasahiro Yamada 1882dd88ab32SMasahiro Yamada } elsif ($cur =~ /^($Operators)/o) { 1883dd88ab32SMasahiro Yamada print "OP($1)\n" if ($dbg_values > 1); 1884dd88ab32SMasahiro Yamada if ($1 ne '++' && $1 ne '--') { 1885dd88ab32SMasahiro Yamada $type = 'N'; 1886dd88ab32SMasahiro Yamada } 1887dd88ab32SMasahiro Yamada 1888dd88ab32SMasahiro Yamada } elsif ($cur =~ /(^.)/o) { 1889dd88ab32SMasahiro Yamada print "C($1)\n" if ($dbg_values > 1); 1890dd88ab32SMasahiro Yamada } 1891dd88ab32SMasahiro Yamada if (defined $1) { 1892dd88ab32SMasahiro Yamada $cur = substr($cur, length($1)); 1893dd88ab32SMasahiro Yamada $res .= $type x length($1); 1894dd88ab32SMasahiro Yamada } 1895dd88ab32SMasahiro Yamada } 1896dd88ab32SMasahiro Yamada 1897dd88ab32SMasahiro Yamada return ($res, $var); 1898dd88ab32SMasahiro Yamada} 1899dd88ab32SMasahiro Yamada 1900dd88ab32SMasahiro Yamadasub possible { 1901dd88ab32SMasahiro Yamada my ($possible, $line) = @_; 1902dd88ab32SMasahiro Yamada my $notPermitted = qr{(?: 1903dd88ab32SMasahiro Yamada ^(?: 1904dd88ab32SMasahiro Yamada $Modifier| 1905dd88ab32SMasahiro Yamada $Storage| 1906dd88ab32SMasahiro Yamada $Type| 1907dd88ab32SMasahiro Yamada DEFINE_\S+ 1908dd88ab32SMasahiro Yamada )$| 1909dd88ab32SMasahiro Yamada ^(?: 1910dd88ab32SMasahiro Yamada goto| 1911dd88ab32SMasahiro Yamada return| 1912dd88ab32SMasahiro Yamada case| 1913dd88ab32SMasahiro Yamada else| 1914dd88ab32SMasahiro Yamada asm|__asm__| 1915dd88ab32SMasahiro Yamada do| 1916dd88ab32SMasahiro Yamada \#| 1917dd88ab32SMasahiro Yamada \#\#| 1918dd88ab32SMasahiro Yamada )(?:\s|$)| 1919dd88ab32SMasahiro Yamada ^(?:typedef|struct|enum)\b 1920dd88ab32SMasahiro Yamada )}x; 1921dd88ab32SMasahiro Yamada warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2); 1922dd88ab32SMasahiro Yamada if ($possible !~ $notPermitted) { 1923dd88ab32SMasahiro Yamada # Check for modifiers. 1924dd88ab32SMasahiro Yamada $possible =~ s/\s*$Storage\s*//g; 1925dd88ab32SMasahiro Yamada $possible =~ s/\s*$Sparse\s*//g; 1926dd88ab32SMasahiro Yamada if ($possible =~ /^\s*$/) { 1927dd88ab32SMasahiro Yamada 1928dd88ab32SMasahiro Yamada } elsif ($possible =~ /\s/) { 1929dd88ab32SMasahiro Yamada $possible =~ s/\s*$Type\s*//g; 1930dd88ab32SMasahiro Yamada for my $modifier (split(' ', $possible)) { 1931dd88ab32SMasahiro Yamada if ($modifier !~ $notPermitted) { 1932dd88ab32SMasahiro Yamada warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible); 19336305db96SHeinrich Schuchardt push(@modifierListFile, $modifier); 1934dd88ab32SMasahiro Yamada } 1935dd88ab32SMasahiro Yamada } 1936dd88ab32SMasahiro Yamada 1937dd88ab32SMasahiro Yamada } else { 1938dd88ab32SMasahiro Yamada warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible); 19396305db96SHeinrich Schuchardt push(@typeListFile, $possible); 1940dd88ab32SMasahiro Yamada } 1941dd88ab32SMasahiro Yamada build_types(); 1942dd88ab32SMasahiro Yamada } else { 1943dd88ab32SMasahiro Yamada warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1); 1944dd88ab32SMasahiro Yamada } 1945dd88ab32SMasahiro Yamada} 1946dd88ab32SMasahiro Yamada 1947dd88ab32SMasahiro Yamadamy $prefix = ''; 1948dd88ab32SMasahiro Yamada 1949dd88ab32SMasahiro Yamadasub show_type { 19506305db96SHeinrich Schuchardt my ($type) = @_; 19516b9709d9STom Rini 19526305db96SHeinrich Schuchardt $type =~ tr/[a-z]/[A-Z]/; 19536305db96SHeinrich Schuchardt 19546305db96SHeinrich Schuchardt return defined $use_type{$type} if (scalar keys %use_type > 0); 19556305db96SHeinrich Schuchardt 19566305db96SHeinrich Schuchardt return !defined $ignore_type{$type}; 1957dd88ab32SMasahiro Yamada} 1958dd88ab32SMasahiro Yamada 1959dd88ab32SMasahiro Yamadasub report { 19606305db96SHeinrich Schuchardt my ($level, $type, $msg) = @_; 19616305db96SHeinrich Schuchardt 19626305db96SHeinrich Schuchardt if (!show_type($type) || 19636305db96SHeinrich Schuchardt (defined $tst_only && $msg !~ /\Q$tst_only\E/)) { 1964dd88ab32SMasahiro Yamada return 0; 1965dd88ab32SMasahiro Yamada } 19666305db96SHeinrich Schuchardt my $output = ''; 19676305db96SHeinrich Schuchardt if ($color) { 19686305db96SHeinrich Schuchardt if ($level eq 'ERROR') { 19696305db96SHeinrich Schuchardt $output .= RED; 19706305db96SHeinrich Schuchardt } elsif ($level eq 'WARNING') { 19716305db96SHeinrich Schuchardt $output .= YELLOW; 1972dd88ab32SMasahiro Yamada } else { 19736305db96SHeinrich Schuchardt $output .= GREEN; 1974dd88ab32SMasahiro Yamada } 19756305db96SHeinrich Schuchardt } 19766305db96SHeinrich Schuchardt $output .= $prefix . $level . ':'; 19776305db96SHeinrich Schuchardt if ($show_types) { 19786305db96SHeinrich Schuchardt $output .= BLUE if ($color); 19796305db96SHeinrich Schuchardt $output .= "$type:"; 19806305db96SHeinrich Schuchardt } 19816305db96SHeinrich Schuchardt $output .= RESET if ($color); 19826305db96SHeinrich Schuchardt $output .= ' ' . $msg . "\n"; 1983dd88ab32SMasahiro Yamada 19846305db96SHeinrich Schuchardt if ($showfile) { 19856305db96SHeinrich Schuchardt my @lines = split("\n", $output, -1); 19866305db96SHeinrich Schuchardt splice(@lines, 1, 1); 19876305db96SHeinrich Schuchardt $output = join("\n", @lines); 19886305db96SHeinrich Schuchardt } 19896305db96SHeinrich Schuchardt $output = (split('\n', $output))[0] . "\n" if ($terse); 19906305db96SHeinrich Schuchardt 19916305db96SHeinrich Schuchardt push(our @report, $output); 1992dd88ab32SMasahiro Yamada 1993dd88ab32SMasahiro Yamada return 1; 1994dd88ab32SMasahiro Yamada} 19956305db96SHeinrich Schuchardt 1996dd88ab32SMasahiro Yamadasub report_dump { 1997dd88ab32SMasahiro Yamada our @report; 1998dd88ab32SMasahiro Yamada} 1999dd88ab32SMasahiro Yamada 20006305db96SHeinrich Schuchardtsub fixup_current_range { 20016305db96SHeinrich Schuchardt my ($lineRef, $offset, $length) = @_; 20026305db96SHeinrich Schuchardt 20036305db96SHeinrich Schuchardt if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) { 20046305db96SHeinrich Schuchardt my $o = $1; 20056305db96SHeinrich Schuchardt my $l = $2; 20066305db96SHeinrich Schuchardt my $no = $o + $offset; 20076305db96SHeinrich Schuchardt my $nl = $l + $length; 20086305db96SHeinrich Schuchardt $$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/; 20096305db96SHeinrich Schuchardt } 20106305db96SHeinrich Schuchardt} 20116305db96SHeinrich Schuchardt 20126305db96SHeinrich Schuchardtsub fix_inserted_deleted_lines { 20136305db96SHeinrich Schuchardt my ($linesRef, $insertedRef, $deletedRef) = @_; 20146305db96SHeinrich Schuchardt 20156305db96SHeinrich Schuchardt my $range_last_linenr = 0; 20166305db96SHeinrich Schuchardt my $delta_offset = 0; 20176305db96SHeinrich Schuchardt 20186305db96SHeinrich Schuchardt my $old_linenr = 0; 20196305db96SHeinrich Schuchardt my $new_linenr = 0; 20206305db96SHeinrich Schuchardt 20216305db96SHeinrich Schuchardt my $next_insert = 0; 20226305db96SHeinrich Schuchardt my $next_delete = 0; 20236305db96SHeinrich Schuchardt 20246305db96SHeinrich Schuchardt my @lines = (); 20256305db96SHeinrich Schuchardt 20266305db96SHeinrich Schuchardt my $inserted = @{$insertedRef}[$next_insert++]; 20276305db96SHeinrich Schuchardt my $deleted = @{$deletedRef}[$next_delete++]; 20286305db96SHeinrich Schuchardt 20296305db96SHeinrich Schuchardt foreach my $old_line (@{$linesRef}) { 20306305db96SHeinrich Schuchardt my $save_line = 1; 20316305db96SHeinrich Schuchardt my $line = $old_line; #don't modify the array 20326305db96SHeinrich Schuchardt if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) { #new filename 20336305db96SHeinrich Schuchardt $delta_offset = 0; 20346305db96SHeinrich Schuchardt } elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) { #new hunk 20356305db96SHeinrich Schuchardt $range_last_linenr = $new_linenr; 20366305db96SHeinrich Schuchardt fixup_current_range(\$line, $delta_offset, 0); 20376305db96SHeinrich Schuchardt } 20386305db96SHeinrich Schuchardt 20396305db96SHeinrich Schuchardt while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) { 20406305db96SHeinrich Schuchardt $deleted = @{$deletedRef}[$next_delete++]; 20416305db96SHeinrich Schuchardt $save_line = 0; 20426305db96SHeinrich Schuchardt fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1); 20436305db96SHeinrich Schuchardt } 20446305db96SHeinrich Schuchardt 20456305db96SHeinrich Schuchardt while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) { 20466305db96SHeinrich Schuchardt push(@lines, ${$inserted}{'LINE'}); 20476305db96SHeinrich Schuchardt $inserted = @{$insertedRef}[$next_insert++]; 20486305db96SHeinrich Schuchardt $new_linenr++; 20496305db96SHeinrich Schuchardt fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1); 20506305db96SHeinrich Schuchardt } 20516305db96SHeinrich Schuchardt 20526305db96SHeinrich Schuchardt if ($save_line) { 20536305db96SHeinrich Schuchardt push(@lines, $line); 20546305db96SHeinrich Schuchardt $new_linenr++; 20556305db96SHeinrich Schuchardt } 20566305db96SHeinrich Schuchardt 20576305db96SHeinrich Schuchardt $old_linenr++; 20586305db96SHeinrich Schuchardt } 20596305db96SHeinrich Schuchardt 20606305db96SHeinrich Schuchardt return @lines; 20616305db96SHeinrich Schuchardt} 20626305db96SHeinrich Schuchardt 20636305db96SHeinrich Schuchardtsub fix_insert_line { 20646305db96SHeinrich Schuchardt my ($linenr, $line) = @_; 20656305db96SHeinrich Schuchardt 20666305db96SHeinrich Schuchardt my $inserted = { 20676305db96SHeinrich Schuchardt LINENR => $linenr, 20686305db96SHeinrich Schuchardt LINE => $line, 20696305db96SHeinrich Schuchardt }; 20706305db96SHeinrich Schuchardt push(@fixed_inserted, $inserted); 20716305db96SHeinrich Schuchardt} 20726305db96SHeinrich Schuchardt 20736305db96SHeinrich Schuchardtsub fix_delete_line { 20746305db96SHeinrich Schuchardt my ($linenr, $line) = @_; 20756305db96SHeinrich Schuchardt 20766305db96SHeinrich Schuchardt my $deleted = { 20776305db96SHeinrich Schuchardt LINENR => $linenr, 20786305db96SHeinrich Schuchardt LINE => $line, 20796305db96SHeinrich Schuchardt }; 20806305db96SHeinrich Schuchardt 20816305db96SHeinrich Schuchardt push(@fixed_deleted, $deleted); 20826305db96SHeinrich Schuchardt} 20836305db96SHeinrich Schuchardt 2084dd88ab32SMasahiro Yamadasub ERROR { 20856305db96SHeinrich Schuchardt my ($type, $msg) = @_; 20866305db96SHeinrich Schuchardt 20876305db96SHeinrich Schuchardt if (report("ERROR", $type, $msg)) { 2088dd88ab32SMasahiro Yamada our $clean = 0; 2089dd88ab32SMasahiro Yamada our $cnt_error++; 20906b9709d9STom Rini return 1; 2091dd88ab32SMasahiro Yamada } 20926b9709d9STom Rini return 0; 2093dd88ab32SMasahiro Yamada} 2094dd88ab32SMasahiro Yamadasub WARN { 20956305db96SHeinrich Schuchardt my ($type, $msg) = @_; 20966305db96SHeinrich Schuchardt 20976305db96SHeinrich Schuchardt if (report("WARNING", $type, $msg)) { 2098dd88ab32SMasahiro Yamada our $clean = 0; 2099dd88ab32SMasahiro Yamada our $cnt_warn++; 21006b9709d9STom Rini return 1; 2101dd88ab32SMasahiro Yamada } 21026b9709d9STom Rini return 0; 2103dd88ab32SMasahiro Yamada} 2104dd88ab32SMasahiro Yamadasub CHK { 21056305db96SHeinrich Schuchardt my ($type, $msg) = @_; 21066305db96SHeinrich Schuchardt 21076305db96SHeinrich Schuchardt if ($check && report("CHECK", $type, $msg)) { 2108dd88ab32SMasahiro Yamada our $clean = 0; 2109dd88ab32SMasahiro Yamada our $cnt_chk++; 21106b9709d9STom Rini return 1; 2111dd88ab32SMasahiro Yamada } 21126b9709d9STom Rini return 0; 2113dd88ab32SMasahiro Yamada} 2114dd88ab32SMasahiro Yamada 2115dd88ab32SMasahiro Yamadasub check_absolute_file { 2116dd88ab32SMasahiro Yamada my ($absolute, $herecurr) = @_; 2117dd88ab32SMasahiro Yamada my $file = $absolute; 2118dd88ab32SMasahiro Yamada 2119dd88ab32SMasahiro Yamada ##print "absolute<$absolute>\n"; 2120dd88ab32SMasahiro Yamada 2121dd88ab32SMasahiro Yamada # See if any suffix of this path is a path within the tree. 2122dd88ab32SMasahiro Yamada while ($file =~ s@^[^/]*/@@) { 2123dd88ab32SMasahiro Yamada if (-f "$root/$file") { 2124dd88ab32SMasahiro Yamada ##print "file<$file>\n"; 2125dd88ab32SMasahiro Yamada last; 2126dd88ab32SMasahiro Yamada } 2127dd88ab32SMasahiro Yamada } 2128dd88ab32SMasahiro Yamada if (! -f _) { 2129dd88ab32SMasahiro Yamada return 0; 2130dd88ab32SMasahiro Yamada } 2131dd88ab32SMasahiro Yamada 2132dd88ab32SMasahiro Yamada # It is, so see if the prefix is acceptable. 2133dd88ab32SMasahiro Yamada my $prefix = $absolute; 2134dd88ab32SMasahiro Yamada substr($prefix, -length($file)) = ''; 2135dd88ab32SMasahiro Yamada 2136dd88ab32SMasahiro Yamada ##print "prefix<$prefix>\n"; 2137dd88ab32SMasahiro Yamada if ($prefix ne ".../") { 2138dd88ab32SMasahiro Yamada WARN("USE_RELATIVE_PATH", 2139dd88ab32SMasahiro Yamada "use relative pathname instead of absolute in changelog text\n" . $herecurr); 2140dd88ab32SMasahiro Yamada } 2141dd88ab32SMasahiro Yamada} 2142dd88ab32SMasahiro Yamada 21436b9709d9STom Rinisub trim { 21446b9709d9STom Rini my ($string) = @_; 21456b9709d9STom Rini 21466b9709d9STom Rini $string =~ s/^\s+|\s+$//g; 21476b9709d9STom Rini 21486b9709d9STom Rini return $string; 21496b9709d9STom Rini} 21506b9709d9STom Rini 21516b9709d9STom Rinisub ltrim { 21526b9709d9STom Rini my ($string) = @_; 21536b9709d9STom Rini 21546b9709d9STom Rini $string =~ s/^\s+//; 21556b9709d9STom Rini 21566b9709d9STom Rini return $string; 21576b9709d9STom Rini} 21586b9709d9STom Rini 21596b9709d9STom Rinisub rtrim { 21606b9709d9STom Rini my ($string) = @_; 21616b9709d9STom Rini 21626b9709d9STom Rini $string =~ s/\s+$//; 21636b9709d9STom Rini 21646b9709d9STom Rini return $string; 21656b9709d9STom Rini} 21666b9709d9STom Rini 21676b9709d9STom Rinisub string_find_replace { 21686b9709d9STom Rini my ($string, $find, $replace) = @_; 21696b9709d9STom Rini 21706b9709d9STom Rini $string =~ s/$find/$replace/g; 21716b9709d9STom Rini 21726b9709d9STom Rini return $string; 21736b9709d9STom Rini} 21746b9709d9STom Rini 21756b9709d9STom Rinisub tabify { 21766b9709d9STom Rini my ($leading) = @_; 21776b9709d9STom Rini 21786b9709d9STom Rini my $source_indent = 8; 21796b9709d9STom Rini my $max_spaces_before_tab = $source_indent - 1; 21806b9709d9STom Rini my $spaces_to_tab = " " x $source_indent; 21816b9709d9STom Rini 21826b9709d9STom Rini #convert leading spaces to tabs 21836b9709d9STom Rini 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g; 21846b9709d9STom Rini #Remove spaces before a tab 21856b9709d9STom Rini 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g; 21866b9709d9STom Rini 21876b9709d9STom Rini return "$leading"; 21886b9709d9STom Rini} 21896b9709d9STom Rini 2190dd88ab32SMasahiro Yamadasub pos_last_openparen { 2191dd88ab32SMasahiro Yamada my ($line) = @_; 2192dd88ab32SMasahiro Yamada 2193dd88ab32SMasahiro Yamada my $pos = 0; 2194dd88ab32SMasahiro Yamada 2195dd88ab32SMasahiro Yamada my $opens = $line =~ tr/\(/\(/; 2196dd88ab32SMasahiro Yamada my $closes = $line =~ tr/\)/\)/; 2197dd88ab32SMasahiro Yamada 2198dd88ab32SMasahiro Yamada my $last_openparen = 0; 2199dd88ab32SMasahiro Yamada 2200dd88ab32SMasahiro Yamada if (($opens == 0) || ($closes >= $opens)) { 2201dd88ab32SMasahiro Yamada return -1; 2202dd88ab32SMasahiro Yamada } 2203dd88ab32SMasahiro Yamada 2204dd88ab32SMasahiro Yamada my $len = length($line); 2205dd88ab32SMasahiro Yamada 2206dd88ab32SMasahiro Yamada for ($pos = 0; $pos < $len; $pos++) { 2207dd88ab32SMasahiro Yamada my $string = substr($line, $pos); 2208dd88ab32SMasahiro Yamada if ($string =~ /^($FuncArg|$balanced_parens)/) { 2209dd88ab32SMasahiro Yamada $pos += length($1) - 1; 2210dd88ab32SMasahiro Yamada } elsif (substr($line, $pos, 1) eq '(') { 2211dd88ab32SMasahiro Yamada $last_openparen = $pos; 2212dd88ab32SMasahiro Yamada } elsif (index($string, '(') == -1) { 2213dd88ab32SMasahiro Yamada last; 2214dd88ab32SMasahiro Yamada } 2215dd88ab32SMasahiro Yamada } 2216dd88ab32SMasahiro Yamada 22176305db96SHeinrich Schuchardt return length(expand_tabs(substr($line, 0, $last_openparen))) + 1; 2218dd88ab32SMasahiro Yamada} 2219dd88ab32SMasahiro Yamada 2220dd88ab32SMasahiro Yamadasub process { 2221dd88ab32SMasahiro Yamada my $filename = shift; 2222dd88ab32SMasahiro Yamada 2223dd88ab32SMasahiro Yamada my $linenr=0; 2224dd88ab32SMasahiro Yamada my $prevline=""; 2225dd88ab32SMasahiro Yamada my $prevrawline=""; 2226dd88ab32SMasahiro Yamada my $stashline=""; 2227dd88ab32SMasahiro Yamada my $stashrawline=""; 2228dd88ab32SMasahiro Yamada 2229dd88ab32SMasahiro Yamada my $length; 2230dd88ab32SMasahiro Yamada my $indent; 2231dd88ab32SMasahiro Yamada my $previndent=0; 2232dd88ab32SMasahiro Yamada my $stashindent=0; 2233dd88ab32SMasahiro Yamada 2234dd88ab32SMasahiro Yamada our $clean = 1; 2235dd88ab32SMasahiro Yamada my $signoff = 0; 2236dd88ab32SMasahiro Yamada my $is_patch = 0; 22376305db96SHeinrich Schuchardt my $in_header_lines = $file ? 0 : 1; 2238dd88ab32SMasahiro Yamada my $in_commit_log = 0; #Scanning lines before patch 22396305db96SHeinrich Schuchardt my $has_commit_log = 0; #Encountered lines before patch 22406305db96SHeinrich Schuchardt my $commit_log_possible_stack_dump = 0; 22416305db96SHeinrich Schuchardt my $commit_log_long_line = 0; 22426305db96SHeinrich Schuchardt my $commit_log_has_diff = 0; 22436305db96SHeinrich Schuchardt my $reported_maintainer_file = 0; 2244dd88ab32SMasahiro Yamada my $non_utf8_charset = 0; 2245dd88ab32SMasahiro Yamada 22466305db96SHeinrich Schuchardt my $last_blank_line = 0; 22476305db96SHeinrich Schuchardt my $last_coalesced_string_linenr = -1; 22486305db96SHeinrich Schuchardt 2249dd88ab32SMasahiro Yamada our @report = (); 2250dd88ab32SMasahiro Yamada our $cnt_lines = 0; 2251dd88ab32SMasahiro Yamada our $cnt_error = 0; 2252dd88ab32SMasahiro Yamada our $cnt_warn = 0; 2253dd88ab32SMasahiro Yamada our $cnt_chk = 0; 2254dd88ab32SMasahiro Yamada 2255dd88ab32SMasahiro Yamada # Trace the real file/line as we go. 2256dd88ab32SMasahiro Yamada my $realfile = ''; 2257dd88ab32SMasahiro Yamada my $realline = 0; 2258dd88ab32SMasahiro Yamada my $realcnt = 0; 2259dd88ab32SMasahiro Yamada my $here = ''; 22606305db96SHeinrich Schuchardt my $context_function; #undef'd unless there's a known function 2261dd88ab32SMasahiro Yamada my $in_comment = 0; 2262dd88ab32SMasahiro Yamada my $comment_edge = 0; 2263dd88ab32SMasahiro Yamada my $first_line = 0; 2264dd88ab32SMasahiro Yamada my $p1_prefix = ''; 2265dd88ab32SMasahiro Yamada 2266dd88ab32SMasahiro Yamada my $prev_values = 'E'; 2267dd88ab32SMasahiro Yamada 2268dd88ab32SMasahiro Yamada # suppression flags 2269dd88ab32SMasahiro Yamada my %suppress_ifbraces; 2270dd88ab32SMasahiro Yamada my %suppress_whiletrailers; 2271dd88ab32SMasahiro Yamada my %suppress_export; 2272dd88ab32SMasahiro Yamada my $suppress_statement = 0; 2273dd88ab32SMasahiro Yamada 22746b9709d9STom Rini my %signatures = (); 2275dd88ab32SMasahiro Yamada 2276dd88ab32SMasahiro Yamada # Pre-scan the patch sanitizing the lines. 2277dd88ab32SMasahiro Yamada # Pre-scan the patch looking for any __setup documentation. 2278dd88ab32SMasahiro Yamada # 2279dd88ab32SMasahiro Yamada my @setup_docs = (); 2280dd88ab32SMasahiro Yamada my $setup_docs = 0; 2281dd88ab32SMasahiro Yamada 22826b9709d9STom Rini my $camelcase_file_seeded = 0; 22836b9709d9STom Rini 2284*c398f2dfSHeinrich Schuchardt my $checklicenseline = 1; 2285*c398f2dfSHeinrich Schuchardt 2286dd88ab32SMasahiro Yamada sanitise_line_reset(); 2287dd88ab32SMasahiro Yamada my $line; 2288dd88ab32SMasahiro Yamada foreach my $rawline (@rawlines) { 2289dd88ab32SMasahiro Yamada $linenr++; 2290dd88ab32SMasahiro Yamada $line = $rawline; 2291dd88ab32SMasahiro Yamada 22926b9709d9STom Rini push(@fixed, $rawline) if ($fix); 22936b9709d9STom Rini 2294dd88ab32SMasahiro Yamada if ($rawline=~/^\+\+\+\s+(\S+)/) { 2295dd88ab32SMasahiro Yamada $setup_docs = 0; 22966305db96SHeinrich Schuchardt if ($1 =~ m@Documentation/admin-guide/kernel-parameters.rst$@) { 2297dd88ab32SMasahiro Yamada $setup_docs = 1; 2298dd88ab32SMasahiro Yamada } 2299dd88ab32SMasahiro Yamada #next; 2300dd88ab32SMasahiro Yamada } 2301dd88ab32SMasahiro Yamada if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) { 2302dd88ab32SMasahiro Yamada $realline=$1-1; 2303dd88ab32SMasahiro Yamada if (defined $2) { 2304dd88ab32SMasahiro Yamada $realcnt=$3+1; 2305dd88ab32SMasahiro Yamada } else { 2306dd88ab32SMasahiro Yamada $realcnt=1+1; 2307dd88ab32SMasahiro Yamada } 2308dd88ab32SMasahiro Yamada $in_comment = 0; 2309dd88ab32SMasahiro Yamada 2310dd88ab32SMasahiro Yamada # Guestimate if this is a continuing comment. Run 2311dd88ab32SMasahiro Yamada # the context looking for a comment "edge". If this 2312dd88ab32SMasahiro Yamada # edge is a close comment then we must be in a comment 2313dd88ab32SMasahiro Yamada # at context start. 2314dd88ab32SMasahiro Yamada my $edge; 2315dd88ab32SMasahiro Yamada my $cnt = $realcnt; 2316dd88ab32SMasahiro Yamada for (my $ln = $linenr + 1; $cnt > 0; $ln++) { 2317dd88ab32SMasahiro Yamada next if (defined $rawlines[$ln - 1] && 2318dd88ab32SMasahiro Yamada $rawlines[$ln - 1] =~ /^-/); 2319dd88ab32SMasahiro Yamada $cnt--; 2320dd88ab32SMasahiro Yamada #print "RAW<$rawlines[$ln - 1]>\n"; 2321dd88ab32SMasahiro Yamada last if (!defined $rawlines[$ln - 1]); 2322dd88ab32SMasahiro Yamada if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ && 2323dd88ab32SMasahiro Yamada $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) { 2324dd88ab32SMasahiro Yamada ($edge) = $1; 2325dd88ab32SMasahiro Yamada last; 2326dd88ab32SMasahiro Yamada } 2327dd88ab32SMasahiro Yamada } 2328dd88ab32SMasahiro Yamada if (defined $edge && $edge eq '*/') { 2329dd88ab32SMasahiro Yamada $in_comment = 1; 2330dd88ab32SMasahiro Yamada } 2331dd88ab32SMasahiro Yamada 2332dd88ab32SMasahiro Yamada # Guestimate if this is a continuing comment. If this 2333dd88ab32SMasahiro Yamada # is the start of a diff block and this line starts 2334dd88ab32SMasahiro Yamada # ' *' then it is very likely a comment. 2335dd88ab32SMasahiro Yamada if (!defined $edge && 2336dd88ab32SMasahiro Yamada $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@) 2337dd88ab32SMasahiro Yamada { 2338dd88ab32SMasahiro Yamada $in_comment = 1; 2339dd88ab32SMasahiro Yamada } 2340dd88ab32SMasahiro Yamada 2341dd88ab32SMasahiro Yamada ##print "COMMENT:$in_comment edge<$edge> $rawline\n"; 2342dd88ab32SMasahiro Yamada sanitise_line_reset($in_comment); 2343dd88ab32SMasahiro Yamada 2344dd88ab32SMasahiro Yamada } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) { 2345dd88ab32SMasahiro Yamada # Standardise the strings and chars within the input to 2346dd88ab32SMasahiro Yamada # simplify matching -- only bother with positive lines. 2347dd88ab32SMasahiro Yamada $line = sanitise_line($rawline); 2348dd88ab32SMasahiro Yamada } 2349dd88ab32SMasahiro Yamada push(@lines, $line); 2350dd88ab32SMasahiro Yamada 2351dd88ab32SMasahiro Yamada if ($realcnt > 1) { 2352dd88ab32SMasahiro Yamada $realcnt-- if ($line =~ /^(?:\+| |$)/); 2353dd88ab32SMasahiro Yamada } else { 2354dd88ab32SMasahiro Yamada $realcnt = 0; 2355dd88ab32SMasahiro Yamada } 2356dd88ab32SMasahiro Yamada 2357dd88ab32SMasahiro Yamada #print "==>$rawline\n"; 2358dd88ab32SMasahiro Yamada #print "-->$line\n"; 2359dd88ab32SMasahiro Yamada 2360dd88ab32SMasahiro Yamada if ($setup_docs && $line =~ /^\+/) { 2361dd88ab32SMasahiro Yamada push(@setup_docs, $line); 2362dd88ab32SMasahiro Yamada } 2363dd88ab32SMasahiro Yamada } 2364dd88ab32SMasahiro Yamada 2365dd88ab32SMasahiro Yamada $prefix = ''; 2366dd88ab32SMasahiro Yamada 2367dd88ab32SMasahiro Yamada $realcnt = 0; 2368dd88ab32SMasahiro Yamada $linenr = 0; 23696305db96SHeinrich Schuchardt $fixlinenr = -1; 2370dd88ab32SMasahiro Yamada foreach my $line (@lines) { 2371dd88ab32SMasahiro Yamada $linenr++; 23726305db96SHeinrich Schuchardt $fixlinenr++; 23736b9709d9STom Rini my $sline = $line; #copy of $line 23746b9709d9STom Rini $sline =~ s/$;/ /g; #with comments as spaces 2375dd88ab32SMasahiro Yamada 2376dd88ab32SMasahiro Yamada my $rawline = $rawlines[$linenr - 1]; 2377dd88ab32SMasahiro Yamada 2378dd88ab32SMasahiro Yamada#extract the line range in the file after the patch is applied 23796305db96SHeinrich Schuchardt if (!$in_commit_log && 23806305db96SHeinrich Schuchardt $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) { 23816305db96SHeinrich Schuchardt my $context = $4; 2382dd88ab32SMasahiro Yamada $is_patch = 1; 2383dd88ab32SMasahiro Yamada $first_line = $linenr + 1; 2384dd88ab32SMasahiro Yamada $realline=$1-1; 2385dd88ab32SMasahiro Yamada if (defined $2) { 2386dd88ab32SMasahiro Yamada $realcnt=$3+1; 2387dd88ab32SMasahiro Yamada } else { 2388dd88ab32SMasahiro Yamada $realcnt=1+1; 2389dd88ab32SMasahiro Yamada } 2390dd88ab32SMasahiro Yamada annotate_reset(); 2391dd88ab32SMasahiro Yamada $prev_values = 'E'; 2392dd88ab32SMasahiro Yamada 2393dd88ab32SMasahiro Yamada %suppress_ifbraces = (); 2394dd88ab32SMasahiro Yamada %suppress_whiletrailers = (); 2395dd88ab32SMasahiro Yamada %suppress_export = (); 2396dd88ab32SMasahiro Yamada $suppress_statement = 0; 23976305db96SHeinrich Schuchardt if ($context =~ /\b(\w+)\s*\(/) { 23986305db96SHeinrich Schuchardt $context_function = $1; 23996305db96SHeinrich Schuchardt } else { 24006305db96SHeinrich Schuchardt undef $context_function; 24016305db96SHeinrich Schuchardt } 2402dd88ab32SMasahiro Yamada next; 2403dd88ab32SMasahiro Yamada 2404dd88ab32SMasahiro Yamada# track the line number as we move through the hunk, note that 2405dd88ab32SMasahiro Yamada# new versions of GNU diff omit the leading space on completely 2406dd88ab32SMasahiro Yamada# blank context lines so we need to count that too. 2407dd88ab32SMasahiro Yamada } elsif ($line =~ /^( |\+|$)/) { 2408dd88ab32SMasahiro Yamada $realline++; 2409dd88ab32SMasahiro Yamada $realcnt-- if ($realcnt != 0); 2410dd88ab32SMasahiro Yamada 2411dd88ab32SMasahiro Yamada # Measure the line length and indent. 2412dd88ab32SMasahiro Yamada ($length, $indent) = line_stats($rawline); 2413dd88ab32SMasahiro Yamada 2414dd88ab32SMasahiro Yamada # Track the previous line. 2415dd88ab32SMasahiro Yamada ($prevline, $stashline) = ($stashline, $line); 2416dd88ab32SMasahiro Yamada ($previndent, $stashindent) = ($stashindent, $indent); 2417dd88ab32SMasahiro Yamada ($prevrawline, $stashrawline) = ($stashrawline, $rawline); 2418dd88ab32SMasahiro Yamada 2419dd88ab32SMasahiro Yamada #warn "line<$line>\n"; 2420dd88ab32SMasahiro Yamada 2421dd88ab32SMasahiro Yamada } elsif ($realcnt == 1) { 2422dd88ab32SMasahiro Yamada $realcnt--; 2423dd88ab32SMasahiro Yamada } 2424dd88ab32SMasahiro Yamada 2425dd88ab32SMasahiro Yamada my $hunk_line = ($realcnt != 0); 2426dd88ab32SMasahiro Yamada 2427dd88ab32SMasahiro Yamada $here = "#$linenr: " if (!$file); 2428dd88ab32SMasahiro Yamada $here = "#$realline: " if ($file); 2429dd88ab32SMasahiro Yamada 24306305db96SHeinrich Schuchardt my $found_file = 0; 2431dd88ab32SMasahiro Yamada # extract the filename as it passes 2432dd88ab32SMasahiro Yamada if ($line =~ /^diff --git.*?(\S+)$/) { 2433dd88ab32SMasahiro Yamada $realfile = $1; 24346b9709d9STom Rini $realfile =~ s@^([^/]*)/@@ if (!$file); 2435dd88ab32SMasahiro Yamada $in_commit_log = 0; 24366305db96SHeinrich Schuchardt $found_file = 1; 2437dd88ab32SMasahiro Yamada } elsif ($line =~ /^\+\+\+\s+(\S+)/) { 2438dd88ab32SMasahiro Yamada $realfile = $1; 24396b9709d9STom Rini $realfile =~ s@^([^/]*)/@@ if (!$file); 2440dd88ab32SMasahiro Yamada $in_commit_log = 0; 2441dd88ab32SMasahiro Yamada 2442dd88ab32SMasahiro Yamada $p1_prefix = $1; 2443dd88ab32SMasahiro Yamada if (!$file && $tree && $p1_prefix ne '' && 2444dd88ab32SMasahiro Yamada -e "$root/$p1_prefix") { 2445dd88ab32SMasahiro Yamada WARN("PATCH_PREFIX", 2446dd88ab32SMasahiro Yamada "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n"); 2447dd88ab32SMasahiro Yamada } 2448dd88ab32SMasahiro Yamada 2449dd88ab32SMasahiro Yamada if ($realfile =~ m@^include/asm/@) { 2450dd88ab32SMasahiro Yamada ERROR("MODIFIED_INCLUDE_ASM", 2451dd88ab32SMasahiro Yamada "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n"); 2452dd88ab32SMasahiro Yamada } 24536305db96SHeinrich Schuchardt $found_file = 1; 24546305db96SHeinrich Schuchardt } 24556305db96SHeinrich Schuchardt 24566305db96SHeinrich Schuchardt#make up the handle for any error we report on this line 24576305db96SHeinrich Schuchardt if ($showfile) { 24586305db96SHeinrich Schuchardt $prefix = "$realfile:$realline: " 24596305db96SHeinrich Schuchardt } elsif ($emacs) { 24606305db96SHeinrich Schuchardt if ($file) { 24616305db96SHeinrich Schuchardt $prefix = "$filename:$realline: "; 24626305db96SHeinrich Schuchardt } else { 24636305db96SHeinrich Schuchardt $prefix = "$filename:$linenr: "; 24646305db96SHeinrich Schuchardt } 24656305db96SHeinrich Schuchardt } 24666305db96SHeinrich Schuchardt 24676305db96SHeinrich Schuchardt if ($found_file) { 24686305db96SHeinrich Schuchardt if (is_maintained_obsolete($realfile)) { 24696305db96SHeinrich Schuchardt WARN("OBSOLETE", 24706305db96SHeinrich Schuchardt "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy. No unnecessary modifications please.\n"); 24716305db96SHeinrich Schuchardt } 24726305db96SHeinrich Schuchardt if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) { 24736305db96SHeinrich Schuchardt $check = 1; 24746305db96SHeinrich Schuchardt } else { 24756305db96SHeinrich Schuchardt $check = $check_orig; 24766305db96SHeinrich Schuchardt } 2477*c398f2dfSHeinrich Schuchardt $checklicenseline = 1; 2478dd88ab32SMasahiro Yamada next; 2479dd88ab32SMasahiro Yamada } 2480dd88ab32SMasahiro Yamada 2481dd88ab32SMasahiro Yamada $here .= "FILE: $realfile:$realline:" if ($realcnt != 0); 2482dd88ab32SMasahiro Yamada 2483dd88ab32SMasahiro Yamada my $hereline = "$here\n$rawline\n"; 2484dd88ab32SMasahiro Yamada my $herecurr = "$here\n$rawline\n"; 2485dd88ab32SMasahiro Yamada my $hereprev = "$here\n$prevrawline\n$rawline\n"; 2486dd88ab32SMasahiro Yamada 2487dd88ab32SMasahiro Yamada $cnt_lines++ if ($realcnt != 0); 2488dd88ab32SMasahiro Yamada 24896305db96SHeinrich Schuchardt# Check if the commit log has what seems like a diff which can confuse patch 24906305db96SHeinrich Schuchardt if ($in_commit_log && !$commit_log_has_diff && 24916305db96SHeinrich Schuchardt (($line =~ m@^\s+diff\b.*a/[\w/]+@ && 24926305db96SHeinrich Schuchardt $line =~ m@^\s+diff\b.*a/([\w/]+)\s+b/$1\b@) || 24936305db96SHeinrich Schuchardt $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ || 24946305db96SHeinrich Schuchardt $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) { 24956305db96SHeinrich Schuchardt ERROR("DIFF_IN_COMMIT_MSG", 24966305db96SHeinrich Schuchardt "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr); 24976305db96SHeinrich Schuchardt $commit_log_has_diff = 1; 24986305db96SHeinrich Schuchardt } 24996305db96SHeinrich Schuchardt 2500dd88ab32SMasahiro Yamada# Check for incorrect file permissions 2501dd88ab32SMasahiro Yamada if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) { 2502dd88ab32SMasahiro Yamada my $permhere = $here . "FILE: $realfile\n"; 25036b9709d9STom Rini if ($realfile !~ m@scripts/@ && 25046b9709d9STom Rini $realfile !~ /\.(py|pl|awk|sh)$/) { 2505dd88ab32SMasahiro Yamada ERROR("EXECUTE_PERMISSIONS", 2506dd88ab32SMasahiro Yamada "do not set execute permissions for source files\n" . $permhere); 2507dd88ab32SMasahiro Yamada } 2508dd88ab32SMasahiro Yamada } 2509dd88ab32SMasahiro Yamada 2510dd88ab32SMasahiro Yamada# Check the patch for a signoff: 2511dd88ab32SMasahiro Yamada if ($line =~ /^\s*signed-off-by:/i) { 2512dd88ab32SMasahiro Yamada $signoff++; 2513dd88ab32SMasahiro Yamada $in_commit_log = 0; 2514dd88ab32SMasahiro Yamada } 2515dd88ab32SMasahiro Yamada 25166305db96SHeinrich Schuchardt# Check if MAINTAINERS is being updated. If so, there's probably no need to 25176305db96SHeinrich Schuchardt# emit the "does MAINTAINERS need updating?" message on file add/move/delete 25186305db96SHeinrich Schuchardt if ($line =~ /^\s*MAINTAINERS\s*\|/) { 25196305db96SHeinrich Schuchardt $reported_maintainer_file = 1; 25206305db96SHeinrich Schuchardt } 25216305db96SHeinrich Schuchardt 2522dd88ab32SMasahiro Yamada# Check signature styles 2523dd88ab32SMasahiro Yamada if (!$in_header_lines && 2524dd88ab32SMasahiro Yamada $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) { 2525dd88ab32SMasahiro Yamada my $space_before = $1; 2526dd88ab32SMasahiro Yamada my $sign_off = $2; 2527dd88ab32SMasahiro Yamada my $space_after = $3; 2528dd88ab32SMasahiro Yamada my $email = $4; 2529dd88ab32SMasahiro Yamada my $ucfirst_sign_off = ucfirst(lc($sign_off)); 2530dd88ab32SMasahiro Yamada 2531dd88ab32SMasahiro Yamada if ($sign_off !~ /$signature_tags/) { 2532dd88ab32SMasahiro Yamada WARN("BAD_SIGN_OFF", 2533dd88ab32SMasahiro Yamada "Non-standard signature: $sign_off\n" . $herecurr); 2534dd88ab32SMasahiro Yamada } 2535dd88ab32SMasahiro Yamada if (defined $space_before && $space_before ne "") { 25366b9709d9STom Rini if (WARN("BAD_SIGN_OFF", 25376b9709d9STom Rini "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) && 25386b9709d9STom Rini $fix) { 25396305db96SHeinrich Schuchardt $fixed[$fixlinenr] = 25406b9709d9STom Rini "$ucfirst_sign_off $email"; 25416b9709d9STom Rini } 2542dd88ab32SMasahiro Yamada } 2543dd88ab32SMasahiro Yamada if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) { 25446b9709d9STom Rini if (WARN("BAD_SIGN_OFF", 25456b9709d9STom Rini "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) && 25466b9709d9STom Rini $fix) { 25476305db96SHeinrich Schuchardt $fixed[$fixlinenr] = 25486b9709d9STom Rini "$ucfirst_sign_off $email"; 25496b9709d9STom Rini } 25506b9709d9STom Rini 2551dd88ab32SMasahiro Yamada } 2552dd88ab32SMasahiro Yamada if (!defined $space_after || $space_after ne " ") { 25536b9709d9STom Rini if (WARN("BAD_SIGN_OFF", 25546b9709d9STom Rini "Use a single space after $ucfirst_sign_off\n" . $herecurr) && 25556b9709d9STom Rini $fix) { 25566305db96SHeinrich Schuchardt $fixed[$fixlinenr] = 25576b9709d9STom Rini "$ucfirst_sign_off $email"; 25586b9709d9STom Rini } 2559dd88ab32SMasahiro Yamada } 2560dd88ab32SMasahiro Yamada 2561dd88ab32SMasahiro Yamada my ($email_name, $email_address, $comment) = parse_email($email); 2562dd88ab32SMasahiro Yamada my $suggested_email = format_email(($email_name, $email_address)); 2563dd88ab32SMasahiro Yamada if ($suggested_email eq "") { 2564dd88ab32SMasahiro Yamada ERROR("BAD_SIGN_OFF", 2565dd88ab32SMasahiro Yamada "Unrecognized email address: '$email'\n" . $herecurr); 2566dd88ab32SMasahiro Yamada } else { 2567dd88ab32SMasahiro Yamada my $dequoted = $suggested_email; 2568dd88ab32SMasahiro Yamada $dequoted =~ s/^"//; 2569dd88ab32SMasahiro Yamada $dequoted =~ s/" </ </; 2570dd88ab32SMasahiro Yamada # Don't force email to have quotes 2571dd88ab32SMasahiro Yamada # Allow just an angle bracketed address 2572dd88ab32SMasahiro Yamada if ("$dequoted$comment" ne $email && 2573dd88ab32SMasahiro Yamada "<$email_address>$comment" ne $email && 2574dd88ab32SMasahiro Yamada "$suggested_email$comment" ne $email) { 2575dd88ab32SMasahiro Yamada WARN("BAD_SIGN_OFF", 2576dd88ab32SMasahiro Yamada "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr); 2577dd88ab32SMasahiro Yamada } 2578dd88ab32SMasahiro Yamada } 25796b9709d9STom Rini 25806b9709d9STom Rini# Check for duplicate signatures 25816b9709d9STom Rini my $sig_nospace = $line; 25826b9709d9STom Rini $sig_nospace =~ s/\s//g; 25836b9709d9STom Rini $sig_nospace = lc($sig_nospace); 25846b9709d9STom Rini if (defined $signatures{$sig_nospace}) { 25856b9709d9STom Rini WARN("BAD_SIGN_OFF", 25866b9709d9STom Rini "Duplicate signature\n" . $herecurr); 25876b9709d9STom Rini } else { 25886b9709d9STom Rini $signatures{$sig_nospace} = 1; 25896b9709d9STom Rini } 2590dd88ab32SMasahiro Yamada } 2591dd88ab32SMasahiro Yamada 25926305db96SHeinrich Schuchardt# Check email subject for common tools that don't need to be mentioned 25936305db96SHeinrich Schuchardt if ($in_header_lines && 25946305db96SHeinrich Schuchardt $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) { 25956305db96SHeinrich Schuchardt WARN("EMAIL_SUBJECT", 25966305db96SHeinrich Schuchardt "A patch subject line should describe the change not the tool that found it\n" . $herecurr); 25976305db96SHeinrich Schuchardt } 25986305db96SHeinrich Schuchardt 25996305db96SHeinrich Schuchardt# Check for old stable address 26006305db96SHeinrich Schuchardt if ($line =~ /^\s*cc:\s*.*<?\bstable\@kernel\.org\b>?.*$/i) { 26016305db96SHeinrich Schuchardt ERROR("STABLE_ADDRESS", 26026305db96SHeinrich Schuchardt "The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr); 26036305db96SHeinrich Schuchardt } 26046305db96SHeinrich Schuchardt 26056305db96SHeinrich Schuchardt# Check for unwanted Gerrit info 26066305db96SHeinrich Schuchardt if ($in_commit_log && $line =~ /^\s*change-id:/i) { 26076305db96SHeinrich Schuchardt ERROR("GERRIT_CHANGE_ID", 26086305db96SHeinrich Schuchardt "Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr); 26096305db96SHeinrich Schuchardt } 26106305db96SHeinrich Schuchardt 26116305db96SHeinrich Schuchardt# Check if the commit log is in a possible stack dump 26126305db96SHeinrich Schuchardt if ($in_commit_log && !$commit_log_possible_stack_dump && 26136305db96SHeinrich Schuchardt ($line =~ /^\s*(?:WARNING:|BUG:)/ || 26146305db96SHeinrich Schuchardt $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ || 26156305db96SHeinrich Schuchardt # timestamp 26166305db96SHeinrich Schuchardt $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/)) { 26176305db96SHeinrich Schuchardt # stack dump address 26186305db96SHeinrich Schuchardt $commit_log_possible_stack_dump = 1; 26196305db96SHeinrich Schuchardt } 26206305db96SHeinrich Schuchardt 26216305db96SHeinrich Schuchardt# Check for line lengths > 75 in commit log, warn once 26226305db96SHeinrich Schuchardt if ($in_commit_log && !$commit_log_long_line && 26236305db96SHeinrich Schuchardt length($line) > 75 && 26246305db96SHeinrich Schuchardt !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ || 26256305db96SHeinrich Schuchardt # file delta changes 26266305db96SHeinrich Schuchardt $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ || 26276305db96SHeinrich Schuchardt # filename then : 26286305db96SHeinrich Schuchardt $line =~ /^\s*(?:Fixes:|Link:)/i || 26296305db96SHeinrich Schuchardt # A Fixes: or Link: line 26306305db96SHeinrich Schuchardt $commit_log_possible_stack_dump)) { 26316305db96SHeinrich Schuchardt WARN("COMMIT_LOG_LONG_LINE", 26326305db96SHeinrich Schuchardt "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr); 26336305db96SHeinrich Schuchardt $commit_log_long_line = 1; 26346305db96SHeinrich Schuchardt } 26356305db96SHeinrich Schuchardt 26366305db96SHeinrich Schuchardt# Reset possible stack dump if a blank line is found 26376305db96SHeinrich Schuchardt if ($in_commit_log && $commit_log_possible_stack_dump && 26386305db96SHeinrich Schuchardt $line =~ /^\s*$/) { 26396305db96SHeinrich Schuchardt $commit_log_possible_stack_dump = 0; 26406305db96SHeinrich Schuchardt } 26416305db96SHeinrich Schuchardt 26426305db96SHeinrich Schuchardt# Check for git id commit length and improperly formed commit descriptions 26436305db96SHeinrich Schuchardt if ($in_commit_log && !$commit_log_possible_stack_dump && 26446305db96SHeinrich Schuchardt $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i && 26456305db96SHeinrich Schuchardt $line !~ /^This reverts commit [0-9a-f]{7,40}/ && 26466305db96SHeinrich Schuchardt ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i || 26476305db96SHeinrich Schuchardt ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i && 26486305db96SHeinrich Schuchardt $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i && 26496305db96SHeinrich Schuchardt $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) { 26506305db96SHeinrich Schuchardt my $init_char = "c"; 26516305db96SHeinrich Schuchardt my $orig_commit = ""; 26526305db96SHeinrich Schuchardt my $short = 1; 26536305db96SHeinrich Schuchardt my $long = 0; 26546305db96SHeinrich Schuchardt my $case = 1; 26556305db96SHeinrich Schuchardt my $space = 1; 26566305db96SHeinrich Schuchardt my $hasdesc = 0; 26576305db96SHeinrich Schuchardt my $hasparens = 0; 26586305db96SHeinrich Schuchardt my $id = '0123456789ab'; 26596305db96SHeinrich Schuchardt my $orig_desc = "commit description"; 26606305db96SHeinrich Schuchardt my $description = ""; 26616305db96SHeinrich Schuchardt 26626305db96SHeinrich Schuchardt if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) { 26636305db96SHeinrich Schuchardt $init_char = $1; 26646305db96SHeinrich Schuchardt $orig_commit = lc($2); 26656305db96SHeinrich Schuchardt } elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) { 26666305db96SHeinrich Schuchardt $orig_commit = lc($1); 26676305db96SHeinrich Schuchardt } 26686305db96SHeinrich Schuchardt 26696305db96SHeinrich Schuchardt $short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i); 26706305db96SHeinrich Schuchardt $long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i); 26716305db96SHeinrich Schuchardt $space = 0 if ($line =~ /\bcommit [0-9a-f]/i); 26726305db96SHeinrich Schuchardt $case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/); 26736305db96SHeinrich Schuchardt if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) { 26746305db96SHeinrich Schuchardt $orig_desc = $1; 26756305db96SHeinrich Schuchardt $hasparens = 1; 26766305db96SHeinrich Schuchardt } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i && 26776305db96SHeinrich Schuchardt defined $rawlines[$linenr] && 26786305db96SHeinrich Schuchardt $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) { 26796305db96SHeinrich Schuchardt $orig_desc = $1; 26806305db96SHeinrich Schuchardt $hasparens = 1; 26816305db96SHeinrich Schuchardt } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i && 26826305db96SHeinrich Schuchardt defined $rawlines[$linenr] && 26836305db96SHeinrich Schuchardt $rawlines[$linenr] =~ /^\s*[^"]+"\)/) { 26846305db96SHeinrich Schuchardt $line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i; 26856305db96SHeinrich Schuchardt $orig_desc = $1; 26866305db96SHeinrich Schuchardt $rawlines[$linenr] =~ /^\s*([^"]+)"\)/; 26876305db96SHeinrich Schuchardt $orig_desc .= " " . $1; 26886305db96SHeinrich Schuchardt $hasparens = 1; 26896305db96SHeinrich Schuchardt } 26906305db96SHeinrich Schuchardt 26916305db96SHeinrich Schuchardt ($id, $description) = git_commit_info($orig_commit, 26926305db96SHeinrich Schuchardt $id, $orig_desc); 26936305db96SHeinrich Schuchardt 26946305db96SHeinrich Schuchardt if (defined($id) && 26956305db96SHeinrich Schuchardt ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) { 26966305db96SHeinrich Schuchardt ERROR("GIT_COMMIT_ID", 26976305db96SHeinrich Schuchardt "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr); 26986305db96SHeinrich Schuchardt } 26996305db96SHeinrich Schuchardt } 27006305db96SHeinrich Schuchardt 27016305db96SHeinrich Schuchardt# Check for added, moved or deleted files 27026305db96SHeinrich Schuchardt if (!$reported_maintainer_file && !$in_commit_log && 27036305db96SHeinrich Schuchardt ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ || 27046305db96SHeinrich Schuchardt $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ || 27056305db96SHeinrich Schuchardt ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ && 27066305db96SHeinrich Schuchardt (defined($1) || defined($2))))) { 27076305db96SHeinrich Schuchardt $is_patch = 1; 27086305db96SHeinrich Schuchardt $reported_maintainer_file = 1; 27096305db96SHeinrich Schuchardt WARN("FILE_PATH_CHANGES", 27106305db96SHeinrich Schuchardt "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr); 27116305db96SHeinrich Schuchardt } 27126305db96SHeinrich Schuchardt 2713dd88ab32SMasahiro Yamada# Check for wrappage within a valid hunk of the file 2714dd88ab32SMasahiro Yamada if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) { 2715dd88ab32SMasahiro Yamada ERROR("CORRUPTED_PATCH", 2716dd88ab32SMasahiro Yamada "patch seems to be corrupt (line wrapped?)\n" . 2717dd88ab32SMasahiro Yamada $herecurr) if (!$emitted_corrupt++); 2718dd88ab32SMasahiro Yamada } 2719dd88ab32SMasahiro Yamada 2720dd88ab32SMasahiro Yamada# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php 2721dd88ab32SMasahiro Yamada if (($realfile =~ /^$/ || $line =~ /^\+/) && 2722dd88ab32SMasahiro Yamada $rawline !~ m/^$UTF8*$/) { 2723dd88ab32SMasahiro Yamada my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/); 2724dd88ab32SMasahiro Yamada 2725dd88ab32SMasahiro Yamada my $blank = copy_spacing($rawline); 2726dd88ab32SMasahiro Yamada my $ptr = substr($blank, 0, length($utf8_prefix)) . "^"; 2727dd88ab32SMasahiro Yamada my $hereptr = "$hereline$ptr\n"; 2728dd88ab32SMasahiro Yamada 2729dd88ab32SMasahiro Yamada CHK("INVALID_UTF8", 2730dd88ab32SMasahiro Yamada "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr); 2731dd88ab32SMasahiro Yamada } 2732dd88ab32SMasahiro Yamada 2733dd88ab32SMasahiro Yamada# Check if it's the start of a commit log 2734dd88ab32SMasahiro Yamada# (not a header line and we haven't seen the patch filename) 2735dd88ab32SMasahiro Yamada if ($in_header_lines && $realfile =~ /^$/ && 27366305db96SHeinrich Schuchardt !($rawline =~ /^\s+(?:\S|$)/ || 27376305db96SHeinrich Schuchardt $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) { 2738dd88ab32SMasahiro Yamada $in_header_lines = 0; 2739dd88ab32SMasahiro Yamada $in_commit_log = 1; 27406305db96SHeinrich Schuchardt $has_commit_log = 1; 2741dd88ab32SMasahiro Yamada } 2742dd88ab32SMasahiro Yamada 2743dd88ab32SMasahiro Yamada# Check if there is UTF-8 in a commit log when a mail header has explicitly 2744dd88ab32SMasahiro Yamada# declined it, i.e defined some charset where it is missing. 2745dd88ab32SMasahiro Yamada if ($in_header_lines && 2746dd88ab32SMasahiro Yamada $rawline =~ /^Content-Type:.+charset="(.+)".*$/ && 2747dd88ab32SMasahiro Yamada $1 !~ /utf-8/i) { 2748dd88ab32SMasahiro Yamada $non_utf8_charset = 1; 2749dd88ab32SMasahiro Yamada } 2750dd88ab32SMasahiro Yamada 2751dd88ab32SMasahiro Yamada if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ && 2752dd88ab32SMasahiro Yamada $rawline =~ /$NON_ASCII_UTF8/) { 2753dd88ab32SMasahiro Yamada WARN("UTF8_BEFORE_PATCH", 2754dd88ab32SMasahiro Yamada "8-bit UTF-8 used in possible commit log\n" . $herecurr); 2755dd88ab32SMasahiro Yamada } 2756dd88ab32SMasahiro Yamada 27576305db96SHeinrich Schuchardt# Check for absolute kernel paths in commit message 27586305db96SHeinrich Schuchardt if ($tree && $in_commit_log) { 27596305db96SHeinrich Schuchardt while ($line =~ m{(?:^|\s)(/\S*)}g) { 27606305db96SHeinrich Schuchardt my $file = $1; 27616305db96SHeinrich Schuchardt 27626305db96SHeinrich Schuchardt if ($file =~ m{^(.*?)(?::\d+)+:?$} && 27636305db96SHeinrich Schuchardt check_absolute_file($1, $herecurr)) { 27646305db96SHeinrich Schuchardt # 27656305db96SHeinrich Schuchardt } else { 27666305db96SHeinrich Schuchardt check_absolute_file($file, $herecurr); 27676305db96SHeinrich Schuchardt } 27686305db96SHeinrich Schuchardt } 27696305db96SHeinrich Schuchardt } 27706305db96SHeinrich Schuchardt 2771c10e0f5bSDan Murphy# Check for various typo / spelling mistakes 2772c10e0f5bSDan Murphy if (defined($misspellings) && 2773c10e0f5bSDan Murphy ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) { 2774c10e0f5bSDan Murphy while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) { 2775c10e0f5bSDan Murphy my $typo = $1; 2776c10e0f5bSDan Murphy my $typo_fix = $spelling_fix{lc($typo)}; 2777c10e0f5bSDan Murphy $typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/); 2778c10e0f5bSDan Murphy $typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/); 2779*c398f2dfSHeinrich Schuchardt my $msg_level = \&WARN; 2780*c398f2dfSHeinrich Schuchardt $msg_level = \&CHK if ($file); 2781*c398f2dfSHeinrich Schuchardt if (&{$msg_level}("TYPO_SPELLING", 2782c10e0f5bSDan Murphy "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) && 2783c10e0f5bSDan Murphy $fix) { 2784c10e0f5bSDan Murphy $fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/; 2785c10e0f5bSDan Murphy } 2786c10e0f5bSDan Murphy } 2787c10e0f5bSDan Murphy } 2788c10e0f5bSDan Murphy 2789dd88ab32SMasahiro Yamada# ignore non-hunk lines and lines being removed 2790dd88ab32SMasahiro Yamada next if (!$hunk_line || $line =~ /^-/); 2791dd88ab32SMasahiro Yamada 2792dd88ab32SMasahiro Yamada#trailing whitespace 2793dd88ab32SMasahiro Yamada if ($line =~ /^\+.*\015/) { 2794dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 27956b9709d9STom Rini if (ERROR("DOS_LINE_ENDINGS", 27966b9709d9STom Rini "DOS line endings\n" . $herevet) && 27976b9709d9STom Rini $fix) { 27986305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/[\s\015]+$//; 27996b9709d9STom Rini } 2800dd88ab32SMasahiro Yamada } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) { 2801dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 28026b9709d9STom Rini if (ERROR("TRAILING_WHITESPACE", 28036b9709d9STom Rini "trailing whitespace\n" . $herevet) && 28046b9709d9STom Rini $fix) { 28056305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\s+$//; 28066b9709d9STom Rini } 28076b9709d9STom Rini 2808dd88ab32SMasahiro Yamada $rpt_cleaners = 1; 2809dd88ab32SMasahiro Yamada } 2810dd88ab32SMasahiro Yamada 28116b9709d9STom Rini# Check for FSF mailing addresses. 28126b9709d9STom Rini if ($rawline =~ /\bwrite to the Free/i || 28136305db96SHeinrich Schuchardt $rawline =~ /\b675\s+Mass\s+Ave/i || 28146b9709d9STom Rini $rawline =~ /\b59\s+Temple\s+Pl/i || 28156b9709d9STom Rini $rawline =~ /\b51\s+Franklin\s+St/i) { 28166b9709d9STom Rini my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 2817*c398f2dfSHeinrich Schuchardt my $msg_level = \&ERROR; 2818*c398f2dfSHeinrich Schuchardt $msg_level = \&CHK if ($file); 2819*c398f2dfSHeinrich Schuchardt &{$msg_level}("FSF_MAILING_ADDRESS", 28206b9709d9STom Rini "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) 28216b9709d9STom Rini } 28226b9709d9STom Rini 2823dd88ab32SMasahiro Yamada# check for Kconfig help text having a real description 2824dd88ab32SMasahiro Yamada# Only applies when adding the entry originally, after that we do not have 2825dd88ab32SMasahiro Yamada# sufficient context to determine whether it is indeed long enough. 2826dd88ab32SMasahiro Yamada if ($realfile =~ /Kconfig/ && 2827*c398f2dfSHeinrich Schuchardt # 'choice' is usually the last thing on the line (though 2828*c398f2dfSHeinrich Schuchardt # Kconfig supports named choices), so use a word boundary 2829*c398f2dfSHeinrich Schuchardt # (\b) rather than a whitespace character (\s) 2830*c398f2dfSHeinrich Schuchardt $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) { 2831dd88ab32SMasahiro Yamada my $length = 0; 2832dd88ab32SMasahiro Yamada my $cnt = $realcnt; 2833dd88ab32SMasahiro Yamada my $ln = $linenr + 1; 2834dd88ab32SMasahiro Yamada my $f; 2835dd88ab32SMasahiro Yamada my $is_start = 0; 2836dd88ab32SMasahiro Yamada my $is_end = 0; 2837dd88ab32SMasahiro Yamada for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) { 2838dd88ab32SMasahiro Yamada $f = $lines[$ln - 1]; 2839dd88ab32SMasahiro Yamada $cnt-- if ($lines[$ln - 1] !~ /^-/); 2840dd88ab32SMasahiro Yamada $is_end = $lines[$ln - 1] =~ /^\+/; 2841dd88ab32SMasahiro Yamada 2842dd88ab32SMasahiro Yamada next if ($f =~ /^-/); 28436305db96SHeinrich Schuchardt last if (!$file && $f =~ /^\@\@/); 2844dd88ab32SMasahiro Yamada 2845*c398f2dfSHeinrich Schuchardt if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) { 2846dd88ab32SMasahiro Yamada $is_start = 1; 2847*c398f2dfSHeinrich Schuchardt } elsif ($lines[$ln - 1] =~ /^\+\s*(?:help|---help---)\s*$/) { 2848*c398f2dfSHeinrich Schuchardt if ($lines[$ln - 1] =~ "---help---") { 2849*c398f2dfSHeinrich Schuchardt WARN("CONFIG_DESCRIPTION", 2850*c398f2dfSHeinrich Schuchardt "prefer 'help' over '---help---' for new help texts\n" . $herecurr); 2851*c398f2dfSHeinrich Schuchardt } 2852dd88ab32SMasahiro Yamada $length = -1; 2853dd88ab32SMasahiro Yamada } 2854dd88ab32SMasahiro Yamada 2855dd88ab32SMasahiro Yamada $f =~ s/^.//; 2856dd88ab32SMasahiro Yamada $f =~ s/#.*//; 2857dd88ab32SMasahiro Yamada $f =~ s/^\s+//; 2858dd88ab32SMasahiro Yamada next if ($f =~ /^$/); 2859*c398f2dfSHeinrich Schuchardt 2860*c398f2dfSHeinrich Schuchardt # This only checks context lines in the patch 2861*c398f2dfSHeinrich Schuchardt # and so hopefully shouldn't trigger false 2862*c398f2dfSHeinrich Schuchardt # positives, even though some of these are 2863*c398f2dfSHeinrich Schuchardt # common words in help texts 2864*c398f2dfSHeinrich Schuchardt if ($f =~ /^\s*(?:config|menuconfig|choice|endchoice| 2865*c398f2dfSHeinrich Schuchardt if|endif|menu|endmenu|source)\b/x) { 2866dd88ab32SMasahiro Yamada $is_end = 1; 2867dd88ab32SMasahiro Yamada last; 2868dd88ab32SMasahiro Yamada } 2869dd88ab32SMasahiro Yamada $length++; 2870dd88ab32SMasahiro Yamada } 28716305db96SHeinrich Schuchardt if ($is_start && $is_end && $length < $min_conf_desc_length) { 2872dd88ab32SMasahiro Yamada WARN("CONFIG_DESCRIPTION", 28736305db96SHeinrich Schuchardt "please write a paragraph that describes the config symbol fully\n" . $herecurr); 28746305db96SHeinrich Schuchardt } 2875dd88ab32SMasahiro Yamada #print "is_start<$is_start> is_end<$is_end> length<$length>\n"; 2876dd88ab32SMasahiro Yamada } 2877dd88ab32SMasahiro Yamada 28786305db96SHeinrich Schuchardt# check for MAINTAINERS entries that don't have the right form 28796305db96SHeinrich Schuchardt if ($realfile =~ /^MAINTAINERS$/ && 28806305db96SHeinrich Schuchardt $rawline =~ /^\+[A-Z]:/ && 28816305db96SHeinrich Schuchardt $rawline !~ /^\+[A-Z]:\t\S/) { 28826305db96SHeinrich Schuchardt if (WARN("MAINTAINERS_STYLE", 28836305db96SHeinrich Schuchardt "MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) && 28846305db96SHeinrich Schuchardt $fix) { 28856305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/; 28866305db96SHeinrich Schuchardt } 28876305db96SHeinrich Schuchardt } 28886305db96SHeinrich Schuchardt 28896305db96SHeinrich Schuchardt# discourage the use of boolean for type definition attributes of Kconfig options 2890dd88ab32SMasahiro Yamada if ($realfile =~ /Kconfig/ && 28916305db96SHeinrich Schuchardt $line =~ /^\+\s*\bboolean\b/) { 28926305db96SHeinrich Schuchardt WARN("CONFIG_TYPE_BOOLEAN", 28936305db96SHeinrich Schuchardt "Use of boolean is deprecated, please use bool instead.\n" . $herecurr); 2894dd88ab32SMasahiro Yamada } 2895dd88ab32SMasahiro Yamada 2896dd88ab32SMasahiro Yamada if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) && 2897dd88ab32SMasahiro Yamada ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) { 2898dd88ab32SMasahiro Yamada my $flag = $1; 2899dd88ab32SMasahiro Yamada my $replacement = { 2900dd88ab32SMasahiro Yamada 'EXTRA_AFLAGS' => 'asflags-y', 2901dd88ab32SMasahiro Yamada 'EXTRA_CFLAGS' => 'ccflags-y', 2902dd88ab32SMasahiro Yamada 'EXTRA_CPPFLAGS' => 'cppflags-y', 2903dd88ab32SMasahiro Yamada 'EXTRA_LDFLAGS' => 'ldflags-y', 2904dd88ab32SMasahiro Yamada }; 2905dd88ab32SMasahiro Yamada 2906dd88ab32SMasahiro Yamada WARN("DEPRECATED_VARIABLE", 2907dd88ab32SMasahiro Yamada "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag}); 2908dd88ab32SMasahiro Yamada } 2909dd88ab32SMasahiro Yamada 29106b9709d9STom Rini# check for DT compatible documentation 29116305db96SHeinrich Schuchardt if (defined $root && 29126305db96SHeinrich Schuchardt (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) || 29136305db96SHeinrich Schuchardt ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) { 29146305db96SHeinrich Schuchardt 29156b9709d9STom Rini my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g; 29166b9709d9STom Rini 29176305db96SHeinrich Schuchardt my $dt_path = $root . "/Documentation/devicetree/bindings/"; 29186305db96SHeinrich Schuchardt my $vp_file = $dt_path . "vendor-prefixes.txt"; 29196305db96SHeinrich Schuchardt 29206b9709d9STom Rini foreach my $compat (@compats) { 29216b9709d9STom Rini my $compat2 = $compat; 29226305db96SHeinrich Schuchardt $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/; 29236305db96SHeinrich Schuchardt my $compat3 = $compat; 29246305db96SHeinrich Schuchardt $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/; 29256305db96SHeinrich Schuchardt `grep -Erq "$compat|$compat2|$compat3" $dt_path`; 29266b9709d9STom Rini if ( $? >> 8 ) { 29276b9709d9STom Rini WARN("UNDOCUMENTED_DT_STRING", 29286b9709d9STom Rini "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr); 29296b9709d9STom Rini } 29306b9709d9STom Rini 29316305db96SHeinrich Schuchardt next if $compat !~ /^([a-zA-Z0-9\-]+)\,/; 29326305db96SHeinrich Schuchardt my $vendor = $1; 29336305db96SHeinrich Schuchardt `grep -Eq "^$vendor\\b" $vp_file`; 29346b9709d9STom Rini if ( $? >> 8 ) { 29356b9709d9STom Rini WARN("UNDOCUMENTED_DT_STRING", 29366305db96SHeinrich Schuchardt "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr); 29376b9709d9STom Rini } 29386b9709d9STom Rini } 29396b9709d9STom Rini } 29406b9709d9STom Rini 2941*c398f2dfSHeinrich Schuchardt# check for using SPDX license tag at beginning of files 2942*c398f2dfSHeinrich Schuchardt if ($realline == $checklicenseline) { 2943*c398f2dfSHeinrich Schuchardt if ($rawline =~ /^[ \+]\s*\#\!\s*\//) { 2944*c398f2dfSHeinrich Schuchardt $checklicenseline = 2; 2945*c398f2dfSHeinrich Schuchardt } elsif ($rawline =~ /^\+/) { 2946*c398f2dfSHeinrich Schuchardt my $comment = ""; 2947*c398f2dfSHeinrich Schuchardt if ($realfile =~ /\.(h|s|S)$/) { 2948*c398f2dfSHeinrich Schuchardt $comment = '/*'; 2949*c398f2dfSHeinrich Schuchardt } elsif ($realfile =~ /\.(c|dts|dtsi)$/) { 2950*c398f2dfSHeinrich Schuchardt $comment = '//'; 2951*c398f2dfSHeinrich Schuchardt } elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc)$/) { 2952*c398f2dfSHeinrich Schuchardt $comment = '#'; 2953*c398f2dfSHeinrich Schuchardt } elsif ($realfile =~ /\.rst$/) { 2954*c398f2dfSHeinrich Schuchardt $comment = '..'; 2955*c398f2dfSHeinrich Schuchardt } 2956*c398f2dfSHeinrich Schuchardt 2957*c398f2dfSHeinrich Schuchardt if ($comment !~ /^$/ && 2958*c398f2dfSHeinrich Schuchardt $rawline !~ /^\+\Q$comment\E SPDX-License-Identifier: /) { 2959*c398f2dfSHeinrich Schuchardt WARN("SPDX_LICENSE_TAG", 2960*c398f2dfSHeinrich Schuchardt "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr); 2961*c398f2dfSHeinrich Schuchardt } 2962*c398f2dfSHeinrich Schuchardt } 2963*c398f2dfSHeinrich Schuchardt } 2964*c398f2dfSHeinrich Schuchardt 2965dd88ab32SMasahiro Yamada# check we are in a valid source file if not then ignore this hunk 29666305db96SHeinrich Schuchardt next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/); 2967dd88ab32SMasahiro Yamada 29686305db96SHeinrich Schuchardt# line length limit (with some exclusions) 29696305db96SHeinrich Schuchardt# 29706305db96SHeinrich Schuchardt# There are a few types of lines that may extend beyond $max_line_length: 29716305db96SHeinrich Schuchardt# logging functions like pr_info that end in a string 29726305db96SHeinrich Schuchardt# lines with a single string 29736305db96SHeinrich Schuchardt# #defines that are a single string 2974*c398f2dfSHeinrich Schuchardt# lines with an RFC3986 like URL 29756305db96SHeinrich Schuchardt# 29766305db96SHeinrich Schuchardt# There are 3 different line length message types: 2977*c398f2dfSHeinrich Schuchardt# LONG_LINE_COMMENT a comment starts before but extends beyond $max_line_length 29786305db96SHeinrich Schuchardt# LONG_LINE_STRING a string starts before but extends beyond $max_line_length 29796305db96SHeinrich Schuchardt# LONG_LINE all other lines longer than $max_line_length 29806305db96SHeinrich Schuchardt# 29816305db96SHeinrich Schuchardt# if LONG_LINE is ignored, the other 2 types are also ignored 29826305db96SHeinrich Schuchardt# 29836305db96SHeinrich Schuchardt 29846305db96SHeinrich Schuchardt if ($line =~ /^\+/ && $length > $max_line_length) { 29856305db96SHeinrich Schuchardt my $msg_type = "LONG_LINE"; 29866305db96SHeinrich Schuchardt 29876305db96SHeinrich Schuchardt # Check the allowed long line types first 29886305db96SHeinrich Schuchardt 29896305db96SHeinrich Schuchardt # logging functions that end in a string that starts 29906305db96SHeinrich Schuchardt # before $max_line_length 29916305db96SHeinrich Schuchardt if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ && 29926305db96SHeinrich Schuchardt length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) { 29936305db96SHeinrich Schuchardt $msg_type = ""; 29946305db96SHeinrich Schuchardt 29956305db96SHeinrich Schuchardt # lines with only strings (w/ possible termination) 29966305db96SHeinrich Schuchardt # #defines with only strings 29976305db96SHeinrich Schuchardt } elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ || 29986305db96SHeinrich Schuchardt $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) { 29996305db96SHeinrich Schuchardt $msg_type = ""; 30006305db96SHeinrich Schuchardt 3001*c398f2dfSHeinrich Schuchardt # More special cases 3002*c398f2dfSHeinrich Schuchardt } elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ || 3003*c398f2dfSHeinrich Schuchardt $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) { 3004*c398f2dfSHeinrich Schuchardt $msg_type = ""; 3005*c398f2dfSHeinrich Schuchardt 3006*c398f2dfSHeinrich Schuchardt # URL ($rawline is used in case the URL is in a comment) 3007*c398f2dfSHeinrich Schuchardt } elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) { 30086305db96SHeinrich Schuchardt $msg_type = ""; 30096305db96SHeinrich Schuchardt 30106305db96SHeinrich Schuchardt # Otherwise set the alternate message types 30116305db96SHeinrich Schuchardt 30126305db96SHeinrich Schuchardt # a comment starts before $max_line_length 30136305db96SHeinrich Schuchardt } elsif ($line =~ /($;[\s$;]*)$/ && 30146305db96SHeinrich Schuchardt length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) { 30156305db96SHeinrich Schuchardt $msg_type = "LONG_LINE_COMMENT" 30166305db96SHeinrich Schuchardt 30176305db96SHeinrich Schuchardt # a quoted string starts before $max_line_length 30186305db96SHeinrich Schuchardt } elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ && 30196305db96SHeinrich Schuchardt length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) { 30206305db96SHeinrich Schuchardt $msg_type = "LONG_LINE_STRING" 30216305db96SHeinrich Schuchardt } 30226305db96SHeinrich Schuchardt 30236305db96SHeinrich Schuchardt if ($msg_type ne "" && 30246305db96SHeinrich Schuchardt (show_type("LONG_LINE") || show_type($msg_type))) { 30256305db96SHeinrich Schuchardt WARN($msg_type, 3026dd88ab32SMasahiro Yamada "line over $max_line_length characters\n" . $herecurr); 3027dd88ab32SMasahiro Yamada } 3028dd88ab32SMasahiro Yamada } 3029dd88ab32SMasahiro Yamada 3030dd88ab32SMasahiro Yamada# check for adding lines without a newline. 3031dd88ab32SMasahiro Yamada if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) { 3032dd88ab32SMasahiro Yamada WARN("MISSING_EOF_NEWLINE", 3033dd88ab32SMasahiro Yamada "adding a line without newline at end of file\n" . $herecurr); 3034dd88ab32SMasahiro Yamada } 3035dd88ab32SMasahiro Yamada 3036dd88ab32SMasahiro Yamada# check we are in a valid source file C or perl if not then ignore this hunk 30376305db96SHeinrich Schuchardt next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/); 3038dd88ab32SMasahiro Yamada 3039dd88ab32SMasahiro Yamada# at the beginning of a line any tabs must come first and anything 3040dd88ab32SMasahiro Yamada# more than 8 must use tabs. 3041dd88ab32SMasahiro Yamada if ($rawline =~ /^\+\s* \t\s*\S/ || 3042dd88ab32SMasahiro Yamada $rawline =~ /^\+\s* \s*/) { 3043dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 3044dd88ab32SMasahiro Yamada $rpt_cleaners = 1; 30456b9709d9STom Rini if (ERROR("CODE_INDENT", 30466b9709d9STom Rini "code indent should use tabs where possible\n" . $herevet) && 30476b9709d9STom Rini $fix) { 30486305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e; 30496b9709d9STom Rini } 3050dd88ab32SMasahiro Yamada } 3051dd88ab32SMasahiro Yamada 3052dd88ab32SMasahiro Yamada# check for space before tabs. 3053dd88ab32SMasahiro Yamada if ($rawline =~ /^\+/ && $rawline =~ / \t/) { 3054dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 30556b9709d9STom Rini if (WARN("SPACE_BEFORE_TAB", 30566b9709d9STom Rini "please, no space before tabs\n" . $herevet) && 30576b9709d9STom Rini $fix) { 30586305db96SHeinrich Schuchardt while ($fixed[$fixlinenr] =~ 3059e3a4facdSJoe Perches s/(^\+.*) {8,8}\t/$1\t\t/) {} 30606305db96SHeinrich Schuchardt while ($fixed[$fixlinenr] =~ 30616b9709d9STom Rini s/(^\+.*) +\t/$1\t/) {} 30626b9709d9STom Rini } 3063dd88ab32SMasahiro Yamada } 3064dd88ab32SMasahiro Yamada 3065dd88ab32SMasahiro Yamada# check for && or || at the start of a line 3066dd88ab32SMasahiro Yamada if ($rawline =~ /^\+\s*(&&|\|\|)/) { 3067dd88ab32SMasahiro Yamada CHK("LOGICAL_CONTINUATIONS", 3068dd88ab32SMasahiro Yamada "Logical continuations should be on the previous line\n" . $hereprev); 3069dd88ab32SMasahiro Yamada } 3070dd88ab32SMasahiro Yamada 30716305db96SHeinrich Schuchardt# check indentation starts on a tab stop 30726305db96SHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 3073*c398f2dfSHeinrich Schuchardt $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) { 30746305db96SHeinrich Schuchardt my $indent = length($1); 30756305db96SHeinrich Schuchardt if ($indent % 8) { 30766305db96SHeinrich Schuchardt if (WARN("TABSTOP", 30776305db96SHeinrich Schuchardt "Statements should start on a tabstop\n" . $herecurr) && 30786305db96SHeinrich Schuchardt $fix) { 30796305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e; 30806305db96SHeinrich Schuchardt } 30816305db96SHeinrich Schuchardt } 30826305db96SHeinrich Schuchardt } 30836305db96SHeinrich Schuchardt 3084dd88ab32SMasahiro Yamada# check multi-line statement indentation matches previous line 3085dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 30866305db96SHeinrich Schuchardt $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) { 3087dd88ab32SMasahiro Yamada $prevline =~ /^\+(\t*)(.*)$/; 3088dd88ab32SMasahiro Yamada my $oldindent = $1; 3089dd88ab32SMasahiro Yamada my $rest = $2; 3090dd88ab32SMasahiro Yamada 3091dd88ab32SMasahiro Yamada my $pos = pos_last_openparen($rest); 3092dd88ab32SMasahiro Yamada if ($pos >= 0) { 3093dd88ab32SMasahiro Yamada $line =~ /^(\+| )([ \t]*)/; 3094dd88ab32SMasahiro Yamada my $newindent = $2; 3095dd88ab32SMasahiro Yamada 3096dd88ab32SMasahiro Yamada my $goodtabindent = $oldindent . 3097dd88ab32SMasahiro Yamada "\t" x ($pos / 8) . 3098dd88ab32SMasahiro Yamada " " x ($pos % 8); 3099dd88ab32SMasahiro Yamada my $goodspaceindent = $oldindent . " " x $pos; 3100dd88ab32SMasahiro Yamada 3101dd88ab32SMasahiro Yamada if ($newindent ne $goodtabindent && 3102dd88ab32SMasahiro Yamada $newindent ne $goodspaceindent) { 31036b9709d9STom Rini 31046b9709d9STom Rini if (CHK("PARENTHESIS_ALIGNMENT", 31056b9709d9STom Rini "Alignment should match open parenthesis\n" . $hereprev) && 31066b9709d9STom Rini $fix && $line =~ /^\+/) { 31076305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 31086b9709d9STom Rini s/^\+[ \t]*/\+$goodtabindent/; 31096b9709d9STom Rini } 3110dd88ab32SMasahiro Yamada } 3111dd88ab32SMasahiro Yamada } 3112dd88ab32SMasahiro Yamada } 3113dd88ab32SMasahiro Yamada 31146305db96SHeinrich Schuchardt# check for space after cast like "(int) foo" or "(struct foo) bar" 31156305db96SHeinrich Schuchardt# avoid checking a few false positives: 31166305db96SHeinrich Schuchardt# "sizeof(<type>)" or "__alignof__(<type>)" 31176305db96SHeinrich Schuchardt# function pointer declarations like "(*foo)(int) = bar;" 31186305db96SHeinrich Schuchardt# structure definitions like "(struct foo) { 0 };" 31196305db96SHeinrich Schuchardt# multiline macros that define functions 31206305db96SHeinrich Schuchardt# known attributes or the __attribute__ keyword 31216305db96SHeinrich Schuchardt if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ && 31226305db96SHeinrich Schuchardt (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) { 31236b9709d9STom Rini if (CHK("SPACING", 31246305db96SHeinrich Schuchardt "No space is necessary after a cast\n" . $herecurr) && 31256b9709d9STom Rini $fix) { 31266305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 31276305db96SHeinrich Schuchardt s/(\(\s*$Type\s*\))[ \t]+/$1/; 31286b9709d9STom Rini } 3129dd88ab32SMasahiro Yamada } 3130dd88ab32SMasahiro Yamada 31316305db96SHeinrich Schuchardt# Block comment styles 31326305db96SHeinrich Schuchardt# Networking with an initial /* 3133dd88ab32SMasahiro Yamada if ($realfile =~ m@^(drivers/net/|net/)@ && 31346b9709d9STom Rini $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ && 31356305db96SHeinrich Schuchardt $rawline =~ /^\+[ \t]*\*/ && 31366305db96SHeinrich Schuchardt $realline > 2) { 3137dd88ab32SMasahiro Yamada WARN("NETWORKING_BLOCK_COMMENT_STYLE", 3138dd88ab32SMasahiro Yamada "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev); 3139dd88ab32SMasahiro Yamada } 3140dd88ab32SMasahiro Yamada 31416305db96SHeinrich Schuchardt# Block comments use * on subsequent lines 31426305db96SHeinrich Schuchardt if ($prevline =~ /$;[ \t]*$/ && #ends in comment 31436305db96SHeinrich Schuchardt $prevrawline =~ /^\+.*?\/\*/ && #starting /* 31446b9709d9STom Rini $prevrawline !~ /\*\/[ \t]*$/ && #no trailing */ 31456b9709d9STom Rini $rawline =~ /^\+/ && #line is new 31466b9709d9STom Rini $rawline !~ /^\+[ \t]*\*/) { #no leading * 31476305db96SHeinrich Schuchardt WARN("BLOCK_COMMENT_STYLE", 31486305db96SHeinrich Schuchardt "Block comments use * on subsequent lines\n" . $hereprev); 31496b9709d9STom Rini } 31506b9709d9STom Rini 31516305db96SHeinrich Schuchardt# Block comments use */ on trailing lines 31526305db96SHeinrich Schuchardt if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */ 3153dd88ab32SMasahiro Yamada $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/ 3154dd88ab32SMasahiro Yamada $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/ 3155dd88ab32SMasahiro Yamada $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */ 31566305db96SHeinrich Schuchardt WARN("BLOCK_COMMENT_STYLE", 31576305db96SHeinrich Schuchardt "Block comments use a trailing */ on a separate line\n" . $herecurr); 31586305db96SHeinrich Schuchardt } 31596305db96SHeinrich Schuchardt 31606305db96SHeinrich Schuchardt# Block comment * alignment 31616305db96SHeinrich Schuchardt if ($prevline =~ /$;[ \t]*$/ && #ends in comment 31626305db96SHeinrich Schuchardt $line =~ /^\+[ \t]*$;/ && #leading comment 31636305db96SHeinrich Schuchardt $rawline =~ /^\+[ \t]*\*/ && #leading * 31646305db96SHeinrich Schuchardt (($prevrawline =~ /^\+.*?\/\*/ && #leading /* 31656305db96SHeinrich Schuchardt $prevrawline !~ /\*\/[ \t]*$/) || #no trailing */ 31666305db96SHeinrich Schuchardt $prevrawline =~ /^\+[ \t]*\*/)) { #leading * 31676305db96SHeinrich Schuchardt my $oldindent; 31686305db96SHeinrich Schuchardt $prevrawline =~ m@^\+([ \t]*/?)\*@; 31696305db96SHeinrich Schuchardt if (defined($1)) { 31706305db96SHeinrich Schuchardt $oldindent = expand_tabs($1); 31716305db96SHeinrich Schuchardt } else { 31726305db96SHeinrich Schuchardt $prevrawline =~ m@^\+(.*/?)\*@; 31736305db96SHeinrich Schuchardt $oldindent = expand_tabs($1); 31746305db96SHeinrich Schuchardt } 31756305db96SHeinrich Schuchardt $rawline =~ m@^\+([ \t]*)\*@; 31766305db96SHeinrich Schuchardt my $newindent = $1; 31776305db96SHeinrich Schuchardt $newindent = expand_tabs($newindent); 31786305db96SHeinrich Schuchardt if (length($oldindent) ne length($newindent)) { 31796305db96SHeinrich Schuchardt WARN("BLOCK_COMMENT_STYLE", 31806305db96SHeinrich Schuchardt "Block comments should align the * on each line\n" . $hereprev); 31816305db96SHeinrich Schuchardt } 31826305db96SHeinrich Schuchardt } 31836305db96SHeinrich Schuchardt 31846305db96SHeinrich Schuchardt# check for missing blank lines after struct/union declarations 31856305db96SHeinrich Schuchardt# with exceptions for various attributes and macros 31866305db96SHeinrich Schuchardt if ($prevline =~ /^[\+ ]};?\s*$/ && 31876305db96SHeinrich Schuchardt $line =~ /^\+/ && 31886305db96SHeinrich Schuchardt !($line =~ /^\+\s*$/ || 31896305db96SHeinrich Schuchardt $line =~ /^\+\s*EXPORT_SYMBOL/ || 31906305db96SHeinrich Schuchardt $line =~ /^\+\s*MODULE_/i || 31916305db96SHeinrich Schuchardt $line =~ /^\+\s*\#\s*(?:end|elif|else)/ || 31926305db96SHeinrich Schuchardt $line =~ /^\+[a-z_]*init/ || 31936305db96SHeinrich Schuchardt $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ || 31946305db96SHeinrich Schuchardt $line =~ /^\+\s*DECLARE/ || 3195*c398f2dfSHeinrich Schuchardt $line =~ /^\+\s*builtin_[\w_]*driver/ || 31966305db96SHeinrich Schuchardt $line =~ /^\+\s*__setup/)) { 31976305db96SHeinrich Schuchardt if (CHK("LINE_SPACING", 31986305db96SHeinrich Schuchardt "Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) && 31996305db96SHeinrich Schuchardt $fix) { 32006305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, "\+"); 32016305db96SHeinrich Schuchardt } 32026305db96SHeinrich Schuchardt } 32036305db96SHeinrich Schuchardt 32046305db96SHeinrich Schuchardt# check for multiple consecutive blank lines 32056305db96SHeinrich Schuchardt if ($prevline =~ /^[\+ ]\s*$/ && 32066305db96SHeinrich Schuchardt $line =~ /^\+\s*$/ && 32076305db96SHeinrich Schuchardt $last_blank_line != ($linenr - 1)) { 32086305db96SHeinrich Schuchardt if (CHK("LINE_SPACING", 32096305db96SHeinrich Schuchardt "Please don't use multiple blank lines\n" . $hereprev) && 32106305db96SHeinrich Schuchardt $fix) { 32116305db96SHeinrich Schuchardt fix_delete_line($fixlinenr, $rawline); 32126305db96SHeinrich Schuchardt } 32136305db96SHeinrich Schuchardt 32146305db96SHeinrich Schuchardt $last_blank_line = $linenr; 32156305db96SHeinrich Schuchardt } 32166305db96SHeinrich Schuchardt 32176305db96SHeinrich Schuchardt# check for missing blank lines after declarations 32186305db96SHeinrich Schuchardt if ($sline =~ /^\+\s+\S/ && #Not at char 1 32196305db96SHeinrich Schuchardt # actual declarations 32206305db96SHeinrich Schuchardt ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ || 32216305db96SHeinrich Schuchardt # function pointer declarations 32226305db96SHeinrich Schuchardt $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ || 32236305db96SHeinrich Schuchardt # foo bar; where foo is some local typedef or #define 32246305db96SHeinrich Schuchardt $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ || 32256305db96SHeinrich Schuchardt # known declaration macros 32266305db96SHeinrich Schuchardt $prevline =~ /^\+\s+$declaration_macros/) && 32276305db96SHeinrich Schuchardt # for "else if" which can look like "$Ident $Ident" 32286305db96SHeinrich Schuchardt !($prevline =~ /^\+\s+$c90_Keywords\b/ || 32296305db96SHeinrich Schuchardt # other possible extensions of declaration lines 32306305db96SHeinrich Schuchardt $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ || 32316305db96SHeinrich Schuchardt # not starting a section or a macro "\" extended line 32326305db96SHeinrich Schuchardt $prevline =~ /(?:\{\s*|\\)$/) && 32336305db96SHeinrich Schuchardt # looks like a declaration 32346305db96SHeinrich Schuchardt !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ || 32356305db96SHeinrich Schuchardt # function pointer declarations 32366305db96SHeinrich Schuchardt $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ || 32376305db96SHeinrich Schuchardt # foo bar; where foo is some local typedef or #define 32386305db96SHeinrich Schuchardt $sline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ || 32396305db96SHeinrich Schuchardt # known declaration macros 32406305db96SHeinrich Schuchardt $sline =~ /^\+\s+$declaration_macros/ || 32416305db96SHeinrich Schuchardt # start of struct or union or enum 32426305db96SHeinrich Schuchardt $sline =~ /^\+\s+(?:union|struct|enum|typedef)\b/ || 32436305db96SHeinrich Schuchardt # start or end of block or continuation of declaration 32446305db96SHeinrich Schuchardt $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ || 32456305db96SHeinrich Schuchardt # bitfield continuation 32466305db96SHeinrich Schuchardt $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ || 32476305db96SHeinrich Schuchardt # other possible extensions of declaration lines 32486305db96SHeinrich Schuchardt $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) && 32496305db96SHeinrich Schuchardt # indentation of previous and current line are the same 32506305db96SHeinrich Schuchardt (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) { 32516305db96SHeinrich Schuchardt if (WARN("LINE_SPACING", 32526305db96SHeinrich Schuchardt "Missing a blank line after declarations\n" . $hereprev) && 32536305db96SHeinrich Schuchardt $fix) { 32546305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, "\+"); 32556305db96SHeinrich Schuchardt } 3256dd88ab32SMasahiro Yamada } 3257dd88ab32SMasahiro Yamada 3258dd88ab32SMasahiro Yamada# check for spaces at the beginning of a line. 3259dd88ab32SMasahiro Yamada# Exceptions: 3260dd88ab32SMasahiro Yamada# 1) within comments 3261dd88ab32SMasahiro Yamada# 2) indented preprocessor commands 3262dd88ab32SMasahiro Yamada# 3) hanging labels 32636b9709d9STom Rini if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) { 3264dd88ab32SMasahiro Yamada my $herevet = "$here\n" . cat_vet($rawline) . "\n"; 32656b9709d9STom Rini if (WARN("LEADING_SPACE", 32666b9709d9STom Rini "please, no spaces at the start of a line\n" . $herevet) && 32676b9709d9STom Rini $fix) { 32686305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e; 32696b9709d9STom Rini } 3270dd88ab32SMasahiro Yamada } 3271dd88ab32SMasahiro Yamada 3272dd88ab32SMasahiro Yamada# check we are in a valid C source file if not then ignore this hunk 3273dd88ab32SMasahiro Yamada next if ($realfile !~ /\.(h|c)$/); 3274dd88ab32SMasahiro Yamada 3275*c398f2dfSHeinrich Schuchardt# check for unusual line ending [ or ( 3276*c398f2dfSHeinrich Schuchardt if ($line =~ /^\+.*([\[\(])\s*$/) { 3277*c398f2dfSHeinrich Schuchardt CHK("OPEN_ENDED_LINE", 3278*c398f2dfSHeinrich Schuchardt "Lines should not end with a '$1'\n" . $herecurr); 3279*c398f2dfSHeinrich Schuchardt } 3280*c398f2dfSHeinrich Schuchardt 32816305db96SHeinrich Schuchardt# check if this appears to be the start function declaration, save the name 32826305db96SHeinrich Schuchardt if ($sline =~ /^\+\{\s*$/ && 32836305db96SHeinrich Schuchardt $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) { 32846305db96SHeinrich Schuchardt $context_function = $1; 32856305db96SHeinrich Schuchardt } 32866305db96SHeinrich Schuchardt 32876305db96SHeinrich Schuchardt# check if this appears to be the end of function declaration 32886305db96SHeinrich Schuchardt if ($sline =~ /^\+\}\s*$/) { 32896305db96SHeinrich Schuchardt undef $context_function; 32906305db96SHeinrich Schuchardt } 32916305db96SHeinrich Schuchardt 32926305db96SHeinrich Schuchardt# check indentation of any line with a bare else 32936305db96SHeinrich Schuchardt# (but not if it is a multiple line "if (foo) return bar; else return baz;") 32946305db96SHeinrich Schuchardt# if the previous line is a break or return and is indented 1 tab more... 32956305db96SHeinrich Schuchardt if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) { 32966305db96SHeinrich Schuchardt my $tabs = length($1) + 1; 32976305db96SHeinrich Schuchardt if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ || 32986305db96SHeinrich Schuchardt ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ && 32996305db96SHeinrich Schuchardt defined $lines[$linenr] && 33006305db96SHeinrich Schuchardt $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) { 33016305db96SHeinrich Schuchardt WARN("UNNECESSARY_ELSE", 33026305db96SHeinrich Schuchardt "else is not generally useful after a break or return\n" . $hereprev); 33036305db96SHeinrich Schuchardt } 33046305db96SHeinrich Schuchardt } 33056305db96SHeinrich Schuchardt 33066305db96SHeinrich Schuchardt# check indentation of a line with a break; 33076305db96SHeinrich Schuchardt# if the previous line is a goto or return and is indented the same # of tabs 33086305db96SHeinrich Schuchardt if ($sline =~ /^\+([\t]+)break\s*;\s*$/) { 33096305db96SHeinrich Schuchardt my $tabs = $1; 33106305db96SHeinrich Schuchardt if ($prevline =~ /^\+$tabs(?:goto|return)\b/) { 33116305db96SHeinrich Schuchardt WARN("UNNECESSARY_BREAK", 33126305db96SHeinrich Schuchardt "break is not useful after a goto or return\n" . $hereprev); 33136305db96SHeinrich Schuchardt } 3314dd88ab32SMasahiro Yamada } 3315dd88ab32SMasahiro Yamada 3316dd88ab32SMasahiro Yamada# check for RCS/CVS revision markers 3317dd88ab32SMasahiro Yamada if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) { 3318dd88ab32SMasahiro Yamada WARN("CVS_KEYWORD", 3319dd88ab32SMasahiro Yamada "CVS style keyword markers, these will _not_ be updated\n". $herecurr); 3320dd88ab32SMasahiro Yamada } 3321dd88ab32SMasahiro Yamada 3322dd88ab32SMasahiro Yamada# check for old HOTPLUG __dev<foo> section markings 3323dd88ab32SMasahiro Yamada if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) { 3324dd88ab32SMasahiro Yamada WARN("HOTPLUG_SECTION", 3325dd88ab32SMasahiro Yamada "Using $1 is unnecessary\n" . $herecurr); 3326dd88ab32SMasahiro Yamada } 3327dd88ab32SMasahiro Yamada 3328dd88ab32SMasahiro Yamada# Check for potential 'bare' types 3329dd88ab32SMasahiro Yamada my ($stat, $cond, $line_nr_next, $remain_next, $off_next, 3330dd88ab32SMasahiro Yamada $realline_next); 3331dd88ab32SMasahiro Yamada#print "LINE<$line>\n"; 33326305db96SHeinrich Schuchardt if ($linenr > $suppress_statement && 33336b9709d9STom Rini $realcnt && $sline =~ /.\s*\S/) { 3334dd88ab32SMasahiro Yamada ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 3335dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0); 3336dd88ab32SMasahiro Yamada $stat =~ s/\n./\n /g; 3337dd88ab32SMasahiro Yamada $cond =~ s/\n./\n /g; 3338dd88ab32SMasahiro Yamada 3339dd88ab32SMasahiro Yamada#print "linenr<$linenr> <$stat>\n"; 3340dd88ab32SMasahiro Yamada # If this statement has no statement boundaries within 3341dd88ab32SMasahiro Yamada # it there is no point in retrying a statement scan 3342dd88ab32SMasahiro Yamada # until we hit end of it. 3343dd88ab32SMasahiro Yamada my $frag = $stat; $frag =~ s/;+\s*$//; 3344dd88ab32SMasahiro Yamada if ($frag !~ /(?:{|;)/) { 3345dd88ab32SMasahiro Yamada#print "skip<$line_nr_next>\n"; 3346dd88ab32SMasahiro Yamada $suppress_statement = $line_nr_next; 3347dd88ab32SMasahiro Yamada } 3348dd88ab32SMasahiro Yamada 3349dd88ab32SMasahiro Yamada # Find the real next line. 3350dd88ab32SMasahiro Yamada $realline_next = $line_nr_next; 3351dd88ab32SMasahiro Yamada if (defined $realline_next && 3352dd88ab32SMasahiro Yamada (!defined $lines[$realline_next - 1] || 3353dd88ab32SMasahiro Yamada substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) { 3354dd88ab32SMasahiro Yamada $realline_next++; 3355dd88ab32SMasahiro Yamada } 3356dd88ab32SMasahiro Yamada 3357dd88ab32SMasahiro Yamada my $s = $stat; 3358dd88ab32SMasahiro Yamada $s =~ s/{.*$//s; 3359dd88ab32SMasahiro Yamada 3360dd88ab32SMasahiro Yamada # Ignore goto labels. 3361dd88ab32SMasahiro Yamada if ($s =~ /$Ident:\*$/s) { 3362dd88ab32SMasahiro Yamada 3363dd88ab32SMasahiro Yamada # Ignore functions being called 3364dd88ab32SMasahiro Yamada } elsif ($s =~ /^.\s*$Ident\s*\(/s) { 3365dd88ab32SMasahiro Yamada 3366dd88ab32SMasahiro Yamada } elsif ($s =~ /^.\s*else\b/s) { 3367dd88ab32SMasahiro Yamada 3368dd88ab32SMasahiro Yamada # declarations always start with types 3369dd88ab32SMasahiro Yamada } 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) { 3370dd88ab32SMasahiro Yamada my $type = $1; 3371dd88ab32SMasahiro Yamada $type =~ s/\s+/ /g; 3372dd88ab32SMasahiro Yamada possible($type, "A:" . $s); 3373dd88ab32SMasahiro Yamada 3374dd88ab32SMasahiro Yamada # definitions in global scope can only start with types 3375dd88ab32SMasahiro Yamada } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) { 3376dd88ab32SMasahiro Yamada possible($1, "B:" . $s); 3377dd88ab32SMasahiro Yamada } 3378dd88ab32SMasahiro Yamada 3379dd88ab32SMasahiro Yamada # any (foo ... *) is a pointer cast, and foo is a type 3380dd88ab32SMasahiro Yamada while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) { 3381dd88ab32SMasahiro Yamada possible($1, "C:" . $s); 3382dd88ab32SMasahiro Yamada } 3383dd88ab32SMasahiro Yamada 3384dd88ab32SMasahiro Yamada # Check for any sort of function declaration. 3385dd88ab32SMasahiro Yamada # int foo(something bar, other baz); 3386dd88ab32SMasahiro Yamada # void (*store_gdt)(x86_descr_ptr *); 3387dd88ab32SMasahiro Yamada if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) { 3388dd88ab32SMasahiro Yamada my ($name_len) = length($1); 3389dd88ab32SMasahiro Yamada 3390dd88ab32SMasahiro Yamada my $ctx = $s; 3391dd88ab32SMasahiro Yamada substr($ctx, 0, $name_len + 1, ''); 3392dd88ab32SMasahiro Yamada $ctx =~ s/\)[^\)]*$//; 3393dd88ab32SMasahiro Yamada 3394dd88ab32SMasahiro Yamada for my $arg (split(/\s*,\s*/, $ctx)) { 3395dd88ab32SMasahiro Yamada if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) { 3396dd88ab32SMasahiro Yamada 3397dd88ab32SMasahiro Yamada possible($1, "D:" . $s); 3398dd88ab32SMasahiro Yamada } 3399dd88ab32SMasahiro Yamada } 3400dd88ab32SMasahiro Yamada } 3401dd88ab32SMasahiro Yamada 3402dd88ab32SMasahiro Yamada } 3403dd88ab32SMasahiro Yamada 3404dd88ab32SMasahiro Yamada# 3405dd88ab32SMasahiro Yamada# Checks which may be anchored in the context. 3406dd88ab32SMasahiro Yamada# 3407dd88ab32SMasahiro Yamada 3408dd88ab32SMasahiro Yamada# Check for switch () and associated case and default 3409dd88ab32SMasahiro Yamada# statements should be at the same indent. 3410dd88ab32SMasahiro Yamada if ($line=~/\bswitch\s*\(.*\)/) { 3411dd88ab32SMasahiro Yamada my $err = ''; 3412dd88ab32SMasahiro Yamada my $sep = ''; 3413dd88ab32SMasahiro Yamada my @ctx = ctx_block_outer($linenr, $realcnt); 3414dd88ab32SMasahiro Yamada shift(@ctx); 3415dd88ab32SMasahiro Yamada for my $ctx (@ctx) { 3416dd88ab32SMasahiro Yamada my ($clen, $cindent) = line_stats($ctx); 3417dd88ab32SMasahiro Yamada if ($ctx =~ /^\+\s*(case\s+|default:)/ && 3418dd88ab32SMasahiro Yamada $indent != $cindent) { 3419dd88ab32SMasahiro Yamada $err .= "$sep$ctx\n"; 3420dd88ab32SMasahiro Yamada $sep = ''; 3421dd88ab32SMasahiro Yamada } else { 3422dd88ab32SMasahiro Yamada $sep = "[...]\n"; 3423dd88ab32SMasahiro Yamada } 3424dd88ab32SMasahiro Yamada } 3425dd88ab32SMasahiro Yamada if ($err ne '') { 3426dd88ab32SMasahiro Yamada ERROR("SWITCH_CASE_INDENT_LEVEL", 3427dd88ab32SMasahiro Yamada "switch and case should be at the same indent\n$hereline$err"); 3428dd88ab32SMasahiro Yamada } 3429dd88ab32SMasahiro Yamada } 3430dd88ab32SMasahiro Yamada 3431dd88ab32SMasahiro Yamada# if/while/etc brace do not go on next line, unless defining a do while loop, 3432dd88ab32SMasahiro Yamada# or if that brace on the next line is for something else 34336305db96SHeinrich Schuchardt if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) { 3434dd88ab32SMasahiro Yamada my $pre_ctx = "$1$2"; 3435dd88ab32SMasahiro Yamada 3436dd88ab32SMasahiro Yamada my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0); 3437dd88ab32SMasahiro Yamada 3438dd88ab32SMasahiro Yamada if ($line =~ /^\+\t{6,}/) { 3439dd88ab32SMasahiro Yamada WARN("DEEP_INDENTATION", 3440dd88ab32SMasahiro Yamada "Too many leading tabs - consider code refactoring\n" . $herecurr); 3441dd88ab32SMasahiro Yamada } 3442dd88ab32SMasahiro Yamada 3443dd88ab32SMasahiro Yamada my $ctx_cnt = $realcnt - $#ctx - 1; 3444dd88ab32SMasahiro Yamada my $ctx = join("\n", @ctx); 3445dd88ab32SMasahiro Yamada 3446dd88ab32SMasahiro Yamada my $ctx_ln = $linenr; 3447dd88ab32SMasahiro Yamada my $ctx_skip = $realcnt; 3448dd88ab32SMasahiro Yamada 3449dd88ab32SMasahiro Yamada while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt && 3450dd88ab32SMasahiro Yamada defined $lines[$ctx_ln - 1] && 3451dd88ab32SMasahiro Yamada $lines[$ctx_ln - 1] =~ /^-/)) { 3452dd88ab32SMasahiro Yamada ##print "SKIP<$ctx_skip> CNT<$ctx_cnt>\n"; 3453dd88ab32SMasahiro Yamada $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/); 3454dd88ab32SMasahiro Yamada $ctx_ln++; 3455dd88ab32SMasahiro Yamada } 3456dd88ab32SMasahiro Yamada 3457dd88ab32SMasahiro Yamada #print "realcnt<$realcnt> ctx_cnt<$ctx_cnt>\n"; 3458dd88ab32SMasahiro Yamada #print "pre<$pre_ctx>\nline<$line>\nctx<$ctx>\nnext<$lines[$ctx_ln - 1]>\n"; 3459dd88ab32SMasahiro Yamada 3460dd88ab32SMasahiro Yamada if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) { 3461dd88ab32SMasahiro Yamada ERROR("OPEN_BRACE", 3462dd88ab32SMasahiro Yamada "that open brace { should be on the previous line\n" . 3463dd88ab32SMasahiro Yamada "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); 3464dd88ab32SMasahiro Yamada } 3465dd88ab32SMasahiro Yamada if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ && 3466dd88ab32SMasahiro Yamada $ctx =~ /\)\s*\;\s*$/ && 3467dd88ab32SMasahiro Yamada defined $lines[$ctx_ln - 1]) 3468dd88ab32SMasahiro Yamada { 3469dd88ab32SMasahiro Yamada my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]); 3470dd88ab32SMasahiro Yamada if ($nindent > $indent) { 3471dd88ab32SMasahiro Yamada WARN("TRAILING_SEMICOLON", 3472dd88ab32SMasahiro Yamada "trailing semicolon indicates no statements, indent implies otherwise\n" . 3473dd88ab32SMasahiro Yamada "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n"); 3474dd88ab32SMasahiro Yamada } 3475dd88ab32SMasahiro Yamada } 3476dd88ab32SMasahiro Yamada } 3477dd88ab32SMasahiro Yamada 3478dd88ab32SMasahiro Yamada# Check relative indent for conditionals and blocks. 34796305db96SHeinrich Schuchardt if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) { 3480dd88ab32SMasahiro Yamada ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 3481dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0) 3482dd88ab32SMasahiro Yamada if (!defined $stat); 3483dd88ab32SMasahiro Yamada my ($s, $c) = ($stat, $cond); 3484dd88ab32SMasahiro Yamada 3485dd88ab32SMasahiro Yamada substr($s, 0, length($c), ''); 3486dd88ab32SMasahiro Yamada 34876305db96SHeinrich Schuchardt # remove inline comments 34886305db96SHeinrich Schuchardt $s =~ s/$;/ /g; 34896305db96SHeinrich Schuchardt $c =~ s/$;/ /g; 3490dd88ab32SMasahiro Yamada 3491dd88ab32SMasahiro Yamada # Find out how long the conditional actually is. 3492dd88ab32SMasahiro Yamada my @newlines = ($c =~ /\n/gs); 3493dd88ab32SMasahiro Yamada my $cond_lines = 1 + $#newlines; 3494dd88ab32SMasahiro Yamada 34956305db96SHeinrich Schuchardt # Make sure we remove the line prefixes as we have 34966305db96SHeinrich Schuchardt # none on the first line, and are going to readd them 34976305db96SHeinrich Schuchardt # where necessary. 34986305db96SHeinrich Schuchardt $s =~ s/\n./\n/gs; 34996305db96SHeinrich Schuchardt while ($s =~ /\n\s+\\\n/) { 35006305db96SHeinrich Schuchardt $cond_lines += $s =~ s/\n\s+\\\n/\n/g; 35016305db96SHeinrich Schuchardt } 35026305db96SHeinrich Schuchardt 3503dd88ab32SMasahiro Yamada # We want to check the first line inside the block 3504dd88ab32SMasahiro Yamada # starting at the end of the conditional, so remove: 3505dd88ab32SMasahiro Yamada # 1) any blank line termination 3506dd88ab32SMasahiro Yamada # 2) any opening brace { on end of the line 3507dd88ab32SMasahiro Yamada # 3) any do (...) { 3508dd88ab32SMasahiro Yamada my $continuation = 0; 3509dd88ab32SMasahiro Yamada my $check = 0; 3510dd88ab32SMasahiro Yamada $s =~ s/^.*\bdo\b//; 3511dd88ab32SMasahiro Yamada $s =~ s/^\s*{//; 3512dd88ab32SMasahiro Yamada if ($s =~ s/^\s*\\//) { 3513dd88ab32SMasahiro Yamada $continuation = 1; 3514dd88ab32SMasahiro Yamada } 3515dd88ab32SMasahiro Yamada if ($s =~ s/^\s*?\n//) { 3516dd88ab32SMasahiro Yamada $check = 1; 3517dd88ab32SMasahiro Yamada $cond_lines++; 3518dd88ab32SMasahiro Yamada } 3519dd88ab32SMasahiro Yamada 3520dd88ab32SMasahiro Yamada # Also ignore a loop construct at the end of a 3521dd88ab32SMasahiro Yamada # preprocessor statement. 3522dd88ab32SMasahiro Yamada if (($prevline =~ /^.\s*#\s*define\s/ || 3523dd88ab32SMasahiro Yamada $prevline =~ /\\\s*$/) && $continuation == 0) { 3524dd88ab32SMasahiro Yamada $check = 0; 3525dd88ab32SMasahiro Yamada } 3526dd88ab32SMasahiro Yamada 3527dd88ab32SMasahiro Yamada my $cond_ptr = -1; 3528dd88ab32SMasahiro Yamada $continuation = 0; 3529dd88ab32SMasahiro Yamada while ($cond_ptr != $cond_lines) { 3530dd88ab32SMasahiro Yamada $cond_ptr = $cond_lines; 3531dd88ab32SMasahiro Yamada 3532dd88ab32SMasahiro Yamada # If we see an #else/#elif then the code 3533dd88ab32SMasahiro Yamada # is not linear. 3534dd88ab32SMasahiro Yamada if ($s =~ /^\s*\#\s*(?:else|elif)/) { 3535dd88ab32SMasahiro Yamada $check = 0; 3536dd88ab32SMasahiro Yamada } 3537dd88ab32SMasahiro Yamada 3538dd88ab32SMasahiro Yamada # Ignore: 3539dd88ab32SMasahiro Yamada # 1) blank lines, they should be at 0, 3540dd88ab32SMasahiro Yamada # 2) preprocessor lines, and 3541dd88ab32SMasahiro Yamada # 3) labels. 3542dd88ab32SMasahiro Yamada if ($continuation || 3543dd88ab32SMasahiro Yamada $s =~ /^\s*?\n/ || 3544dd88ab32SMasahiro Yamada $s =~ /^\s*#\s*?/ || 3545dd88ab32SMasahiro Yamada $s =~ /^\s*$Ident\s*:/) { 3546dd88ab32SMasahiro Yamada $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0; 3547dd88ab32SMasahiro Yamada if ($s =~ s/^.*?\n//) { 3548dd88ab32SMasahiro Yamada $cond_lines++; 3549dd88ab32SMasahiro Yamada } 3550dd88ab32SMasahiro Yamada } 3551dd88ab32SMasahiro Yamada } 3552dd88ab32SMasahiro Yamada 3553dd88ab32SMasahiro Yamada my (undef, $sindent) = line_stats("+" . $s); 3554dd88ab32SMasahiro Yamada my $stat_real = raw_line($linenr, $cond_lines); 3555dd88ab32SMasahiro Yamada 3556dd88ab32SMasahiro Yamada # Check if either of these lines are modified, else 3557dd88ab32SMasahiro Yamada # this is not this patch's fault. 3558dd88ab32SMasahiro Yamada if (!defined($stat_real) || 3559dd88ab32SMasahiro Yamada $stat !~ /^\+/ && $stat_real !~ /^\+/) { 3560dd88ab32SMasahiro Yamada $check = 0; 3561dd88ab32SMasahiro Yamada } 3562dd88ab32SMasahiro Yamada if (defined($stat_real) && $cond_lines > 1) { 3563dd88ab32SMasahiro Yamada $stat_real = "[...]\n$stat_real"; 3564dd88ab32SMasahiro Yamada } 3565dd88ab32SMasahiro Yamada 3566dd88ab32SMasahiro Yamada #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"; 3567dd88ab32SMasahiro Yamada 35686305db96SHeinrich Schuchardt if ($check && $s ne '' && 35696305db96SHeinrich Schuchardt (($sindent % 8) != 0 || 35706305db96SHeinrich Schuchardt ($sindent < $indent) || 35716305db96SHeinrich Schuchardt ($sindent == $indent && 35726305db96SHeinrich Schuchardt ($s !~ /^\s*(?:\}|\{|else\b)/)) || 35736305db96SHeinrich Schuchardt ($sindent > $indent + 8))) { 3574dd88ab32SMasahiro Yamada WARN("SUSPECT_CODE_INDENT", 3575dd88ab32SMasahiro Yamada "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n"); 3576dd88ab32SMasahiro Yamada } 3577dd88ab32SMasahiro Yamada } 3578dd88ab32SMasahiro Yamada 3579dd88ab32SMasahiro Yamada # Track the 'values' across context and added lines. 3580dd88ab32SMasahiro Yamada my $opline = $line; $opline =~ s/^./ /; 3581dd88ab32SMasahiro Yamada my ($curr_values, $curr_vars) = 3582dd88ab32SMasahiro Yamada annotate_values($opline . "\n", $prev_values); 3583dd88ab32SMasahiro Yamada $curr_values = $prev_values . $curr_values; 3584dd88ab32SMasahiro Yamada if ($dbg_values) { 3585dd88ab32SMasahiro Yamada my $outline = $opline; $outline =~ s/\t/ /g; 3586dd88ab32SMasahiro Yamada print "$linenr > .$outline\n"; 3587dd88ab32SMasahiro Yamada print "$linenr > $curr_values\n"; 3588dd88ab32SMasahiro Yamada print "$linenr > $curr_vars\n"; 3589dd88ab32SMasahiro Yamada } 3590dd88ab32SMasahiro Yamada $prev_values = substr($curr_values, -1); 3591dd88ab32SMasahiro Yamada 3592dd88ab32SMasahiro Yamada#ignore lines not being added 35936b9709d9STom Rini next if ($line =~ /^[^\+]/); 3594dd88ab32SMasahiro Yamada 35956305db96SHeinrich Schuchardt# check for dereferences that span multiple lines 35966305db96SHeinrich Schuchardt if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ && 35976305db96SHeinrich Schuchardt $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) { 35986305db96SHeinrich Schuchardt $prevline =~ /($Lval\s*(?:\.|->))\s*$/; 35996305db96SHeinrich Schuchardt my $ref = $1; 36006305db96SHeinrich Schuchardt $line =~ /^.\s*($Lval)/; 36016305db96SHeinrich Schuchardt $ref .= $1; 36026305db96SHeinrich Schuchardt $ref =~ s/\s//g; 36036305db96SHeinrich Schuchardt WARN("MULTILINE_DEREFERENCE", 36046305db96SHeinrich Schuchardt "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev); 36056305db96SHeinrich Schuchardt } 36066305db96SHeinrich Schuchardt 36076305db96SHeinrich Schuchardt# check for declarations of signed or unsigned without int 36086305db96SHeinrich Schuchardt while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) { 36096305db96SHeinrich Schuchardt my $type = $1; 36106305db96SHeinrich Schuchardt my $var = $2; 36116305db96SHeinrich Schuchardt $var = "" if (!defined $var); 36126305db96SHeinrich Schuchardt if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) { 36136305db96SHeinrich Schuchardt my $sign = $1; 36146305db96SHeinrich Schuchardt my $pointer = $2; 36156305db96SHeinrich Schuchardt 36166305db96SHeinrich Schuchardt $pointer = "" if (!defined $pointer); 36176305db96SHeinrich Schuchardt 36186305db96SHeinrich Schuchardt if (WARN("UNSPECIFIED_INT", 36196305db96SHeinrich Schuchardt "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) && 36206305db96SHeinrich Schuchardt $fix) { 36216305db96SHeinrich Schuchardt my $decl = trim($sign) . " int "; 36226305db96SHeinrich Schuchardt my $comp_pointer = $pointer; 36236305db96SHeinrich Schuchardt $comp_pointer =~ s/\s//g; 36246305db96SHeinrich Schuchardt $decl .= $comp_pointer; 36256305db96SHeinrich Schuchardt $decl = rtrim($decl) if ($var eq ""); 36266305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@; 36276305db96SHeinrich Schuchardt } 36286305db96SHeinrich Schuchardt } 36296305db96SHeinrich Schuchardt } 36306305db96SHeinrich Schuchardt 3631dd88ab32SMasahiro Yamada# TEST: allow direct testing of the type matcher. 3632dd88ab32SMasahiro Yamada if ($dbg_type) { 3633dd88ab32SMasahiro Yamada if ($line =~ /^.\s*$Declare\s*$/) { 3634dd88ab32SMasahiro Yamada ERROR("TEST_TYPE", 3635dd88ab32SMasahiro Yamada "TEST: is type\n" . $herecurr); 3636dd88ab32SMasahiro Yamada } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) { 3637dd88ab32SMasahiro Yamada ERROR("TEST_NOT_TYPE", 3638dd88ab32SMasahiro Yamada "TEST: is not type ($1 is)\n". $herecurr); 3639dd88ab32SMasahiro Yamada } 3640dd88ab32SMasahiro Yamada next; 3641dd88ab32SMasahiro Yamada } 3642dd88ab32SMasahiro Yamada# TEST: allow direct testing of the attribute matcher. 3643dd88ab32SMasahiro Yamada if ($dbg_attr) { 3644dd88ab32SMasahiro Yamada if ($line =~ /^.\s*$Modifier\s*$/) { 3645dd88ab32SMasahiro Yamada ERROR("TEST_ATTR", 3646dd88ab32SMasahiro Yamada "TEST: is attr\n" . $herecurr); 3647dd88ab32SMasahiro Yamada } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) { 3648dd88ab32SMasahiro Yamada ERROR("TEST_NOT_ATTR", 3649dd88ab32SMasahiro Yamada "TEST: is not attr ($1 is)\n". $herecurr); 3650dd88ab32SMasahiro Yamada } 3651dd88ab32SMasahiro Yamada next; 3652dd88ab32SMasahiro Yamada } 3653dd88ab32SMasahiro Yamada 3654dd88ab32SMasahiro Yamada# check for initialisation to aggregates open brace on the next line 3655dd88ab32SMasahiro Yamada if ($line =~ /^.\s*{/ && 3656dd88ab32SMasahiro Yamada $prevline =~ /(?:^|[^=])=\s*$/) { 36576305db96SHeinrich Schuchardt if (ERROR("OPEN_BRACE", 36586305db96SHeinrich Schuchardt "that open brace { should be on the previous line\n" . $hereprev) && 36596305db96SHeinrich Schuchardt $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { 36606305db96SHeinrich Schuchardt fix_delete_line($fixlinenr - 1, $prevrawline); 36616305db96SHeinrich Schuchardt fix_delete_line($fixlinenr, $rawline); 36626305db96SHeinrich Schuchardt my $fixedline = $prevrawline; 36636305db96SHeinrich Schuchardt $fixedline =~ s/\s*=\s*$/ = {/; 36646305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, $fixedline); 36656305db96SHeinrich Schuchardt $fixedline = $line; 36666305db96SHeinrich Schuchardt $fixedline =~ s/^(.\s*)\{\s*/$1/; 36676305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, $fixedline); 36686305db96SHeinrich Schuchardt } 3669dd88ab32SMasahiro Yamada } 3670dd88ab32SMasahiro Yamada 3671dd88ab32SMasahiro Yamada# 3672dd88ab32SMasahiro Yamada# Checks which are anchored on the added line. 3673dd88ab32SMasahiro Yamada# 3674dd88ab32SMasahiro Yamada 3675dd88ab32SMasahiro Yamada# check for malformed paths in #include statements (uses RAW line) 3676dd88ab32SMasahiro Yamada if ($rawline =~ m{^.\s*\#\s*include\s+[<"](.*)[">]}) { 3677dd88ab32SMasahiro Yamada my $path = $1; 3678dd88ab32SMasahiro Yamada if ($path =~ m{//}) { 3679dd88ab32SMasahiro Yamada ERROR("MALFORMED_INCLUDE", 3680dd88ab32SMasahiro Yamada "malformed #include filename\n" . $herecurr); 3681dd88ab32SMasahiro Yamada } 3682dd88ab32SMasahiro Yamada if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) { 3683dd88ab32SMasahiro Yamada ERROR("UAPI_INCLUDE", 3684dd88ab32SMasahiro Yamada "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr); 3685dd88ab32SMasahiro Yamada } 3686dd88ab32SMasahiro Yamada } 3687dd88ab32SMasahiro Yamada 3688dd88ab32SMasahiro Yamada# no C99 // comments 3689dd88ab32SMasahiro Yamada if ($line =~ m{//}) { 36906b9709d9STom Rini if (ERROR("C99_COMMENTS", 36916b9709d9STom Rini "do not use C99 // comments\n" . $herecurr) && 36926b9709d9STom Rini $fix) { 36936305db96SHeinrich Schuchardt my $line = $fixed[$fixlinenr]; 36946b9709d9STom Rini if ($line =~ /\/\/(.*)$/) { 36956b9709d9STom Rini my $comment = trim($1); 36966305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@; 36976b9709d9STom Rini } 36986b9709d9STom Rini } 3699dd88ab32SMasahiro Yamada } 3700dd88ab32SMasahiro Yamada # Remove C99 comments. 3701dd88ab32SMasahiro Yamada $line =~ s@//.*@@; 3702dd88ab32SMasahiro Yamada $opline =~ s@//.*@@; 3703dd88ab32SMasahiro Yamada 3704dd88ab32SMasahiro Yamada# EXPORT_SYMBOL should immediately follow the thing it is exporting, consider 3705dd88ab32SMasahiro Yamada# the whole statement. 3706dd88ab32SMasahiro Yamada#print "APW <$lines[$realline_next - 1]>\n"; 3707dd88ab32SMasahiro Yamada if (defined $realline_next && 3708dd88ab32SMasahiro Yamada exists $lines[$realline_next - 1] && 3709dd88ab32SMasahiro Yamada !defined $suppress_export{$realline_next} && 3710dd88ab32SMasahiro Yamada ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ || 3711dd88ab32SMasahiro Yamada $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { 3712dd88ab32SMasahiro Yamada # Handle definitions which produce identifiers with 3713dd88ab32SMasahiro Yamada # a prefix: 3714dd88ab32SMasahiro Yamada # XXX(foo); 3715dd88ab32SMasahiro Yamada # EXPORT_SYMBOL(something_foo); 3716dd88ab32SMasahiro Yamada my $name = $1; 3717dd88ab32SMasahiro Yamada if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ && 3718dd88ab32SMasahiro Yamada $name =~ /^${Ident}_$2/) { 3719dd88ab32SMasahiro Yamada#print "FOO C name<$name>\n"; 3720dd88ab32SMasahiro Yamada $suppress_export{$realline_next} = 1; 3721dd88ab32SMasahiro Yamada 3722dd88ab32SMasahiro Yamada } elsif ($stat !~ /(?: 3723dd88ab32SMasahiro Yamada \n.}\s*$| 3724dd88ab32SMasahiro Yamada ^.DEFINE_$Ident\(\Q$name\E\)| 3725dd88ab32SMasahiro Yamada ^.DECLARE_$Ident\(\Q$name\E\)| 3726dd88ab32SMasahiro Yamada ^.LIST_HEAD\(\Q$name\E\)| 3727dd88ab32SMasahiro Yamada ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(| 3728dd88ab32SMasahiro Yamada \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\() 3729dd88ab32SMasahiro Yamada )/x) { 3730dd88ab32SMasahiro Yamada#print "FOO A<$lines[$realline_next - 1]> stat<$stat> name<$name>\n"; 3731dd88ab32SMasahiro Yamada $suppress_export{$realline_next} = 2; 3732dd88ab32SMasahiro Yamada } else { 3733dd88ab32SMasahiro Yamada $suppress_export{$realline_next} = 1; 3734dd88ab32SMasahiro Yamada } 3735dd88ab32SMasahiro Yamada } 3736dd88ab32SMasahiro Yamada if (!defined $suppress_export{$linenr} && 3737dd88ab32SMasahiro Yamada $prevline =~ /^.\s*$/ && 3738dd88ab32SMasahiro Yamada ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ || 3739dd88ab32SMasahiro Yamada $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) { 3740dd88ab32SMasahiro Yamada#print "FOO B <$lines[$linenr - 1]>\n"; 3741dd88ab32SMasahiro Yamada $suppress_export{$linenr} = 2; 3742dd88ab32SMasahiro Yamada } 3743dd88ab32SMasahiro Yamada if (defined $suppress_export{$linenr} && 3744dd88ab32SMasahiro Yamada $suppress_export{$linenr} == 2) { 3745dd88ab32SMasahiro Yamada WARN("EXPORT_SYMBOL", 3746dd88ab32SMasahiro Yamada "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); 3747dd88ab32SMasahiro Yamada } 3748dd88ab32SMasahiro Yamada 3749dd88ab32SMasahiro Yamada# check for global initialisers. 37506305db96SHeinrich Schuchardt if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) { 37516b9709d9STom Rini if (ERROR("GLOBAL_INITIALISERS", 37526305db96SHeinrich Schuchardt "do not initialise globals to $1\n" . $herecurr) && 37536b9709d9STom Rini $fix) { 37546305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/; 37556b9709d9STom Rini } 3756dd88ab32SMasahiro Yamada } 3757dd88ab32SMasahiro Yamada# check for static initialisers. 37586305db96SHeinrich Schuchardt if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) { 37596b9709d9STom Rini if (ERROR("INITIALISED_STATIC", 37606305db96SHeinrich Schuchardt "do not initialise statics to $1\n" . 37616b9709d9STom Rini $herecurr) && 37626b9709d9STom Rini $fix) { 37636305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/; 37646b9709d9STom Rini } 3765dd88ab32SMasahiro Yamada } 3766dd88ab32SMasahiro Yamada 37676305db96SHeinrich Schuchardt# check for misordered declarations of char/short/int/long with signed/unsigned 37686305db96SHeinrich Schuchardt while ($sline =~ m{(\b$TypeMisordered\b)}g) { 37696305db96SHeinrich Schuchardt my $tmp = trim($1); 37706305db96SHeinrich Schuchardt WARN("MISORDERED_TYPE", 37716305db96SHeinrich Schuchardt "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr); 37726305db96SHeinrich Schuchardt } 37736305db96SHeinrich Schuchardt 3774dd88ab32SMasahiro Yamada# check for static const char * arrays. 3775dd88ab32SMasahiro Yamada if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) { 3776dd88ab32SMasahiro Yamada WARN("STATIC_CONST_CHAR_ARRAY", 3777dd88ab32SMasahiro Yamada "static const char * array should probably be static const char * const\n" . 3778dd88ab32SMasahiro Yamada $herecurr); 3779dd88ab32SMasahiro Yamada } 3780dd88ab32SMasahiro Yamada 3781dd88ab32SMasahiro Yamada# check for static char foo[] = "bar" declarations. 3782dd88ab32SMasahiro Yamada if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) { 3783dd88ab32SMasahiro Yamada WARN("STATIC_CONST_CHAR_ARRAY", 3784dd88ab32SMasahiro Yamada "static char array declaration should probably be static const char\n" . 3785dd88ab32SMasahiro Yamada $herecurr); 3786dd88ab32SMasahiro Yamada } 3787dd88ab32SMasahiro Yamada 37886305db96SHeinrich Schuchardt# check for const <foo> const where <foo> is not a pointer or array type 37896305db96SHeinrich Schuchardt if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) { 37906305db96SHeinrich Schuchardt my $found = $1; 37916305db96SHeinrich Schuchardt if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) { 37926305db96SHeinrich Schuchardt WARN("CONST_CONST", 37936305db96SHeinrich Schuchardt "'const $found const *' should probably be 'const $found * const'\n" . $herecurr); 37946305db96SHeinrich Schuchardt } elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) { 37956305db96SHeinrich Schuchardt WARN("CONST_CONST", 37966305db96SHeinrich Schuchardt "'const $found const' should probably be 'const $found'\n" . $herecurr); 37976305db96SHeinrich Schuchardt } 37986305db96SHeinrich Schuchardt } 37996305db96SHeinrich Schuchardt 38006305db96SHeinrich Schuchardt# check for non-global char *foo[] = {"bar", ...} declarations. 38016305db96SHeinrich Schuchardt if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) { 38026305db96SHeinrich Schuchardt WARN("STATIC_CONST_CHAR_ARRAY", 38036305db96SHeinrich Schuchardt "char * array declaration might be better as static const\n" . 38046305db96SHeinrich Schuchardt $herecurr); 38056305db96SHeinrich Schuchardt } 38066305db96SHeinrich Schuchardt 38076305db96SHeinrich Schuchardt# check for sizeof(foo)/sizeof(foo[0]) that could be ARRAY_SIZE(foo) 38086305db96SHeinrich Schuchardt if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) { 38096305db96SHeinrich Schuchardt my $array = $1; 38106305db96SHeinrich Schuchardt if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) { 38116305db96SHeinrich Schuchardt my $array_div = $1; 38126305db96SHeinrich Schuchardt if (WARN("ARRAY_SIZE", 38136305db96SHeinrich Schuchardt "Prefer ARRAY_SIZE($array)\n" . $herecurr) && 38146305db96SHeinrich Schuchardt $fix) { 38156305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/; 38166305db96SHeinrich Schuchardt } 38176305db96SHeinrich Schuchardt } 38186305db96SHeinrich Schuchardt } 38196305db96SHeinrich Schuchardt 38206b9709d9STom Rini# check for function declarations without arguments like "int foo()" 38216b9709d9STom Rini if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) { 38226b9709d9STom Rini if (ERROR("FUNCTION_WITHOUT_ARGS", 38236b9709d9STom Rini "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) && 38246b9709d9STom Rini $fix) { 38256305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/; 38266b9709d9STom Rini } 3827dd88ab32SMasahiro Yamada } 3828dd88ab32SMasahiro Yamada 3829dd88ab32SMasahiro Yamada# check for new typedefs, only function parameters and sparse annotations 3830dd88ab32SMasahiro Yamada# make sense. 3831dd88ab32SMasahiro Yamada if ($line =~ /\btypedef\s/ && 3832dd88ab32SMasahiro Yamada $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ && 3833dd88ab32SMasahiro Yamada $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ && 3834dd88ab32SMasahiro Yamada $line !~ /\b$typeTypedefs\b/ && 38356305db96SHeinrich Schuchardt $line !~ /\b__bitwise\b/) { 3836dd88ab32SMasahiro Yamada WARN("NEW_TYPEDEFS", 3837dd88ab32SMasahiro Yamada "do not add new typedefs\n" . $herecurr); 3838dd88ab32SMasahiro Yamada } 3839dd88ab32SMasahiro Yamada 3840dd88ab32SMasahiro Yamada# * goes on variable not on type 3841dd88ab32SMasahiro Yamada # (char*[ const]) 3842dd88ab32SMasahiro Yamada while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) { 3843dd88ab32SMasahiro Yamada #print "AA<$1>\n"; 38446b9709d9STom Rini my ($ident, $from, $to) = ($1, $2, $2); 3845dd88ab32SMasahiro Yamada 3846dd88ab32SMasahiro Yamada # Should start with a space. 3847dd88ab32SMasahiro Yamada $to =~ s/^(\S)/ $1/; 3848dd88ab32SMasahiro Yamada # Should not end with a space. 3849dd88ab32SMasahiro Yamada $to =~ s/\s+$//; 3850dd88ab32SMasahiro Yamada # '*'s should not have spaces between. 3851dd88ab32SMasahiro Yamada while ($to =~ s/\*\s+\*/\*\*/) { 3852dd88ab32SMasahiro Yamada } 3853dd88ab32SMasahiro Yamada 38546b9709d9STom Rini## print "1: from<$from> to<$to> ident<$ident>\n"; 3855dd88ab32SMasahiro Yamada if ($from ne $to) { 38566b9709d9STom Rini if (ERROR("POINTER_LOCATION", 38576b9709d9STom Rini "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) && 38586b9709d9STom Rini $fix) { 38596b9709d9STom Rini my $sub_from = $ident; 38606b9709d9STom Rini my $sub_to = $ident; 38616b9709d9STom Rini $sub_to =~ s/\Q$from\E/$to/; 38626305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 38636b9709d9STom Rini s@\Q$sub_from\E@$sub_to@; 38646b9709d9STom Rini } 3865dd88ab32SMasahiro Yamada } 3866dd88ab32SMasahiro Yamada } 3867dd88ab32SMasahiro Yamada while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) { 3868dd88ab32SMasahiro Yamada #print "BB<$1>\n"; 38696b9709d9STom Rini my ($match, $from, $to, $ident) = ($1, $2, $2, $3); 3870dd88ab32SMasahiro Yamada 3871dd88ab32SMasahiro Yamada # Should start with a space. 3872dd88ab32SMasahiro Yamada $to =~ s/^(\S)/ $1/; 3873dd88ab32SMasahiro Yamada # Should not end with a space. 3874dd88ab32SMasahiro Yamada $to =~ s/\s+$//; 3875dd88ab32SMasahiro Yamada # '*'s should not have spaces between. 3876dd88ab32SMasahiro Yamada while ($to =~ s/\*\s+\*/\*\*/) { 3877dd88ab32SMasahiro Yamada } 3878dd88ab32SMasahiro Yamada # Modifiers should have spaces. 3879dd88ab32SMasahiro Yamada $to =~ s/(\b$Modifier$)/$1 /; 3880dd88ab32SMasahiro Yamada 38816b9709d9STom Rini## print "2: from<$from> to<$to> ident<$ident>\n"; 3882dd88ab32SMasahiro Yamada if ($from ne $to && $ident !~ /^$Modifier$/) { 38836b9709d9STom Rini if (ERROR("POINTER_LOCATION", 38846b9709d9STom Rini "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) && 38856b9709d9STom Rini $fix) { 38866b9709d9STom Rini 38876b9709d9STom Rini my $sub_from = $match; 38886b9709d9STom Rini my $sub_to = $match; 38896b9709d9STom Rini $sub_to =~ s/\Q$from\E/$to/; 38906305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 38916b9709d9STom Rini s@\Q$sub_from\E@$sub_to@; 38926b9709d9STom Rini } 3893dd88ab32SMasahiro Yamada } 3894dd88ab32SMasahiro Yamada } 3895dd88ab32SMasahiro Yamada 38966305db96SHeinrich Schuchardt# avoid BUG() or BUG_ON() 38976305db96SHeinrich Schuchardt if ($line =~ /\b(?:BUG|BUG_ON)\b/) { 3898*c398f2dfSHeinrich Schuchardt my $msg_level = \&WARN; 3899*c398f2dfSHeinrich Schuchardt $msg_level = \&CHK if ($file); 3900*c398f2dfSHeinrich Schuchardt &{$msg_level}("AVOID_BUG", 39016305db96SHeinrich Schuchardt "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr); 39026305db96SHeinrich Schuchardt } 3903dd88ab32SMasahiro Yamada 39046305db96SHeinrich Schuchardt# avoid LINUX_VERSION_CODE 3905dd88ab32SMasahiro Yamada if ($line =~ /\bLINUX_VERSION_CODE\b/) { 3906dd88ab32SMasahiro Yamada WARN("LINUX_VERSION_CODE", 3907dd88ab32SMasahiro Yamada "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr); 3908dd88ab32SMasahiro Yamada } 3909dd88ab32SMasahiro Yamada 3910dd88ab32SMasahiro Yamada# check for uses of printk_ratelimit 3911dd88ab32SMasahiro Yamada if ($line =~ /\bprintk_ratelimit\s*\(/) { 3912dd88ab32SMasahiro Yamada WARN("PRINTK_RATELIMITED", 3913dd88ab32SMasahiro Yamada "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr); 3914dd88ab32SMasahiro Yamada } 3915dd88ab32SMasahiro Yamada 3916*c398f2dfSHeinrich Schuchardt# printk should use KERN_* levels 3917*c398f2dfSHeinrich Schuchardt if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) { 3918dd88ab32SMasahiro Yamada WARN("PRINTK_WITHOUT_KERN_LEVEL", 3919*c398f2dfSHeinrich Schuchardt "printk() should include KERN_<LEVEL> facility level\n" . $herecurr); 3920dd88ab32SMasahiro Yamada } 3921dd88ab32SMasahiro Yamada 3922dd88ab32SMasahiro Yamada if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) { 3923dd88ab32SMasahiro Yamada my $orig = $1; 3924dd88ab32SMasahiro Yamada my $level = lc($orig); 3925dd88ab32SMasahiro Yamada $level = "warn" if ($level eq "warning"); 3926dd88ab32SMasahiro Yamada my $level2 = $level; 3927dd88ab32SMasahiro Yamada $level2 = "dbg" if ($level eq "debug"); 3928dd88ab32SMasahiro Yamada WARN("PREFER_PR_LEVEL", 39296305db96SHeinrich Schuchardt "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr); 3930dd88ab32SMasahiro Yamada } 3931dd88ab32SMasahiro Yamada 3932dd88ab32SMasahiro Yamada if ($line =~ /\bpr_warning\s*\(/) { 39336b9709d9STom Rini if (WARN("PREFER_PR_LEVEL", 39346b9709d9STom Rini "Prefer pr_warn(... to pr_warning(...\n" . $herecurr) && 39356b9709d9STom Rini $fix) { 39366305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 39376b9709d9STom Rini s/\bpr_warning\b/pr_warn/; 39386b9709d9STom Rini } 3939dd88ab32SMasahiro Yamada } 3940dd88ab32SMasahiro Yamada 3941dd88ab32SMasahiro Yamada if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) { 3942dd88ab32SMasahiro Yamada my $orig = $1; 3943dd88ab32SMasahiro Yamada my $level = lc($orig); 3944dd88ab32SMasahiro Yamada $level = "warn" if ($level eq "warning"); 3945dd88ab32SMasahiro Yamada $level = "dbg" if ($level eq "debug"); 3946dd88ab32SMasahiro Yamada WARN("PREFER_DEV_LEVEL", 3947dd88ab32SMasahiro Yamada "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr); 3948dd88ab32SMasahiro Yamada } 3949dd88ab32SMasahiro Yamada 39506305db96SHeinrich Schuchardt# ENOSYS means "bad syscall nr" and nothing else. This will have a small 39516305db96SHeinrich Schuchardt# number of false positives, but assembly files are not checked, so at 39526305db96SHeinrich Schuchardt# least the arch entry code will not trigger this warning. 39536305db96SHeinrich Schuchardt if ($line =~ /\bENOSYS\b/) { 39546305db96SHeinrich Schuchardt WARN("ENOSYS", 39556305db96SHeinrich Schuchardt "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr); 39566305db96SHeinrich Schuchardt } 39576305db96SHeinrich Schuchardt 3958dd88ab32SMasahiro Yamada# function brace can't be on same line, except for #defines of do while, 3959dd88ab32SMasahiro Yamada# or if closed on same line 3960*c398f2dfSHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 3961*c398f2dfSHeinrich Schuchardt $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ && 3962*c398f2dfSHeinrich Schuchardt $sline !~ /\#\s*define\b.*do\s*\{/ && 3963*c398f2dfSHeinrich Schuchardt $sline !~ /}/) { 39646305db96SHeinrich Schuchardt if (ERROR("OPEN_BRACE", 3965*c398f2dfSHeinrich Schuchardt "open brace '{' following function definitions go on the next line\n" . $herecurr) && 39666305db96SHeinrich Schuchardt $fix) { 39676305db96SHeinrich Schuchardt fix_delete_line($fixlinenr, $rawline); 39686305db96SHeinrich Schuchardt my $fixed_line = $rawline; 39696305db96SHeinrich Schuchardt $fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/; 39706305db96SHeinrich Schuchardt my $line1 = $1; 39716305db96SHeinrich Schuchardt my $line2 = $2; 39726305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, ltrim($line1)); 39736305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, "\+{"); 39746305db96SHeinrich Schuchardt if ($line2 !~ /^\s*$/) { 39756305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, "\+\t" . trim($line2)); 39766305db96SHeinrich Schuchardt } 39776305db96SHeinrich Schuchardt } 3978dd88ab32SMasahiro Yamada } 3979dd88ab32SMasahiro Yamada 3980dd88ab32SMasahiro Yamada# open braces for enum, union and struct go on the same line. 3981dd88ab32SMasahiro Yamada if ($line =~ /^.\s*{/ && 3982dd88ab32SMasahiro Yamada $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) { 39836305db96SHeinrich Schuchardt if (ERROR("OPEN_BRACE", 39846305db96SHeinrich Schuchardt "open brace '{' following $1 go on the same line\n" . $hereprev) && 39856305db96SHeinrich Schuchardt $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { 39866305db96SHeinrich Schuchardt fix_delete_line($fixlinenr - 1, $prevrawline); 39876305db96SHeinrich Schuchardt fix_delete_line($fixlinenr, $rawline); 39886305db96SHeinrich Schuchardt my $fixedline = rtrim($prevrawline) . " {"; 39896305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, $fixedline); 39906305db96SHeinrich Schuchardt $fixedline = $rawline; 39916305db96SHeinrich Schuchardt $fixedline =~ s/^(.\s*)\{\s*/$1\t/; 39926305db96SHeinrich Schuchardt if ($fixedline !~ /^\+\s*$/) { 39936305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, $fixedline); 39946305db96SHeinrich Schuchardt } 39956305db96SHeinrich Schuchardt } 3996dd88ab32SMasahiro Yamada } 3997dd88ab32SMasahiro Yamada 3998dd88ab32SMasahiro Yamada# missing space after union, struct or enum definition 39996b9709d9STom Rini if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) { 40006b9709d9STom Rini if (WARN("SPACING", 40016b9709d9STom Rini "missing space after $1 definition\n" . $herecurr) && 40026b9709d9STom Rini $fix) { 40036305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 40046b9709d9STom Rini s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/; 40056b9709d9STom Rini } 40066b9709d9STom Rini } 40076b9709d9STom Rini 40086b9709d9STom Rini# Function pointer declarations 40096b9709d9STom Rini# check spacing between type, funcptr, and args 40106b9709d9STom Rini# canonical declaration is "type (*funcptr)(args...)" 40116305db96SHeinrich Schuchardt if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) { 40126b9709d9STom Rini my $declare = $1; 40136b9709d9STom Rini my $pre_pointer_space = $2; 40146b9709d9STom Rini my $post_pointer_space = $3; 40156b9709d9STom Rini my $funcname = $4; 40166b9709d9STom Rini my $post_funcname_space = $5; 40176b9709d9STom Rini my $pre_args_space = $6; 40186b9709d9STom Rini 40196305db96SHeinrich Schuchardt# the $Declare variable will capture all spaces after the type 40206305db96SHeinrich Schuchardt# so check it for a missing trailing missing space but pointer return types 40216305db96SHeinrich Schuchardt# don't need a space so don't warn for those. 40226305db96SHeinrich Schuchardt my $post_declare_space = ""; 40236305db96SHeinrich Schuchardt if ($declare =~ /(\s+)$/) { 40246305db96SHeinrich Schuchardt $post_declare_space = $1; 40256305db96SHeinrich Schuchardt $declare = rtrim($declare); 40266305db96SHeinrich Schuchardt } 40276305db96SHeinrich Schuchardt if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) { 4028dd88ab32SMasahiro Yamada WARN("SPACING", 40296b9709d9STom Rini "missing space after return type\n" . $herecurr); 40306305db96SHeinrich Schuchardt $post_declare_space = " "; 40316b9709d9STom Rini } 40326b9709d9STom Rini 40336b9709d9STom Rini# unnecessary space "type (*funcptr)(args...)" 40346305db96SHeinrich Schuchardt# This test is not currently implemented because these declarations are 40356305db96SHeinrich Schuchardt# equivalent to 40366305db96SHeinrich Schuchardt# int foo(int bar, ...) 40376305db96SHeinrich Schuchardt# and this is form shouldn't/doesn't generate a checkpatch warning. 40386305db96SHeinrich Schuchardt# 40396305db96SHeinrich Schuchardt# elsif ($declare =~ /\s{2,}$/) { 40406305db96SHeinrich Schuchardt# WARN("SPACING", 40416305db96SHeinrich Schuchardt# "Multiple spaces after return type\n" . $herecurr); 40426305db96SHeinrich Schuchardt# } 40436b9709d9STom Rini 40446b9709d9STom Rini# unnecessary space "type ( *funcptr)(args...)" 40456b9709d9STom Rini if (defined $pre_pointer_space && 40466b9709d9STom Rini $pre_pointer_space =~ /^\s/) { 40476b9709d9STom Rini WARN("SPACING", 40486b9709d9STom Rini "Unnecessary space after function pointer open parenthesis\n" . $herecurr); 40496b9709d9STom Rini } 40506b9709d9STom Rini 40516b9709d9STom Rini# unnecessary space "type (* funcptr)(args...)" 40526b9709d9STom Rini if (defined $post_pointer_space && 40536b9709d9STom Rini $post_pointer_space =~ /^\s/) { 40546b9709d9STom Rini WARN("SPACING", 40556b9709d9STom Rini "Unnecessary space before function pointer name\n" . $herecurr); 40566b9709d9STom Rini } 40576b9709d9STom Rini 40586b9709d9STom Rini# unnecessary space "type (*funcptr )(args...)" 40596b9709d9STom Rini if (defined $post_funcname_space && 40606b9709d9STom Rini $post_funcname_space =~ /^\s/) { 40616b9709d9STom Rini WARN("SPACING", 40626b9709d9STom Rini "Unnecessary space after function pointer name\n" . $herecurr); 40636b9709d9STom Rini } 40646b9709d9STom Rini 40656b9709d9STom Rini# unnecessary space "type (*funcptr) (args...)" 40666b9709d9STom Rini if (defined $pre_args_space && 40676b9709d9STom Rini $pre_args_space =~ /^\s/) { 40686b9709d9STom Rini WARN("SPACING", 40696b9709d9STom Rini "Unnecessary space before function pointer arguments\n" . $herecurr); 40706b9709d9STom Rini } 40716b9709d9STom Rini 40726b9709d9STom Rini if (show_type("SPACING") && $fix) { 40736305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 40746305db96SHeinrich Schuchardt s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex; 40756b9709d9STom Rini } 4076dd88ab32SMasahiro Yamada } 4077dd88ab32SMasahiro Yamada 4078dd88ab32SMasahiro Yamada# check for spacing round square brackets; allowed: 4079dd88ab32SMasahiro Yamada# 1. with a type on the left -- int [] a; 4080dd88ab32SMasahiro Yamada# 2. at the beginning of a line for slice initialisers -- [0...10] = 5, 4081dd88ab32SMasahiro Yamada# 3. inside a curly brace -- = { [0...10] = 5 } 4082dd88ab32SMasahiro Yamada while ($line =~ /(.*?\s)\[/g) { 4083dd88ab32SMasahiro Yamada my ($where, $prefix) = ($-[1], $1); 4084dd88ab32SMasahiro Yamada if ($prefix !~ /$Type\s+$/ && 4085dd88ab32SMasahiro Yamada ($where != 0 || $prefix !~ /^.\s+$/) && 4086dd88ab32SMasahiro Yamada $prefix !~ /[{,]\s+$/) { 40876b9709d9STom Rini if (ERROR("BRACKET_SPACE", 40886b9709d9STom Rini "space prohibited before open square bracket '['\n" . $herecurr) && 40896b9709d9STom Rini $fix) { 40906305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 40916b9709d9STom Rini s/^(\+.*?)\s+\[/$1\[/; 40926b9709d9STom Rini } 4093dd88ab32SMasahiro Yamada } 4094dd88ab32SMasahiro Yamada } 4095dd88ab32SMasahiro Yamada 4096dd88ab32SMasahiro Yamada# check for spaces between functions and their parentheses. 4097dd88ab32SMasahiro Yamada while ($line =~ /($Ident)\s+\(/g) { 4098dd88ab32SMasahiro Yamada my $name = $1; 4099dd88ab32SMasahiro Yamada my $ctx_before = substr($line, 0, $-[1]); 4100dd88ab32SMasahiro Yamada my $ctx = "$ctx_before$name"; 4101dd88ab32SMasahiro Yamada 4102dd88ab32SMasahiro Yamada # Ignore those directives where spaces _are_ permitted. 4103dd88ab32SMasahiro Yamada if ($name =~ /^(?: 4104dd88ab32SMasahiro Yamada if|for|while|switch|return|case| 4105dd88ab32SMasahiro Yamada volatile|__volatile__| 4106dd88ab32SMasahiro Yamada __attribute__|format|__extension__| 4107dd88ab32SMasahiro Yamada asm|__asm__)$/x) 4108dd88ab32SMasahiro Yamada { 4109dd88ab32SMasahiro Yamada # cpp #define statements have non-optional spaces, ie 4110dd88ab32SMasahiro Yamada # if there is a space between the name and the open 4111dd88ab32SMasahiro Yamada # parenthesis it is simply not a parameter group. 4112dd88ab32SMasahiro Yamada } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) { 4113dd88ab32SMasahiro Yamada 4114dd88ab32SMasahiro Yamada # cpp #elif statement condition may start with a ( 4115dd88ab32SMasahiro Yamada } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) { 4116dd88ab32SMasahiro Yamada 4117dd88ab32SMasahiro Yamada # If this whole things ends with a type its most 4118dd88ab32SMasahiro Yamada # likely a typedef for a function. 4119dd88ab32SMasahiro Yamada } elsif ($ctx =~ /$Type$/) { 4120dd88ab32SMasahiro Yamada 4121dd88ab32SMasahiro Yamada } else { 41226b9709d9STom Rini if (WARN("SPACING", 41236b9709d9STom Rini "space prohibited between function name and open parenthesis '('\n" . $herecurr) && 41246b9709d9STom Rini $fix) { 41256305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 41266b9709d9STom Rini s/\b$name\s+\(/$name\(/; 4127dd88ab32SMasahiro Yamada } 4128dd88ab32SMasahiro Yamada } 4129dd88ab32SMasahiro Yamada } 4130dd88ab32SMasahiro Yamada 4131dd88ab32SMasahiro Yamada# Check operator spacing. 4132dd88ab32SMasahiro Yamada if (!($line=~/\#\s*include/)) { 41336b9709d9STom Rini my $fixed_line = ""; 41346b9709d9STom Rini my $line_fixed = 0; 41356b9709d9STom Rini 4136dd88ab32SMasahiro Yamada my $ops = qr{ 4137dd88ab32SMasahiro Yamada <<=|>>=|<=|>=|==|!=| 4138dd88ab32SMasahiro Yamada \+=|-=|\*=|\/=|%=|\^=|\|=|&=| 4139dd88ab32SMasahiro Yamada =>|->|<<|>>|<|>|=|!|~| 4140dd88ab32SMasahiro Yamada &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%| 41416b9709d9STom Rini \?:|\?|: 4142dd88ab32SMasahiro Yamada }x; 4143dd88ab32SMasahiro Yamada my @elements = split(/($ops|;)/, $opline); 41446b9709d9STom Rini 41456b9709d9STom Rini## print("element count: <" . $#elements . ">\n"); 41466b9709d9STom Rini## foreach my $el (@elements) { 41476b9709d9STom Rini## print("el: <$el>\n"); 41486b9709d9STom Rini## } 41496b9709d9STom Rini 41506b9709d9STom Rini my @fix_elements = (); 4151dd88ab32SMasahiro Yamada my $off = 0; 4152dd88ab32SMasahiro Yamada 41536b9709d9STom Rini foreach my $el (@elements) { 41546b9709d9STom Rini push(@fix_elements, substr($rawline, $off, length($el))); 41556b9709d9STom Rini $off += length($el); 41566b9709d9STom Rini } 41576b9709d9STom Rini 41586b9709d9STom Rini $off = 0; 41596b9709d9STom Rini 4160dd88ab32SMasahiro Yamada my $blank = copy_spacing($opline); 41616b9709d9STom Rini my $last_after = -1; 4162dd88ab32SMasahiro Yamada 4163dd88ab32SMasahiro Yamada for (my $n = 0; $n < $#elements; $n += 2) { 41646b9709d9STom Rini 41656b9709d9STom Rini my $good = $fix_elements[$n] . $fix_elements[$n + 1]; 41666b9709d9STom Rini 41676b9709d9STom Rini## print("n: <$n> good: <$good>\n"); 41686b9709d9STom Rini 4169dd88ab32SMasahiro Yamada $off += length($elements[$n]); 4170dd88ab32SMasahiro Yamada 4171dd88ab32SMasahiro Yamada # Pick up the preceding and succeeding characters. 4172dd88ab32SMasahiro Yamada my $ca = substr($opline, 0, $off); 4173dd88ab32SMasahiro Yamada my $cc = ''; 4174dd88ab32SMasahiro Yamada if (length($opline) >= ($off + length($elements[$n + 1]))) { 4175dd88ab32SMasahiro Yamada $cc = substr($opline, $off + length($elements[$n + 1])); 4176dd88ab32SMasahiro Yamada } 4177dd88ab32SMasahiro Yamada my $cb = "$ca$;$cc"; 4178dd88ab32SMasahiro Yamada 4179dd88ab32SMasahiro Yamada my $a = ''; 4180dd88ab32SMasahiro Yamada $a = 'V' if ($elements[$n] ne ''); 4181dd88ab32SMasahiro Yamada $a = 'W' if ($elements[$n] =~ /\s$/); 4182dd88ab32SMasahiro Yamada $a = 'C' if ($elements[$n] =~ /$;$/); 4183dd88ab32SMasahiro Yamada $a = 'B' if ($elements[$n] =~ /(\[|\()$/); 4184dd88ab32SMasahiro Yamada $a = 'O' if ($elements[$n] eq ''); 4185dd88ab32SMasahiro Yamada $a = 'E' if ($ca =~ /^\s*$/); 4186dd88ab32SMasahiro Yamada 4187dd88ab32SMasahiro Yamada my $op = $elements[$n + 1]; 4188dd88ab32SMasahiro Yamada 4189dd88ab32SMasahiro Yamada my $c = ''; 4190dd88ab32SMasahiro Yamada if (defined $elements[$n + 2]) { 4191dd88ab32SMasahiro Yamada $c = 'V' if ($elements[$n + 2] ne ''); 4192dd88ab32SMasahiro Yamada $c = 'W' if ($elements[$n + 2] =~ /^\s/); 4193dd88ab32SMasahiro Yamada $c = 'C' if ($elements[$n + 2] =~ /^$;/); 4194dd88ab32SMasahiro Yamada $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/); 4195dd88ab32SMasahiro Yamada $c = 'O' if ($elements[$n + 2] eq ''); 4196dd88ab32SMasahiro Yamada $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/); 4197dd88ab32SMasahiro Yamada } else { 4198dd88ab32SMasahiro Yamada $c = 'E'; 4199dd88ab32SMasahiro Yamada } 4200dd88ab32SMasahiro Yamada 4201dd88ab32SMasahiro Yamada my $ctx = "${a}x${c}"; 4202dd88ab32SMasahiro Yamada 4203dd88ab32SMasahiro Yamada my $at = "(ctx:$ctx)"; 4204dd88ab32SMasahiro Yamada 4205dd88ab32SMasahiro Yamada my $ptr = substr($blank, 0, $off) . "^"; 4206dd88ab32SMasahiro Yamada my $hereptr = "$hereline$ptr\n"; 4207dd88ab32SMasahiro Yamada 4208dd88ab32SMasahiro Yamada # Pull out the value of this operator. 4209dd88ab32SMasahiro Yamada my $op_type = substr($curr_values, $off + 1, 1); 4210dd88ab32SMasahiro Yamada 4211dd88ab32SMasahiro Yamada # Get the full operator variant. 4212dd88ab32SMasahiro Yamada my $opv = $op . substr($curr_vars, $off, 1); 4213dd88ab32SMasahiro Yamada 4214dd88ab32SMasahiro Yamada # Ignore operators passed as parameters. 4215dd88ab32SMasahiro Yamada if ($op_type ne 'V' && 42166305db96SHeinrich Schuchardt $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) { 4217dd88ab32SMasahiro Yamada 4218dd88ab32SMasahiro Yamada# # Ignore comments 4219dd88ab32SMasahiro Yamada# } elsif ($op =~ /^$;+$/) { 4220dd88ab32SMasahiro Yamada 4221dd88ab32SMasahiro Yamada # ; should have either the end of line or a space or \ after it 4222dd88ab32SMasahiro Yamada } elsif ($op eq ';') { 4223dd88ab32SMasahiro Yamada if ($ctx !~ /.x[WEBC]/ && 4224dd88ab32SMasahiro Yamada $cc !~ /^\\/ && $cc !~ /^;/) { 42256b9709d9STom Rini if (ERROR("SPACING", 42266b9709d9STom Rini "space required after that '$op' $at\n" . $hereptr)) { 42276b9709d9STom Rini $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; 42286b9709d9STom Rini $line_fixed = 1; 42296b9709d9STom Rini } 4230dd88ab32SMasahiro Yamada } 4231dd88ab32SMasahiro Yamada 4232dd88ab32SMasahiro Yamada # // is a comment 4233dd88ab32SMasahiro Yamada } elsif ($op eq '//') { 4234dd88ab32SMasahiro Yamada 42356305db96SHeinrich Schuchardt # : when part of a bitfield 42366305db96SHeinrich Schuchardt } elsif ($opv eq ':B') { 42376305db96SHeinrich Schuchardt # skip the bitfield test for now 42386305db96SHeinrich Schuchardt 4239dd88ab32SMasahiro Yamada # No spaces for: 4240dd88ab32SMasahiro Yamada # -> 42416305db96SHeinrich Schuchardt } elsif ($op eq '->') { 4242dd88ab32SMasahiro Yamada if ($ctx =~ /Wx.|.xW/) { 42436b9709d9STom Rini if (ERROR("SPACING", 42446b9709d9STom Rini "spaces prohibited around that '$op' $at\n" . $hereptr)) { 42456b9709d9STom Rini $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); 42466b9709d9STom Rini if (defined $fix_elements[$n + 2]) { 42476b9709d9STom Rini $fix_elements[$n + 2] =~ s/^\s+//; 42486b9709d9STom Rini } 42496b9709d9STom Rini $line_fixed = 1; 42506b9709d9STom Rini } 4251dd88ab32SMasahiro Yamada } 4252dd88ab32SMasahiro Yamada 42536305db96SHeinrich Schuchardt # , must not have a space before and must have a space on the right. 4254dd88ab32SMasahiro Yamada } elsif ($op eq ',') { 42556305db96SHeinrich Schuchardt my $rtrim_before = 0; 42566305db96SHeinrich Schuchardt my $space_after = 0; 42576305db96SHeinrich Schuchardt if ($ctx =~ /Wx./) { 42586305db96SHeinrich Schuchardt if (ERROR("SPACING", 42596305db96SHeinrich Schuchardt "space prohibited before that '$op' $at\n" . $hereptr)) { 42606305db96SHeinrich Schuchardt $line_fixed = 1; 42616305db96SHeinrich Schuchardt $rtrim_before = 1; 42626305db96SHeinrich Schuchardt } 42636305db96SHeinrich Schuchardt } 4264dd88ab32SMasahiro Yamada if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/) { 42656b9709d9STom Rini if (ERROR("SPACING", 42666b9709d9STom Rini "space required after that '$op' $at\n" . $hereptr)) { 42676b9709d9STom Rini $line_fixed = 1; 42686b9709d9STom Rini $last_after = $n; 42696305db96SHeinrich Schuchardt $space_after = 1; 42706305db96SHeinrich Schuchardt } 42716305db96SHeinrich Schuchardt } 42726305db96SHeinrich Schuchardt if ($rtrim_before || $space_after) { 42736305db96SHeinrich Schuchardt if ($rtrim_before) { 42746305db96SHeinrich Schuchardt $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); 42756305db96SHeinrich Schuchardt } else { 42766305db96SHeinrich Schuchardt $good = $fix_elements[$n] . trim($fix_elements[$n + 1]); 42776305db96SHeinrich Schuchardt } 42786305db96SHeinrich Schuchardt if ($space_after) { 42796305db96SHeinrich Schuchardt $good .= " "; 42806b9709d9STom Rini } 4281dd88ab32SMasahiro Yamada } 4282dd88ab32SMasahiro Yamada 4283dd88ab32SMasahiro Yamada # '*' as part of a type definition -- reported already. 4284dd88ab32SMasahiro Yamada } elsif ($opv eq '*_') { 4285dd88ab32SMasahiro Yamada #warn "'*' is part of type\n"; 4286dd88ab32SMasahiro Yamada 4287dd88ab32SMasahiro Yamada # unary operators should have a space before and 4288dd88ab32SMasahiro Yamada # none after. May be left adjacent to another 4289dd88ab32SMasahiro Yamada # unary operator, or a cast 4290dd88ab32SMasahiro Yamada } elsif ($op eq '!' || $op eq '~' || 4291dd88ab32SMasahiro Yamada $opv eq '*U' || $opv eq '-U' || 4292dd88ab32SMasahiro Yamada $opv eq '&U' || $opv eq '&&U') { 4293dd88ab32SMasahiro Yamada if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { 42946b9709d9STom Rini if (ERROR("SPACING", 42956b9709d9STom Rini "space required before that '$op' $at\n" . $hereptr)) { 42966b9709d9STom Rini if ($n != $last_after + 2) { 42976b9709d9STom Rini $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]); 42986b9709d9STom Rini $line_fixed = 1; 42996b9709d9STom Rini } 43006b9709d9STom Rini } 4301dd88ab32SMasahiro Yamada } 4302dd88ab32SMasahiro Yamada if ($op eq '*' && $cc =~/\s*$Modifier\b/) { 4303dd88ab32SMasahiro Yamada # A unary '*' may be const 4304dd88ab32SMasahiro Yamada 4305dd88ab32SMasahiro Yamada } elsif ($ctx =~ /.xW/) { 43066b9709d9STom Rini if (ERROR("SPACING", 43076b9709d9STom Rini "space prohibited after that '$op' $at\n" . $hereptr)) { 43086b9709d9STom Rini $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]); 43096b9709d9STom Rini if (defined $fix_elements[$n + 2]) { 43106b9709d9STom Rini $fix_elements[$n + 2] =~ s/^\s+//; 43116b9709d9STom Rini } 43126b9709d9STom Rini $line_fixed = 1; 43136b9709d9STom Rini } 4314dd88ab32SMasahiro Yamada } 4315dd88ab32SMasahiro Yamada 4316dd88ab32SMasahiro Yamada # unary ++ and unary -- are allowed no space on one side. 4317dd88ab32SMasahiro Yamada } elsif ($op eq '++' or $op eq '--') { 4318dd88ab32SMasahiro Yamada if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) { 43196b9709d9STom Rini if (ERROR("SPACING", 43206b9709d9STom Rini "space required one side of that '$op' $at\n" . $hereptr)) { 43216b9709d9STom Rini $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " "; 43226b9709d9STom Rini $line_fixed = 1; 43236b9709d9STom Rini } 4324dd88ab32SMasahiro Yamada } 4325dd88ab32SMasahiro Yamada if ($ctx =~ /Wx[BE]/ || 4326dd88ab32SMasahiro Yamada ($ctx =~ /Wx./ && $cc =~ /^;/)) { 43276b9709d9STom Rini if (ERROR("SPACING", 43286b9709d9STom Rini "space prohibited before that '$op' $at\n" . $hereptr)) { 43296b9709d9STom Rini $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); 43306b9709d9STom Rini $line_fixed = 1; 43316b9709d9STom Rini } 4332dd88ab32SMasahiro Yamada } 4333dd88ab32SMasahiro Yamada if ($ctx =~ /ExW/) { 43346b9709d9STom Rini if (ERROR("SPACING", 43356b9709d9STom Rini "space prohibited after that '$op' $at\n" . $hereptr)) { 43366b9709d9STom Rini $good = $fix_elements[$n] . trim($fix_elements[$n + 1]); 43376b9709d9STom Rini if (defined $fix_elements[$n + 2]) { 43386b9709d9STom Rini $fix_elements[$n + 2] =~ s/^\s+//; 4339dd88ab32SMasahiro Yamada } 43406b9709d9STom Rini $line_fixed = 1; 43416b9709d9STom Rini } 43426b9709d9STom Rini } 4343dd88ab32SMasahiro Yamada 4344dd88ab32SMasahiro Yamada # << and >> may either have or not have spaces both sides 4345dd88ab32SMasahiro Yamada } elsif ($op eq '<<' or $op eq '>>' or 4346dd88ab32SMasahiro Yamada $op eq '&' or $op eq '^' or $op eq '|' or 4347dd88ab32SMasahiro Yamada $op eq '+' or $op eq '-' or 4348dd88ab32SMasahiro Yamada $op eq '*' or $op eq '/' or 4349dd88ab32SMasahiro Yamada $op eq '%') 4350dd88ab32SMasahiro Yamada { 43516305db96SHeinrich Schuchardt if ($check) { 43526305db96SHeinrich Schuchardt if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) { 43536305db96SHeinrich Schuchardt if (CHK("SPACING", 43546305db96SHeinrich Schuchardt "spaces preferred around that '$op' $at\n" . $hereptr)) { 43556305db96SHeinrich Schuchardt $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; 43566305db96SHeinrich Schuchardt $fix_elements[$n + 2] =~ s/^\s+//; 43576305db96SHeinrich Schuchardt $line_fixed = 1; 43586305db96SHeinrich Schuchardt } 43596305db96SHeinrich Schuchardt } elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) { 43606305db96SHeinrich Schuchardt if (CHK("SPACING", 43616305db96SHeinrich Schuchardt "space preferred before that '$op' $at\n" . $hereptr)) { 43626305db96SHeinrich Schuchardt $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]); 43636305db96SHeinrich Schuchardt $line_fixed = 1; 43646305db96SHeinrich Schuchardt } 43656305db96SHeinrich Schuchardt } 43666305db96SHeinrich Schuchardt } elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) { 43676b9709d9STom Rini if (ERROR("SPACING", 43686b9709d9STom Rini "need consistent spacing around '$op' $at\n" . $hereptr)) { 43696b9709d9STom Rini $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; 43706b9709d9STom Rini if (defined $fix_elements[$n + 2]) { 43716b9709d9STom Rini $fix_elements[$n + 2] =~ s/^\s+//; 43726b9709d9STom Rini } 43736b9709d9STom Rini $line_fixed = 1; 43746b9709d9STom Rini } 4375dd88ab32SMasahiro Yamada } 4376dd88ab32SMasahiro Yamada 4377dd88ab32SMasahiro Yamada # A colon needs no spaces before when it is 4378dd88ab32SMasahiro Yamada # terminating a case value or a label. 4379dd88ab32SMasahiro Yamada } elsif ($opv eq ':C' || $opv eq ':L') { 4380dd88ab32SMasahiro Yamada if ($ctx =~ /Wx./) { 43816b9709d9STom Rini if (ERROR("SPACING", 43826b9709d9STom Rini "space prohibited before that '$op' $at\n" . $hereptr)) { 43836b9709d9STom Rini $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]); 43846b9709d9STom Rini $line_fixed = 1; 43856b9709d9STom Rini } 4386dd88ab32SMasahiro Yamada } 4387dd88ab32SMasahiro Yamada 4388dd88ab32SMasahiro Yamada # All the others need spaces both sides. 4389dd88ab32SMasahiro Yamada } elsif ($ctx !~ /[EWC]x[CWE]/) { 4390dd88ab32SMasahiro Yamada my $ok = 0; 4391dd88ab32SMasahiro Yamada 4392dd88ab32SMasahiro Yamada # Ignore email addresses <foo@bar> 4393dd88ab32SMasahiro Yamada if (($op eq '<' && 4394dd88ab32SMasahiro Yamada $cc =~ /^\S+\@\S+>/) || 4395dd88ab32SMasahiro Yamada ($op eq '>' && 4396dd88ab32SMasahiro Yamada $ca =~ /<\S+\@\S+$/)) 4397dd88ab32SMasahiro Yamada { 4398dd88ab32SMasahiro Yamada $ok = 1; 4399dd88ab32SMasahiro Yamada } 4400dd88ab32SMasahiro Yamada 44016305db96SHeinrich Schuchardt # for asm volatile statements 44026305db96SHeinrich Schuchardt # ignore a colon with another 44036305db96SHeinrich Schuchardt # colon immediately before or after 44046305db96SHeinrich Schuchardt if (($op eq ':') && 44056305db96SHeinrich Schuchardt ($ca =~ /:$/ || $cc =~ /^:/)) { 44066305db96SHeinrich Schuchardt $ok = 1; 44076305db96SHeinrich Schuchardt } 44086305db96SHeinrich Schuchardt 44096b9709d9STom Rini # messages are ERROR, but ?: are CHK 4410dd88ab32SMasahiro Yamada if ($ok == 0) { 4411*c398f2dfSHeinrich Schuchardt my $msg_level = \&ERROR; 4412*c398f2dfSHeinrich Schuchardt $msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/); 44136b9709d9STom Rini 4414*c398f2dfSHeinrich Schuchardt if (&{$msg_level}("SPACING", 44156b9709d9STom Rini "spaces required around that '$op' $at\n" . $hereptr)) { 44166b9709d9STom Rini $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " "; 44176b9709d9STom Rini if (defined $fix_elements[$n + 2]) { 44186b9709d9STom Rini $fix_elements[$n + 2] =~ s/^\s+//; 44196b9709d9STom Rini } 44206b9709d9STom Rini $line_fixed = 1; 44216b9709d9STom Rini } 4422dd88ab32SMasahiro Yamada } 4423dd88ab32SMasahiro Yamada } 4424dd88ab32SMasahiro Yamada $off += length($elements[$n + 1]); 44256b9709d9STom Rini 44266b9709d9STom Rini## print("n: <$n> GOOD: <$good>\n"); 44276b9709d9STom Rini 44286b9709d9STom Rini $fixed_line = $fixed_line . $good; 44296b9709d9STom Rini } 44306b9709d9STom Rini 44316b9709d9STom Rini if (($#elements % 2) == 0) { 44326b9709d9STom Rini $fixed_line = $fixed_line . $fix_elements[$#elements]; 44336b9709d9STom Rini } 44346b9709d9STom Rini 44356305db96SHeinrich Schuchardt if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) { 44366305db96SHeinrich Schuchardt $fixed[$fixlinenr] = $fixed_line; 44376b9709d9STom Rini } 44386b9709d9STom Rini 44396b9709d9STom Rini 44406b9709d9STom Rini } 44416b9709d9STom Rini 44426b9709d9STom Rini# check for whitespace before a non-naked semicolon 44436b9709d9STom Rini if ($line =~ /^\+.*\S\s+;\s*$/) { 44446b9709d9STom Rini if (WARN("SPACING", 44456b9709d9STom Rini "space prohibited before semicolon\n" . $herecurr) && 44466b9709d9STom Rini $fix) { 44476305db96SHeinrich Schuchardt 1 while $fixed[$fixlinenr] =~ 44486b9709d9STom Rini s/^(\+.*\S)\s+;/$1;/; 4449dd88ab32SMasahiro Yamada } 4450dd88ab32SMasahiro Yamada } 4451dd88ab32SMasahiro Yamada 4452dd88ab32SMasahiro Yamada# check for multiple assignments 4453dd88ab32SMasahiro Yamada if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) { 4454dd88ab32SMasahiro Yamada CHK("MULTIPLE_ASSIGNMENTS", 4455dd88ab32SMasahiro Yamada "multiple assignments should be avoided\n" . $herecurr); 4456dd88ab32SMasahiro Yamada } 4457dd88ab32SMasahiro Yamada 4458dd88ab32SMasahiro Yamada## # check for multiple declarations, allowing for a function declaration 4459dd88ab32SMasahiro Yamada## # continuation. 4460dd88ab32SMasahiro Yamada## if ($line =~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Ident.*/ && 4461dd88ab32SMasahiro Yamada## $line !~ /^.\s*$Type\s+$Ident(?:\s*=[^,{]*)?\s*,\s*$Type\s*$Ident.*/) { 4462dd88ab32SMasahiro Yamada## 4463dd88ab32SMasahiro Yamada## # Remove any bracketed sections to ensure we do not 4464dd88ab32SMasahiro Yamada## # falsly report the parameters of functions. 4465dd88ab32SMasahiro Yamada## my $ln = $line; 4466dd88ab32SMasahiro Yamada## while ($ln =~ s/\([^\(\)]*\)//g) { 4467dd88ab32SMasahiro Yamada## } 4468dd88ab32SMasahiro Yamada## if ($ln =~ /,/) { 4469dd88ab32SMasahiro Yamada## WARN("MULTIPLE_DECLARATION", 4470dd88ab32SMasahiro Yamada## "declaring multiple variables together should be avoided\n" . $herecurr); 4471dd88ab32SMasahiro Yamada## } 4472dd88ab32SMasahiro Yamada## } 4473dd88ab32SMasahiro Yamada 4474dd88ab32SMasahiro Yamada#need space before brace following if, while, etc 44756305db96SHeinrich Schuchardt if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) || 4476d8a1a304SHeiko Schocher $line =~ /do\{/) { 44776b9709d9STom Rini if (ERROR("SPACING", 44786b9709d9STom Rini "space required before the open brace '{'\n" . $herecurr) && 44796b9709d9STom Rini $fix) { 44806305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/^(\+.*(?:do|\)))\{/$1 {/; 4481dd88ab32SMasahiro Yamada } 44826b9709d9STom Rini } 44836b9709d9STom Rini 44846b9709d9STom Rini## # check for blank lines before declarations 44856b9709d9STom Rini## if ($line =~ /^.\t+$Type\s+$Ident(?:\s*=.*)?;/ && 44866b9709d9STom Rini## $prevrawline =~ /^.\s*$/) { 44876b9709d9STom Rini## WARN("SPACING", 44886b9709d9STom Rini## "No blank lines before declarations\n" . $hereprev); 44896b9709d9STom Rini## } 44906b9709d9STom Rini## 4491dd88ab32SMasahiro Yamada 4492dd88ab32SMasahiro Yamada# closing brace should have a space following it when it has anything 4493dd88ab32SMasahiro Yamada# on the line 4494dd88ab32SMasahiro Yamada if ($line =~ /}(?!(?:,|;|\)))\S/) { 44956b9709d9STom Rini if (ERROR("SPACING", 44966b9709d9STom Rini "space required after that close brace '}'\n" . $herecurr) && 44976b9709d9STom Rini $fix) { 44986305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 44996b9709d9STom Rini s/}((?!(?:,|;|\)))\S)/} $1/; 45006b9709d9STom Rini } 4501dd88ab32SMasahiro Yamada } 4502dd88ab32SMasahiro Yamada 4503dd88ab32SMasahiro Yamada# check spacing on square brackets 4504dd88ab32SMasahiro Yamada if ($line =~ /\[\s/ && $line !~ /\[\s*$/) { 45056b9709d9STom Rini if (ERROR("SPACING", 45066b9709d9STom Rini "space prohibited after that open square bracket '['\n" . $herecurr) && 45076b9709d9STom Rini $fix) { 45086305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 45096b9709d9STom Rini s/\[\s+/\[/; 45106b9709d9STom Rini } 4511dd88ab32SMasahiro Yamada } 4512dd88ab32SMasahiro Yamada if ($line =~ /\s\]/) { 45136b9709d9STom Rini if (ERROR("SPACING", 45146b9709d9STom Rini "space prohibited before that close square bracket ']'\n" . $herecurr) && 45156b9709d9STom Rini $fix) { 45166305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 45176b9709d9STom Rini s/\s+\]/\]/; 45186b9709d9STom Rini } 4519dd88ab32SMasahiro Yamada } 4520dd88ab32SMasahiro Yamada 4521dd88ab32SMasahiro Yamada# check spacing on parentheses 4522dd88ab32SMasahiro Yamada if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ && 4523dd88ab32SMasahiro Yamada $line !~ /for\s*\(\s+;/) { 45246b9709d9STom Rini if (ERROR("SPACING", 45256b9709d9STom Rini "space prohibited after that open parenthesis '('\n" . $herecurr) && 45266b9709d9STom Rini $fix) { 45276305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 45286b9709d9STom Rini s/\(\s+/\(/; 45296b9709d9STom Rini } 4530dd88ab32SMasahiro Yamada } 4531dd88ab32SMasahiro Yamada if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ && 4532dd88ab32SMasahiro Yamada $line !~ /for\s*\(.*;\s+\)/ && 4533dd88ab32SMasahiro Yamada $line !~ /:\s+\)/) { 45346b9709d9STom Rini if (ERROR("SPACING", 45356b9709d9STom Rini "space prohibited before that close parenthesis ')'\n" . $herecurr) && 45366b9709d9STom Rini $fix) { 45376305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 45386b9709d9STom Rini s/\s+\)/\)/; 45396b9709d9STom Rini } 4540dd88ab32SMasahiro Yamada } 4541dd88ab32SMasahiro Yamada 45426305db96SHeinrich Schuchardt# check unnecessary parentheses around addressof/dereference single $Lvals 45436305db96SHeinrich Schuchardt# ie: &(foo->bar) should be &foo->bar and *(foo->bar) should be *foo->bar 45446305db96SHeinrich Schuchardt 45456305db96SHeinrich Schuchardt while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) { 45466305db96SHeinrich Schuchardt my $var = $1; 45476305db96SHeinrich Schuchardt if (CHK("UNNECESSARY_PARENTHESES", 45486305db96SHeinrich Schuchardt "Unnecessary parentheses around $var\n" . $herecurr) && 45496305db96SHeinrich Schuchardt $fix) { 45506305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/; 45516305db96SHeinrich Schuchardt } 45526305db96SHeinrich Schuchardt } 45536305db96SHeinrich Schuchardt 45546305db96SHeinrich Schuchardt# check for unnecessary parentheses around function pointer uses 45556305db96SHeinrich Schuchardt# ie: (foo->bar)(); should be foo->bar(); 45566305db96SHeinrich Schuchardt# but not "if (foo->bar) (" to avoid some false positives 45576305db96SHeinrich Schuchardt if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) { 45586305db96SHeinrich Schuchardt my $var = $2; 45596305db96SHeinrich Schuchardt if (CHK("UNNECESSARY_PARENTHESES", 45606305db96SHeinrich Schuchardt "Unnecessary parentheses around function pointer $var\n" . $herecurr) && 45616305db96SHeinrich Schuchardt $fix) { 45626305db96SHeinrich Schuchardt my $var2 = deparenthesize($var); 45636305db96SHeinrich Schuchardt $var2 =~ s/\s//g; 45646305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\Q$var\E/$var2/; 45656305db96SHeinrich Schuchardt } 45666305db96SHeinrich Schuchardt } 45676305db96SHeinrich Schuchardt 4568*c398f2dfSHeinrich Schuchardt# check for unnecessary parentheses around comparisons in if uses 4569*c398f2dfSHeinrich Schuchardt# when !drivers/staging or command-line uses --strict 4570*c398f2dfSHeinrich Schuchardt if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) && 4571*c398f2dfSHeinrich Schuchardt $^V && $^V ge 5.10.0 && defined($stat) && 4572*c398f2dfSHeinrich Schuchardt $stat =~ /(^.\s*if\s*($balanced_parens))/) { 4573*c398f2dfSHeinrich Schuchardt my $if_stat = $1; 4574*c398f2dfSHeinrich Schuchardt my $test = substr($2, 1, -1); 4575*c398f2dfSHeinrich Schuchardt my $herectx; 4576*c398f2dfSHeinrich Schuchardt while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) { 4577*c398f2dfSHeinrich Schuchardt my $match = $1; 4578*c398f2dfSHeinrich Schuchardt # avoid parentheses around potential macro args 4579*c398f2dfSHeinrich Schuchardt next if ($match =~ /^\s*\w+\s*$/); 4580*c398f2dfSHeinrich Schuchardt if (!defined($herectx)) { 4581*c398f2dfSHeinrich Schuchardt $herectx = $here . "\n"; 4582*c398f2dfSHeinrich Schuchardt my $cnt = statement_rawlines($if_stat); 4583*c398f2dfSHeinrich Schuchardt for (my $n = 0; $n < $cnt; $n++) { 4584*c398f2dfSHeinrich Schuchardt my $rl = raw_line($linenr, $n); 4585*c398f2dfSHeinrich Schuchardt $herectx .= $rl . "\n"; 4586*c398f2dfSHeinrich Schuchardt last if $rl =~ /^[ \+].*\{/; 4587*c398f2dfSHeinrich Schuchardt } 4588*c398f2dfSHeinrich Schuchardt } 4589*c398f2dfSHeinrich Schuchardt CHK("UNNECESSARY_PARENTHESES", 4590*c398f2dfSHeinrich Schuchardt "Unnecessary parentheses around '$match'\n" . $herectx); 4591*c398f2dfSHeinrich Schuchardt } 4592*c398f2dfSHeinrich Schuchardt } 4593*c398f2dfSHeinrich Schuchardt 4594dd88ab32SMasahiro Yamada#goto labels aren't indented, allow a single space however 4595dd88ab32SMasahiro Yamada if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and 4596dd88ab32SMasahiro Yamada !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) { 45976b9709d9STom Rini if (WARN("INDENTED_LABEL", 45986b9709d9STom Rini "labels should not be indented\n" . $herecurr) && 45996b9709d9STom Rini $fix) { 46006305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 46016b9709d9STom Rini s/^(.)\s+/$1/; 46026b9709d9STom Rini } 4603dd88ab32SMasahiro Yamada } 4604dd88ab32SMasahiro Yamada 46056305db96SHeinrich Schuchardt# return is not a function 46066b9709d9STom Rini if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) { 4607dd88ab32SMasahiro Yamada my $spacing = $1; 46086b9709d9STom Rini if ($^V && $^V ge 5.10.0 && 46096305db96SHeinrich Schuchardt $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) { 46106305db96SHeinrich Schuchardt my $value = $1; 46116305db96SHeinrich Schuchardt $value = deparenthesize($value); 46126305db96SHeinrich Schuchardt if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) { 4613dd88ab32SMasahiro Yamada ERROR("RETURN_PARENTHESES", 4614dd88ab32SMasahiro Yamada "return is not a function, parentheses are not required\n" . $herecurr); 46156305db96SHeinrich Schuchardt } 4616dd88ab32SMasahiro Yamada } elsif ($spacing !~ /\s+/) { 4617dd88ab32SMasahiro Yamada ERROR("SPACING", 4618dd88ab32SMasahiro Yamada "space required before the open parenthesis '('\n" . $herecurr); 4619dd88ab32SMasahiro Yamada } 4620dd88ab32SMasahiro Yamada } 46216b9709d9STom Rini 46226305db96SHeinrich Schuchardt# unnecessary return in a void function 46236305db96SHeinrich Schuchardt# at end-of-function, with the previous line a single leading tab, then return; 46246305db96SHeinrich Schuchardt# and the line before that not a goto label target like "out:" 46256305db96SHeinrich Schuchardt if ($sline =~ /^[ \+]}\s*$/ && 46266305db96SHeinrich Schuchardt $prevline =~ /^\+\treturn\s*;\s*$/ && 46276305db96SHeinrich Schuchardt $linenr >= 3 && 46286305db96SHeinrich Schuchardt $lines[$linenr - 3] =~ /^[ +]/ && 46296305db96SHeinrich Schuchardt $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) { 46306305db96SHeinrich Schuchardt WARN("RETURN_VOID", 46316305db96SHeinrich Schuchardt "void function return statements are not generally useful\n" . $hereprev); 46326305db96SHeinrich Schuchardt } 46336305db96SHeinrich Schuchardt 46346b9709d9STom Rini# if statements using unnecessary parentheses - ie: if ((foo == bar)) 46356b9709d9STom Rini if ($^V && $^V ge 5.10.0 && 46366b9709d9STom Rini $line =~ /\bif\s*((?:\(\s*){2,})/) { 46376b9709d9STom Rini my $openparens = $1; 46386b9709d9STom Rini my $count = $openparens =~ tr@\(@\(@; 46396b9709d9STom Rini my $msg = ""; 46406b9709d9STom Rini if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) { 46416b9709d9STom Rini my $comp = $4; #Not $1 because of $LvalOrFunc 46426b9709d9STom Rini $msg = " - maybe == should be = ?" if ($comp eq "=="); 46436b9709d9STom Rini WARN("UNNECESSARY_PARENTHESES", 46446b9709d9STom Rini "Unnecessary parentheses$msg\n" . $herecurr); 46456b9709d9STom Rini } 46466b9709d9STom Rini } 46476b9709d9STom Rini 46486305db96SHeinrich Schuchardt# comparisons with a constant or upper case identifier on the left 46496305db96SHeinrich Schuchardt# avoid cases like "foo + BAR < baz" 46506305db96SHeinrich Schuchardt# only fix matches surrounded by parentheses to avoid incorrect 46516305db96SHeinrich Schuchardt# conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5" 46526305db96SHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 46536305db96SHeinrich Schuchardt $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) { 46546305db96SHeinrich Schuchardt my $lead = $1; 46556305db96SHeinrich Schuchardt my $const = $2; 46566305db96SHeinrich Schuchardt my $comp = $3; 46576305db96SHeinrich Schuchardt my $to = $4; 46586305db96SHeinrich Schuchardt my $newcomp = $comp; 46596305db96SHeinrich Schuchardt if ($lead !~ /(?:$Operators|\.)\s*$/ && 46606305db96SHeinrich Schuchardt $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ && 46616305db96SHeinrich Schuchardt WARN("CONSTANT_COMPARISON", 46626305db96SHeinrich Schuchardt "Comparisons should place the constant on the right side of the test\n" . $herecurr) && 46636305db96SHeinrich Schuchardt $fix) { 46646305db96SHeinrich Schuchardt if ($comp eq "<") { 46656305db96SHeinrich Schuchardt $newcomp = ">"; 46666305db96SHeinrich Schuchardt } elsif ($comp eq "<=") { 46676305db96SHeinrich Schuchardt $newcomp = ">="; 46686305db96SHeinrich Schuchardt } elsif ($comp eq ">") { 46696305db96SHeinrich Schuchardt $newcomp = "<"; 46706305db96SHeinrich Schuchardt } elsif ($comp eq ">=") { 46716305db96SHeinrich Schuchardt $newcomp = "<="; 46726305db96SHeinrich Schuchardt } 46736305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/; 46746305db96SHeinrich Schuchardt } 46756305db96SHeinrich Schuchardt } 46766305db96SHeinrich Schuchardt 46776305db96SHeinrich Schuchardt# Return of what appears to be an errno should normally be negative 46786305db96SHeinrich Schuchardt if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) { 4679dd88ab32SMasahiro Yamada my $name = $1; 4680dd88ab32SMasahiro Yamada if ($name ne 'EOF' && $name ne 'ERROR') { 4681dd88ab32SMasahiro Yamada WARN("USE_NEGATIVE_ERRNO", 46826305db96SHeinrich Schuchardt "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr); 4683dd88ab32SMasahiro Yamada } 4684dd88ab32SMasahiro Yamada } 4685dd88ab32SMasahiro Yamada 4686dd88ab32SMasahiro Yamada# Need a space before open parenthesis after if, while etc 4687dd88ab32SMasahiro Yamada if ($line =~ /\b(if|while|for|switch)\(/) { 46886b9709d9STom Rini if (ERROR("SPACING", 46896b9709d9STom Rini "space required before the open parenthesis '('\n" . $herecurr) && 46906b9709d9STom Rini $fix) { 46916305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 46926b9709d9STom Rini s/\b(if|while|for|switch)\(/$1 \(/; 46936b9709d9STom Rini } 4694dd88ab32SMasahiro Yamada } 4695dd88ab32SMasahiro Yamada 4696dd88ab32SMasahiro Yamada# Check for illegal assignment in if conditional -- and check for trailing 4697dd88ab32SMasahiro Yamada# statements after the conditional. 4698dd88ab32SMasahiro Yamada if ($line =~ /do\s*(?!{)/) { 4699dd88ab32SMasahiro Yamada ($stat, $cond, $line_nr_next, $remain_next, $off_next) = 4700dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0) 4701dd88ab32SMasahiro Yamada if (!defined $stat); 4702dd88ab32SMasahiro Yamada my ($stat_next) = ctx_statement_block($line_nr_next, 4703dd88ab32SMasahiro Yamada $remain_next, $off_next); 4704dd88ab32SMasahiro Yamada $stat_next =~ s/\n./\n /g; 4705dd88ab32SMasahiro Yamada ##print "stat<$stat> stat_next<$stat_next>\n"; 4706dd88ab32SMasahiro Yamada 4707dd88ab32SMasahiro Yamada if ($stat_next =~ /^\s*while\b/) { 4708dd88ab32SMasahiro Yamada # If the statement carries leading newlines, 4709dd88ab32SMasahiro Yamada # then count those as offsets. 4710dd88ab32SMasahiro Yamada my ($whitespace) = 4711dd88ab32SMasahiro Yamada ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s); 4712dd88ab32SMasahiro Yamada my $offset = 4713dd88ab32SMasahiro Yamada statement_rawlines($whitespace) - 1; 4714dd88ab32SMasahiro Yamada 4715dd88ab32SMasahiro Yamada $suppress_whiletrailers{$line_nr_next + 4716dd88ab32SMasahiro Yamada $offset} = 1; 4717dd88ab32SMasahiro Yamada } 4718dd88ab32SMasahiro Yamada } 4719dd88ab32SMasahiro Yamada if (!defined $suppress_whiletrailers{$linenr} && 47206b9709d9STom Rini defined($stat) && defined($cond) && 4721dd88ab32SMasahiro Yamada $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) { 4722dd88ab32SMasahiro Yamada my ($s, $c) = ($stat, $cond); 4723dd88ab32SMasahiro Yamada 4724dd88ab32SMasahiro Yamada if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) { 4725dd88ab32SMasahiro Yamada ERROR("ASSIGN_IN_IF", 4726dd88ab32SMasahiro Yamada "do not use assignment in if condition\n" . $herecurr); 4727dd88ab32SMasahiro Yamada } 4728dd88ab32SMasahiro Yamada 4729dd88ab32SMasahiro Yamada # Find out what is on the end of the line after the 4730dd88ab32SMasahiro Yamada # conditional. 4731dd88ab32SMasahiro Yamada substr($s, 0, length($c), ''); 4732dd88ab32SMasahiro Yamada $s =~ s/\n.*//g; 4733dd88ab32SMasahiro Yamada $s =~ s/$;//g; # Remove any comments 4734dd88ab32SMasahiro Yamada if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ && 4735dd88ab32SMasahiro Yamada $c !~ /}\s*while\s*/) 4736dd88ab32SMasahiro Yamada { 4737dd88ab32SMasahiro Yamada # Find out how long the conditional actually is. 4738dd88ab32SMasahiro Yamada my @newlines = ($c =~ /\n/gs); 4739dd88ab32SMasahiro Yamada my $cond_lines = 1 + $#newlines; 4740dd88ab32SMasahiro Yamada my $stat_real = ''; 4741dd88ab32SMasahiro Yamada 4742dd88ab32SMasahiro Yamada $stat_real = raw_line($linenr, $cond_lines) 4743dd88ab32SMasahiro Yamada . "\n" if ($cond_lines); 4744dd88ab32SMasahiro Yamada if (defined($stat_real) && $cond_lines > 1) { 4745dd88ab32SMasahiro Yamada $stat_real = "[...]\n$stat_real"; 4746dd88ab32SMasahiro Yamada } 4747dd88ab32SMasahiro Yamada 4748dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 4749dd88ab32SMasahiro Yamada "trailing statements should be on next line\n" . $herecurr . $stat_real); 4750dd88ab32SMasahiro Yamada } 4751dd88ab32SMasahiro Yamada } 4752dd88ab32SMasahiro Yamada 4753dd88ab32SMasahiro Yamada# Check for bitwise tests written as boolean 4754dd88ab32SMasahiro Yamada if ($line =~ / 4755dd88ab32SMasahiro Yamada (?: 4756dd88ab32SMasahiro Yamada (?:\[|\(|\&\&|\|\|) 4757dd88ab32SMasahiro Yamada \s*0[xX][0-9]+\s* 4758dd88ab32SMasahiro Yamada (?:\&\&|\|\|) 4759dd88ab32SMasahiro Yamada | 4760dd88ab32SMasahiro Yamada (?:\&\&|\|\|) 4761dd88ab32SMasahiro Yamada \s*0[xX][0-9]+\s* 4762dd88ab32SMasahiro Yamada (?:\&\&|\|\||\)|\]) 4763dd88ab32SMasahiro Yamada )/x) 4764dd88ab32SMasahiro Yamada { 4765dd88ab32SMasahiro Yamada WARN("HEXADECIMAL_BOOLEAN_TEST", 4766dd88ab32SMasahiro Yamada "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr); 4767dd88ab32SMasahiro Yamada } 4768dd88ab32SMasahiro Yamada 4769dd88ab32SMasahiro Yamada# if and else should not have general statements after it 4770dd88ab32SMasahiro Yamada if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) { 4771dd88ab32SMasahiro Yamada my $s = $1; 4772dd88ab32SMasahiro Yamada $s =~ s/$;//g; # Remove any comments 4773dd88ab32SMasahiro Yamada if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) { 4774dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 4775dd88ab32SMasahiro Yamada "trailing statements should be on next line\n" . $herecurr); 4776dd88ab32SMasahiro Yamada } 4777dd88ab32SMasahiro Yamada } 4778dd88ab32SMasahiro Yamada# if should not continue a brace 4779dd88ab32SMasahiro Yamada if ($line =~ /}\s*if\b/) { 4780dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 47816305db96SHeinrich Schuchardt "trailing statements should be on next line (or did you mean 'else if'?)\n" . 4782dd88ab32SMasahiro Yamada $herecurr); 4783dd88ab32SMasahiro Yamada } 4784dd88ab32SMasahiro Yamada# case and default should not have general statements after them 4785dd88ab32SMasahiro Yamada if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g && 4786dd88ab32SMasahiro Yamada $line !~ /\G(?: 4787dd88ab32SMasahiro Yamada (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$| 4788dd88ab32SMasahiro Yamada \s*return\s+ 4789dd88ab32SMasahiro Yamada )/xg) 4790dd88ab32SMasahiro Yamada { 4791dd88ab32SMasahiro Yamada ERROR("TRAILING_STATEMENTS", 4792dd88ab32SMasahiro Yamada "trailing statements should be on next line\n" . $herecurr); 4793dd88ab32SMasahiro Yamada } 4794dd88ab32SMasahiro Yamada 4795dd88ab32SMasahiro Yamada # Check for }<nl>else {, these must be at the same 4796dd88ab32SMasahiro Yamada # indent level to be relevant to each other. 47976305db96SHeinrich Schuchardt if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ && 4798dd88ab32SMasahiro Yamada $previndent == $indent) { 47996305db96SHeinrich Schuchardt if (ERROR("ELSE_AFTER_BRACE", 48006305db96SHeinrich Schuchardt "else should follow close brace '}'\n" . $hereprev) && 48016305db96SHeinrich Schuchardt $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { 48026305db96SHeinrich Schuchardt fix_delete_line($fixlinenr - 1, $prevrawline); 48036305db96SHeinrich Schuchardt fix_delete_line($fixlinenr, $rawline); 48046305db96SHeinrich Schuchardt my $fixedline = $prevrawline; 48056305db96SHeinrich Schuchardt $fixedline =~ s/}\s*$//; 48066305db96SHeinrich Schuchardt if ($fixedline !~ /^\+\s*$/) { 48076305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, $fixedline); 48086305db96SHeinrich Schuchardt } 48096305db96SHeinrich Schuchardt $fixedline = $rawline; 48106305db96SHeinrich Schuchardt $fixedline =~ s/^(.\s*)else/$1} else/; 48116305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, $fixedline); 48126305db96SHeinrich Schuchardt } 4813dd88ab32SMasahiro Yamada } 4814dd88ab32SMasahiro Yamada 48156305db96SHeinrich Schuchardt if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ && 4816dd88ab32SMasahiro Yamada $previndent == $indent) { 4817dd88ab32SMasahiro Yamada my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); 4818dd88ab32SMasahiro Yamada 4819dd88ab32SMasahiro Yamada # Find out what is on the end of the line after the 4820dd88ab32SMasahiro Yamada # conditional. 4821dd88ab32SMasahiro Yamada substr($s, 0, length($c), ''); 4822dd88ab32SMasahiro Yamada $s =~ s/\n.*//g; 4823dd88ab32SMasahiro Yamada 4824dd88ab32SMasahiro Yamada if ($s =~ /^\s*;/) { 48256305db96SHeinrich Schuchardt if (ERROR("WHILE_AFTER_BRACE", 48266305db96SHeinrich Schuchardt "while should follow close brace '}'\n" . $hereprev) && 48276305db96SHeinrich Schuchardt $fix && $prevline =~ /^\+/ && $line =~ /^\+/) { 48286305db96SHeinrich Schuchardt fix_delete_line($fixlinenr - 1, $prevrawline); 48296305db96SHeinrich Schuchardt fix_delete_line($fixlinenr, $rawline); 48306305db96SHeinrich Schuchardt my $fixedline = $prevrawline; 48316305db96SHeinrich Schuchardt my $trailing = $rawline; 48326305db96SHeinrich Schuchardt $trailing =~ s/^\+//; 48336305db96SHeinrich Schuchardt $trailing = trim($trailing); 48346305db96SHeinrich Schuchardt $fixedline =~ s/}\s*$/} $trailing/; 48356305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, $fixedline); 48366305db96SHeinrich Schuchardt } 4837dd88ab32SMasahiro Yamada } 4838dd88ab32SMasahiro Yamada } 4839dd88ab32SMasahiro Yamada 48406b9709d9STom Rini#Specific variable tests 4841dd88ab32SMasahiro Yamada while ($line =~ m{($Constant|$Lval)}g) { 4842dd88ab32SMasahiro Yamada my $var = $1; 48436b9709d9STom Rini 48446b9709d9STom Rini#gcc binary extension 48456b9709d9STom Rini if ($var =~ /^$Binary$/) { 48466b9709d9STom Rini if (WARN("GCC_BINARY_CONSTANT", 48476b9709d9STom Rini "Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) && 48486b9709d9STom Rini $fix) { 48496b9709d9STom Rini my $hexval = sprintf("0x%x", oct($var)); 48506305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 48516b9709d9STom Rini s/\b$var\b/$hexval/; 48526b9709d9STom Rini } 48536b9709d9STom Rini } 48546b9709d9STom Rini 48556b9709d9STom Rini#CamelCase 48566b9709d9STom Rini if ($var !~ /^$Constant$/ && 48576b9709d9STom Rini $var =~ /[A-Z][a-z]|[a-z][A-Z]/ && 48586b9709d9STom Rini#Ignore Page<foo> variants 48596b9709d9STom Rini $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ && 48606b9709d9STom Rini#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show) 48616305db96SHeinrich Schuchardt $var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ && 48626305db96SHeinrich Schuchardt#Ignore some three character SI units explicitly, like MiB and KHz 48636305db96SHeinrich Schuchardt $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) { 48646b9709d9STom Rini while ($var =~ m{($Ident)}g) { 48656b9709d9STom Rini my $word = $1; 48666b9709d9STom Rini next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/); 48676b9709d9STom Rini if ($check) { 48686b9709d9STom Rini seed_camelcase_includes(); 48696b9709d9STom Rini if (!$file && !$camelcase_file_seeded) { 48706b9709d9STom Rini seed_camelcase_file($realfile); 48716b9709d9STom Rini $camelcase_file_seeded = 1; 48726b9709d9STom Rini } 48736b9709d9STom Rini } 48746b9709d9STom Rini if (!defined $camelcase{$word}) { 48756b9709d9STom Rini $camelcase{$word} = 1; 48766b9709d9STom Rini CHK("CAMELCASE", 48776b9709d9STom Rini "Avoid CamelCase: <$word>\n" . $herecurr); 48786b9709d9STom Rini } 48796b9709d9STom Rini } 4880dd88ab32SMasahiro Yamada } 4881dd88ab32SMasahiro Yamada } 4882dd88ab32SMasahiro Yamada 4883dd88ab32SMasahiro Yamada#no spaces allowed after \ in define 48846b9709d9STom Rini if ($line =~ /\#\s*define.*\\\s+$/) { 48856b9709d9STom Rini if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION", 48866b9709d9STom Rini "Whitespace after \\ makes next lines useless\n" . $herecurr) && 48876b9709d9STom Rini $fix) { 48886305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\s+$//; 48896b9709d9STom Rini } 4890dd88ab32SMasahiro Yamada } 4891dd88ab32SMasahiro Yamada 48926305db96SHeinrich Schuchardt# warn if <asm/foo.h> is #included and <linux/foo.h> is available and includes 48936305db96SHeinrich Schuchardt# itself <asm/foo.h> (uses RAW line) 4894dd88ab32SMasahiro Yamada if ($tree && $rawline =~ m{^.\s*\#\s*include\s*\<asm\/(.*)\.h\>}) { 4895dd88ab32SMasahiro Yamada my $file = "$1.h"; 4896dd88ab32SMasahiro Yamada my $checkfile = "include/linux/$file"; 4897dd88ab32SMasahiro Yamada if (-f "$root/$checkfile" && 4898dd88ab32SMasahiro Yamada $realfile ne $checkfile && 4899dd88ab32SMasahiro Yamada $1 !~ /$allowed_asm_includes/) 4900dd88ab32SMasahiro Yamada { 49016305db96SHeinrich Schuchardt my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`; 49026305db96SHeinrich Schuchardt if ($asminclude > 0) { 4903dd88ab32SMasahiro Yamada if ($realfile =~ m{^arch/}) { 4904dd88ab32SMasahiro Yamada CHK("ARCH_INCLUDE_LINUX", 4905dd88ab32SMasahiro Yamada "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr); 4906dd88ab32SMasahiro Yamada } else { 4907dd88ab32SMasahiro Yamada WARN("INCLUDE_LINUX", 4908dd88ab32SMasahiro Yamada "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr); 4909dd88ab32SMasahiro Yamada } 4910dd88ab32SMasahiro Yamada } 4911dd88ab32SMasahiro Yamada } 49126305db96SHeinrich Schuchardt } 4913dd88ab32SMasahiro Yamada 4914dd88ab32SMasahiro Yamada# multi-statement macros should be enclosed in a do while loop, grab the 4915dd88ab32SMasahiro Yamada# first statement and ensure its the whole macro if its not enclosed 4916dd88ab32SMasahiro Yamada# in a known good container 4917dd88ab32SMasahiro Yamada if ($realfile !~ m@/vmlinux.lds.h$@ && 4918dd88ab32SMasahiro Yamada $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) { 4919dd88ab32SMasahiro Yamada my $ln = $linenr; 4920dd88ab32SMasahiro Yamada my $cnt = $realcnt; 4921dd88ab32SMasahiro Yamada my ($off, $dstat, $dcond, $rest); 4922dd88ab32SMasahiro Yamada my $ctx = ''; 49236305db96SHeinrich Schuchardt my $has_flow_statement = 0; 49246305db96SHeinrich Schuchardt my $has_arg_concat = 0; 4925dd88ab32SMasahiro Yamada ($dstat, $dcond, $ln, $cnt, $off) = 4926dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0); 4927dd88ab32SMasahiro Yamada $ctx = $dstat; 4928dd88ab32SMasahiro Yamada #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n"; 4929dd88ab32SMasahiro Yamada #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n"; 4930dd88ab32SMasahiro Yamada 49316305db96SHeinrich Schuchardt $has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/); 49326305db96SHeinrich Schuchardt $has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/); 49336305db96SHeinrich Schuchardt 49346305db96SHeinrich Schuchardt $dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//; 49356305db96SHeinrich Schuchardt my $define_args = $1; 49366305db96SHeinrich Schuchardt my $define_stmt = $dstat; 49376305db96SHeinrich Schuchardt my @def_args = (); 49386305db96SHeinrich Schuchardt 49396305db96SHeinrich Schuchardt if (defined $define_args && $define_args ne "") { 49406305db96SHeinrich Schuchardt $define_args = substr($define_args, 1, length($define_args) - 2); 49416305db96SHeinrich Schuchardt $define_args =~ s/\s*//g; 49426305db96SHeinrich Schuchardt @def_args = split(",", $define_args); 49436305db96SHeinrich Schuchardt } 49446305db96SHeinrich Schuchardt 4945dd88ab32SMasahiro Yamada $dstat =~ s/$;//g; 4946dd88ab32SMasahiro Yamada $dstat =~ s/\\\n.//g; 4947dd88ab32SMasahiro Yamada $dstat =~ s/^\s*//s; 4948dd88ab32SMasahiro Yamada $dstat =~ s/\s*$//s; 4949dd88ab32SMasahiro Yamada 4950dd88ab32SMasahiro Yamada # Flatten any parentheses and braces 4951dd88ab32SMasahiro Yamada while ($dstat =~ s/\([^\(\)]*\)/1/ || 4952dd88ab32SMasahiro Yamada $dstat =~ s/\{[^\{\}]*\}/1/ || 49536305db96SHeinrich Schuchardt $dstat =~ s/.\[[^\[\]]*\]/1/) 4954dd88ab32SMasahiro Yamada { 4955dd88ab32SMasahiro Yamada } 4956dd88ab32SMasahiro Yamada 4957dd88ab32SMasahiro Yamada # Flatten any obvious string concatentation. 49586305db96SHeinrich Schuchardt while ($dstat =~ s/($String)\s*$Ident/$1/ || 49596305db96SHeinrich Schuchardt $dstat =~ s/$Ident\s*($String)/$1/) 4960dd88ab32SMasahiro Yamada { 4961dd88ab32SMasahiro Yamada } 4962dd88ab32SMasahiro Yamada 49636305db96SHeinrich Schuchardt # Make asm volatile uses seem like a generic function 49646305db96SHeinrich Schuchardt $dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g; 49656305db96SHeinrich Schuchardt 4966dd88ab32SMasahiro Yamada my $exceptions = qr{ 4967dd88ab32SMasahiro Yamada $Declare| 4968dd88ab32SMasahiro Yamada module_param_named| 4969dd88ab32SMasahiro Yamada MODULE_PARM_DESC| 4970dd88ab32SMasahiro Yamada DECLARE_PER_CPU| 4971dd88ab32SMasahiro Yamada DEFINE_PER_CPU| 4972dd88ab32SMasahiro Yamada __typeof__\(| 4973dd88ab32SMasahiro Yamada union| 4974dd88ab32SMasahiro Yamada struct| 4975dd88ab32SMasahiro Yamada \.$Ident\s*=\s*| 49766305db96SHeinrich Schuchardt ^\"|\"$| 49776305db96SHeinrich Schuchardt ^\[ 4978dd88ab32SMasahiro Yamada }x; 4979dd88ab32SMasahiro Yamada #print "REST<$rest> dstat<$dstat> ctx<$ctx>\n"; 49806305db96SHeinrich Schuchardt 49816305db96SHeinrich Schuchardt $ctx =~ s/\n*$//; 49826305db96SHeinrich Schuchardt my $stmt_cnt = statement_rawlines($ctx); 4983*c398f2dfSHeinrich Schuchardt my $herectx = get_stat_here($linenr, $stmt_cnt, $here); 49846305db96SHeinrich Schuchardt 4985dd88ab32SMasahiro Yamada if ($dstat ne '' && 4986dd88ab32SMasahiro Yamada $dstat !~ /^(?:$Ident|-?$Constant),$/ && # 10, // foo(), 4987dd88ab32SMasahiro Yamada $dstat !~ /^(?:$Ident|-?$Constant);$/ && # foo(); 49886b9709d9STom Rini $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ && # 10 // foo() // !foo // ~foo // -foo // foo->bar // foo.bar->baz 49896305db96SHeinrich Schuchardt $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ && # character constants 4990dd88ab32SMasahiro Yamada $dstat !~ /$exceptions/ && 4991dd88ab32SMasahiro Yamada $dstat !~ /^\.$Ident\s*=/ && # .foo = 49926b9709d9STom Rini $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo 4993dd88ab32SMasahiro Yamada $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...) 4994dd88ab32SMasahiro Yamada $dstat !~ /^for\s*$Constant$/ && # for (...) 4995dd88ab32SMasahiro Yamada $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ && # for (...) bar() 4996dd88ab32SMasahiro Yamada $dstat !~ /^do\s*{/ && # do {... 4997d8a1a304SHeiko Schocher $dstat !~ /^\(\{/ && # ({... 49986b9709d9STom Rini $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/) 4999dd88ab32SMasahiro Yamada { 50006305db96SHeinrich Schuchardt if ($dstat =~ /^\s*if\b/) { 50016305db96SHeinrich Schuchardt ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE", 50026305db96SHeinrich Schuchardt "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx"); 50036305db96SHeinrich Schuchardt } elsif ($dstat =~ /;/) { 50046305db96SHeinrich Schuchardt ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE", 50056305db96SHeinrich Schuchardt "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx"); 50066305db96SHeinrich Schuchardt } else { 50076305db96SHeinrich Schuchardt ERROR("COMPLEX_MACRO", 50086305db96SHeinrich Schuchardt "Macros with complex values should be enclosed in parentheses\n" . "$herectx"); 50096305db96SHeinrich Schuchardt } 50106305db96SHeinrich Schuchardt 50116305db96SHeinrich Schuchardt } 50126305db96SHeinrich Schuchardt 50136305db96SHeinrich Schuchardt # Make $define_stmt single line, comment-free, etc 50146305db96SHeinrich Schuchardt my @stmt_array = split('\n', $define_stmt); 50156305db96SHeinrich Schuchardt my $first = 1; 50166305db96SHeinrich Schuchardt $define_stmt = ""; 50176305db96SHeinrich Schuchardt foreach my $l (@stmt_array) { 50186305db96SHeinrich Schuchardt $l =~ s/\\$//; 50196305db96SHeinrich Schuchardt if ($first) { 50206305db96SHeinrich Schuchardt $define_stmt = $l; 50216305db96SHeinrich Schuchardt $first = 0; 50226305db96SHeinrich Schuchardt } elsif ($l =~ /^[\+ ]/) { 50236305db96SHeinrich Schuchardt $define_stmt .= substr($l, 1); 50246305db96SHeinrich Schuchardt } 50256305db96SHeinrich Schuchardt } 50266305db96SHeinrich Schuchardt $define_stmt =~ s/$;//g; 50276305db96SHeinrich Schuchardt $define_stmt =~ s/\s+/ /g; 50286305db96SHeinrich Schuchardt $define_stmt = trim($define_stmt); 50296305db96SHeinrich Schuchardt 50306305db96SHeinrich Schuchardt# check if any macro arguments are reused (ignore '...' and 'type') 50316305db96SHeinrich Schuchardt foreach my $arg (@def_args) { 50326305db96SHeinrich Schuchardt next if ($arg =~ /\.\.\./); 50336305db96SHeinrich Schuchardt next if ($arg =~ /^type$/i); 50346305db96SHeinrich Schuchardt my $tmp_stmt = $define_stmt; 50356305db96SHeinrich Schuchardt $tmp_stmt =~ s/\b(typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g; 50366305db96SHeinrich Schuchardt $tmp_stmt =~ s/\#+\s*$arg\b//g; 50376305db96SHeinrich Schuchardt $tmp_stmt =~ s/\b$arg\s*\#\#//g; 50386305db96SHeinrich Schuchardt my $use_cnt = $tmp_stmt =~ s/\b$arg\b//g; 50396305db96SHeinrich Schuchardt if ($use_cnt > 1) { 50406305db96SHeinrich Schuchardt CHK("MACRO_ARG_REUSE", 50416305db96SHeinrich Schuchardt "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx"); 50426305db96SHeinrich Schuchardt } 50436305db96SHeinrich Schuchardt# check if any macro arguments may have other precedence issues 50446305db96SHeinrich Schuchardt if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m && 50456305db96SHeinrich Schuchardt ((defined($1) && $1 ne ',') || 50466305db96SHeinrich Schuchardt (defined($2) && $2 ne ','))) { 50476305db96SHeinrich Schuchardt CHK("MACRO_ARG_PRECEDENCE", 50486305db96SHeinrich Schuchardt "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx"); 50496305db96SHeinrich Schuchardt } 50506305db96SHeinrich Schuchardt } 50516305db96SHeinrich Schuchardt 50526305db96SHeinrich Schuchardt# check for macros with flow control, but without ## concatenation 50536305db96SHeinrich Schuchardt# ## concatenation is commonly a macro that defines a function so ignore those 50546305db96SHeinrich Schuchardt if ($has_flow_statement && !$has_arg_concat) { 5055dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($ctx); 5056*c398f2dfSHeinrich Schuchardt my $herectx = get_stat_here($linenr, $cnt, $here); 5057dd88ab32SMasahiro Yamada 50586305db96SHeinrich Schuchardt WARN("MACRO_WITH_FLOW_CONTROL", 50596305db96SHeinrich Schuchardt "Macros with flow control statements should be avoided\n" . "$herectx"); 5060dd88ab32SMasahiro Yamada } 5061dd88ab32SMasahiro Yamada 5062dd88ab32SMasahiro Yamada# check for line continuations outside of #defines, preprocessor #, and asm 5063dd88ab32SMasahiro Yamada 5064dd88ab32SMasahiro Yamada } else { 5065dd88ab32SMasahiro Yamada if ($prevline !~ /^..*\\$/ && 5066dd88ab32SMasahiro Yamada $line !~ /^\+\s*\#.*\\$/ && # preprocessor 5067dd88ab32SMasahiro Yamada $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm 5068dd88ab32SMasahiro Yamada $line =~ /^\+.*\\$/) { 5069dd88ab32SMasahiro Yamada WARN("LINE_CONTINUATIONS", 5070dd88ab32SMasahiro Yamada "Avoid unnecessary line continuations\n" . $herecurr); 5071dd88ab32SMasahiro Yamada } 5072dd88ab32SMasahiro Yamada } 5073dd88ab32SMasahiro Yamada 5074dd88ab32SMasahiro Yamada# do {} while (0) macro tests: 5075dd88ab32SMasahiro Yamada# single-statement macros do not need to be enclosed in do while (0) loop, 5076dd88ab32SMasahiro Yamada# macro should not end with a semicolon 5077dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 5078dd88ab32SMasahiro Yamada $realfile !~ m@/vmlinux.lds.h$@ && 5079dd88ab32SMasahiro Yamada $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) { 5080dd88ab32SMasahiro Yamada my $ln = $linenr; 5081dd88ab32SMasahiro Yamada my $cnt = $realcnt; 5082dd88ab32SMasahiro Yamada my ($off, $dstat, $dcond, $rest); 5083dd88ab32SMasahiro Yamada my $ctx = ''; 5084dd88ab32SMasahiro Yamada ($dstat, $dcond, $ln, $cnt, $off) = 5085dd88ab32SMasahiro Yamada ctx_statement_block($linenr, $realcnt, 0); 5086dd88ab32SMasahiro Yamada $ctx = $dstat; 5087dd88ab32SMasahiro Yamada 5088dd88ab32SMasahiro Yamada $dstat =~ s/\\\n.//g; 50896305db96SHeinrich Schuchardt $dstat =~ s/$;/ /g; 5090dd88ab32SMasahiro Yamada 5091dd88ab32SMasahiro Yamada if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) { 5092dd88ab32SMasahiro Yamada my $stmts = $2; 5093dd88ab32SMasahiro Yamada my $semis = $3; 5094dd88ab32SMasahiro Yamada 5095dd88ab32SMasahiro Yamada $ctx =~ s/\n*$//; 5096dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($ctx); 5097*c398f2dfSHeinrich Schuchardt my $herectx = get_stat_here($linenr, $cnt, $here); 5098dd88ab32SMasahiro Yamada 5099dd88ab32SMasahiro Yamada if (($stmts =~ tr/;/;/) == 1 && 5100dd88ab32SMasahiro Yamada $stmts !~ /^\s*(if|while|for|switch)\b/) { 5101dd88ab32SMasahiro Yamada WARN("SINGLE_STATEMENT_DO_WHILE_MACRO", 5102dd88ab32SMasahiro Yamada "Single statement macros should not use a do {} while (0) loop\n" . "$herectx"); 5103dd88ab32SMasahiro Yamada } 5104dd88ab32SMasahiro Yamada if (defined $semis && $semis ne "") { 5105dd88ab32SMasahiro Yamada WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON", 5106dd88ab32SMasahiro Yamada "do {} while (0) macros should not be semicolon terminated\n" . "$herectx"); 5107dd88ab32SMasahiro Yamada } 51086305db96SHeinrich Schuchardt } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) { 51096305db96SHeinrich Schuchardt $ctx =~ s/\n*$//; 51106305db96SHeinrich Schuchardt my $cnt = statement_rawlines($ctx); 5111*c398f2dfSHeinrich Schuchardt my $herectx = get_stat_here($linenr, $cnt, $here); 51126305db96SHeinrich Schuchardt 51136305db96SHeinrich Schuchardt WARN("TRAILING_SEMICOLON", 51146305db96SHeinrich Schuchardt "macros should not use a trailing semicolon\n" . "$herectx"); 5115dd88ab32SMasahiro Yamada } 5116dd88ab32SMasahiro Yamada } 5117dd88ab32SMasahiro Yamada 5118dd88ab32SMasahiro Yamada# make sure symbols are always wrapped with VMLINUX_SYMBOL() ... 5119dd88ab32SMasahiro Yamada# all assignments may have only one of the following with an assignment: 5120dd88ab32SMasahiro Yamada# . 5121dd88ab32SMasahiro Yamada# ALIGN(...) 5122dd88ab32SMasahiro Yamada# VMLINUX_SYMBOL(...) 5123dd88ab32SMasahiro Yamada if ($realfile eq 'vmlinux.lds.h' && $line =~ /(?:(?:^|\s)$Ident\s*=|=\s*$Ident(?:\s|$))/) { 5124dd88ab32SMasahiro Yamada WARN("MISSING_VMLINUX_SYMBOL", 5125dd88ab32SMasahiro Yamada "vmlinux.lds.h needs VMLINUX_SYMBOL() around C-visible symbols\n" . $herecurr); 5126dd88ab32SMasahiro Yamada } 5127dd88ab32SMasahiro Yamada 5128dd88ab32SMasahiro Yamada# check for redundant bracing round if etc 5129dd88ab32SMasahiro Yamada if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) { 5130dd88ab32SMasahiro Yamada my ($level, $endln, @chunks) = 5131dd88ab32SMasahiro Yamada ctx_statement_full($linenr, $realcnt, 1); 5132dd88ab32SMasahiro Yamada #print "chunks<$#chunks> linenr<$linenr> endln<$endln> level<$level>\n"; 5133dd88ab32SMasahiro Yamada #print "APW: <<$chunks[1][0]>><<$chunks[1][1]>>\n"; 5134dd88ab32SMasahiro Yamada if ($#chunks > 0 && $level == 0) { 5135dd88ab32SMasahiro Yamada my @allowed = (); 5136dd88ab32SMasahiro Yamada my $allow = 0; 5137dd88ab32SMasahiro Yamada my $seen = 0; 5138dd88ab32SMasahiro Yamada my $herectx = $here . "\n"; 5139dd88ab32SMasahiro Yamada my $ln = $linenr - 1; 5140dd88ab32SMasahiro Yamada for my $chunk (@chunks) { 5141dd88ab32SMasahiro Yamada my ($cond, $block) = @{$chunk}; 5142dd88ab32SMasahiro Yamada 5143dd88ab32SMasahiro Yamada # If the condition carries leading newlines, then count those as offsets. 5144dd88ab32SMasahiro Yamada my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s); 5145dd88ab32SMasahiro Yamada my $offset = statement_rawlines($whitespace) - 1; 5146dd88ab32SMasahiro Yamada 5147dd88ab32SMasahiro Yamada $allowed[$allow] = 0; 5148dd88ab32SMasahiro Yamada #print "COND<$cond> whitespace<$whitespace> offset<$offset>\n"; 5149dd88ab32SMasahiro Yamada 5150dd88ab32SMasahiro Yamada # We have looked at and allowed this specific line. 5151dd88ab32SMasahiro Yamada $suppress_ifbraces{$ln + $offset} = 1; 5152dd88ab32SMasahiro Yamada 5153dd88ab32SMasahiro Yamada $herectx .= "$rawlines[$ln + $offset]\n[...]\n"; 5154dd88ab32SMasahiro Yamada $ln += statement_rawlines($block) - 1; 5155dd88ab32SMasahiro Yamada 5156dd88ab32SMasahiro Yamada substr($block, 0, length($cond), ''); 5157dd88ab32SMasahiro Yamada 5158dd88ab32SMasahiro Yamada $seen++ if ($block =~ /^\s*{/); 5159dd88ab32SMasahiro Yamada 5160dd88ab32SMasahiro Yamada #print "cond<$cond> block<$block> allowed<$allowed[$allow]>\n"; 5161dd88ab32SMasahiro Yamada if (statement_lines($cond) > 1) { 5162dd88ab32SMasahiro Yamada #print "APW: ALLOWED: cond<$cond>\n"; 5163dd88ab32SMasahiro Yamada $allowed[$allow] = 1; 5164dd88ab32SMasahiro Yamada } 5165dd88ab32SMasahiro Yamada if ($block =~/\b(?:if|for|while)\b/) { 5166dd88ab32SMasahiro Yamada #print "APW: ALLOWED: block<$block>\n"; 5167dd88ab32SMasahiro Yamada $allowed[$allow] = 1; 5168dd88ab32SMasahiro Yamada } 5169dd88ab32SMasahiro Yamada if (statement_block_size($block) > 1) { 5170dd88ab32SMasahiro Yamada #print "APW: ALLOWED: lines block<$block>\n"; 5171dd88ab32SMasahiro Yamada $allowed[$allow] = 1; 5172dd88ab32SMasahiro Yamada } 5173dd88ab32SMasahiro Yamada $allow++; 5174dd88ab32SMasahiro Yamada } 5175dd88ab32SMasahiro Yamada if ($seen) { 5176dd88ab32SMasahiro Yamada my $sum_allowed = 0; 5177dd88ab32SMasahiro Yamada foreach (@allowed) { 5178dd88ab32SMasahiro Yamada $sum_allowed += $_; 5179dd88ab32SMasahiro Yamada } 5180dd88ab32SMasahiro Yamada if ($sum_allowed == 0) { 5181dd88ab32SMasahiro Yamada WARN("BRACES", 5182dd88ab32SMasahiro Yamada "braces {} are not necessary for any arm of this statement\n" . $herectx); 5183dd88ab32SMasahiro Yamada } elsif ($sum_allowed != $allow && 5184dd88ab32SMasahiro Yamada $seen != $allow) { 5185dd88ab32SMasahiro Yamada CHK("BRACES", 5186dd88ab32SMasahiro Yamada "braces {} should be used on all arms of this statement\n" . $herectx); 5187dd88ab32SMasahiro Yamada } 5188dd88ab32SMasahiro Yamada } 5189dd88ab32SMasahiro Yamada } 5190dd88ab32SMasahiro Yamada } 5191dd88ab32SMasahiro Yamada if (!defined $suppress_ifbraces{$linenr - 1} && 5192dd88ab32SMasahiro Yamada $line =~ /\b(if|while|for|else)\b/) { 5193dd88ab32SMasahiro Yamada my $allowed = 0; 5194dd88ab32SMasahiro Yamada 5195dd88ab32SMasahiro Yamada # Check the pre-context. 5196dd88ab32SMasahiro Yamada if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) { 5197dd88ab32SMasahiro Yamada #print "APW: ALLOWED: pre<$1>\n"; 5198dd88ab32SMasahiro Yamada $allowed = 1; 5199dd88ab32SMasahiro Yamada } 5200dd88ab32SMasahiro Yamada 5201dd88ab32SMasahiro Yamada my ($level, $endln, @chunks) = 5202dd88ab32SMasahiro Yamada ctx_statement_full($linenr, $realcnt, $-[0]); 5203dd88ab32SMasahiro Yamada 5204dd88ab32SMasahiro Yamada # Check the condition. 5205dd88ab32SMasahiro Yamada my ($cond, $block) = @{$chunks[0]}; 5206dd88ab32SMasahiro Yamada #print "CHECKING<$linenr> cond<$cond> block<$block>\n"; 5207dd88ab32SMasahiro Yamada if (defined $cond) { 5208dd88ab32SMasahiro Yamada substr($block, 0, length($cond), ''); 5209dd88ab32SMasahiro Yamada } 5210dd88ab32SMasahiro Yamada if (statement_lines($cond) > 1) { 5211dd88ab32SMasahiro Yamada #print "APW: ALLOWED: cond<$cond>\n"; 5212dd88ab32SMasahiro Yamada $allowed = 1; 5213dd88ab32SMasahiro Yamada } 5214dd88ab32SMasahiro Yamada if ($block =~/\b(?:if|for|while)\b/) { 5215dd88ab32SMasahiro Yamada #print "APW: ALLOWED: block<$block>\n"; 5216dd88ab32SMasahiro Yamada $allowed = 1; 5217dd88ab32SMasahiro Yamada } 5218dd88ab32SMasahiro Yamada if (statement_block_size($block) > 1) { 5219dd88ab32SMasahiro Yamada #print "APW: ALLOWED: lines block<$block>\n"; 5220dd88ab32SMasahiro Yamada $allowed = 1; 5221dd88ab32SMasahiro Yamada } 5222dd88ab32SMasahiro Yamada # Check the post-context. 5223dd88ab32SMasahiro Yamada if (defined $chunks[1]) { 5224dd88ab32SMasahiro Yamada my ($cond, $block) = @{$chunks[1]}; 5225dd88ab32SMasahiro Yamada if (defined $cond) { 5226dd88ab32SMasahiro Yamada substr($block, 0, length($cond), ''); 5227dd88ab32SMasahiro Yamada } 5228dd88ab32SMasahiro Yamada if ($block =~ /^\s*\{/) { 5229dd88ab32SMasahiro Yamada #print "APW: ALLOWED: chunk-1 block<$block>\n"; 5230dd88ab32SMasahiro Yamada $allowed = 1; 5231dd88ab32SMasahiro Yamada } 5232dd88ab32SMasahiro Yamada } 5233dd88ab32SMasahiro Yamada if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) { 5234dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($block); 5235*c398f2dfSHeinrich Schuchardt my $herectx = get_stat_here($linenr, $cnt, $here); 5236dd88ab32SMasahiro Yamada 5237dd88ab32SMasahiro Yamada WARN("BRACES", 5238dd88ab32SMasahiro Yamada "braces {} are not necessary for single statement blocks\n" . $herectx); 5239dd88ab32SMasahiro Yamada } 5240dd88ab32SMasahiro Yamada } 5241dd88ab32SMasahiro Yamada 52426305db96SHeinrich Schuchardt# check for single line unbalanced braces 52436305db96SHeinrich Schuchardt if ($sline =~ /^.\s*\}\s*else\s*$/ || 52446305db96SHeinrich Schuchardt $sline =~ /^.\s*else\s*\{\s*$/) { 52456305db96SHeinrich Schuchardt CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr); 52466305db96SHeinrich Schuchardt } 52476305db96SHeinrich Schuchardt 5248dd88ab32SMasahiro Yamada# check for unnecessary blank lines around braces 52496b9709d9STom Rini if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) { 52506305db96SHeinrich Schuchardt if (CHK("BRACES", 52516305db96SHeinrich Schuchardt "Blank lines aren't necessary before a close brace '}'\n" . $hereprev) && 52526305db96SHeinrich Schuchardt $fix && $prevrawline =~ /^\+/) { 52536305db96SHeinrich Schuchardt fix_delete_line($fixlinenr - 1, $prevrawline); 52546305db96SHeinrich Schuchardt } 5255dd88ab32SMasahiro Yamada } 52566b9709d9STom Rini if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) { 52576305db96SHeinrich Schuchardt if (CHK("BRACES", 52586305db96SHeinrich Schuchardt "Blank lines aren't necessary after an open brace '{'\n" . $hereprev) && 52596305db96SHeinrich Schuchardt $fix) { 52606305db96SHeinrich Schuchardt fix_delete_line($fixlinenr, $rawline); 52616305db96SHeinrich Schuchardt } 5262dd88ab32SMasahiro Yamada } 5263dd88ab32SMasahiro Yamada 5264dd88ab32SMasahiro Yamada# no volatiles please 5265dd88ab32SMasahiro Yamada my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b}; 5266dd88ab32SMasahiro Yamada if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) { 5267dd88ab32SMasahiro Yamada WARN("VOLATILE", 52686305db96SHeinrich Schuchardt "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr); 52696305db96SHeinrich Schuchardt } 52706305db96SHeinrich Schuchardt 52716305db96SHeinrich Schuchardt# Check for user-visible strings broken across lines, which breaks the ability 52726305db96SHeinrich Schuchardt# to grep for the string. Make exceptions when the previous string ends in a 52736305db96SHeinrich Schuchardt# newline (multiple lines in one string constant) or '\t', '\r', ';', or '{' 52746305db96SHeinrich Schuchardt# (common in inline assembly) or is a octal \123 or hexadecimal \xaf value 52756305db96SHeinrich Schuchardt if ($line =~ /^\+\s*$String/ && 52766305db96SHeinrich Schuchardt $prevline =~ /"\s*$/ && 52776305db96SHeinrich Schuchardt $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) { 52786305db96SHeinrich Schuchardt if (WARN("SPLIT_STRING", 52796305db96SHeinrich Schuchardt "quoted string split across lines\n" . $hereprev) && 52806305db96SHeinrich Schuchardt $fix && 52816305db96SHeinrich Schuchardt $prevrawline =~ /^\+.*"\s*$/ && 52826305db96SHeinrich Schuchardt $last_coalesced_string_linenr != $linenr - 1) { 52836305db96SHeinrich Schuchardt my $extracted_string = get_quoted_string($line, $rawline); 52846305db96SHeinrich Schuchardt my $comma_close = ""; 52856305db96SHeinrich Schuchardt if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) { 52866305db96SHeinrich Schuchardt $comma_close = $1; 52876305db96SHeinrich Schuchardt } 52886305db96SHeinrich Schuchardt 52896305db96SHeinrich Schuchardt fix_delete_line($fixlinenr - 1, $prevrawline); 52906305db96SHeinrich Schuchardt fix_delete_line($fixlinenr, $rawline); 52916305db96SHeinrich Schuchardt my $fixedline = $prevrawline; 52926305db96SHeinrich Schuchardt $fixedline =~ s/"\s*$//; 52936305db96SHeinrich Schuchardt $fixedline .= substr($extracted_string, 1) . trim($comma_close); 52946305db96SHeinrich Schuchardt fix_insert_line($fixlinenr - 1, $fixedline); 52956305db96SHeinrich Schuchardt $fixedline = $rawline; 52966305db96SHeinrich Schuchardt $fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//; 52976305db96SHeinrich Schuchardt if ($fixedline !~ /\+\s*$/) { 52986305db96SHeinrich Schuchardt fix_insert_line($fixlinenr, $fixedline); 52996305db96SHeinrich Schuchardt } 53006305db96SHeinrich Schuchardt $last_coalesced_string_linenr = $linenr; 53016305db96SHeinrich Schuchardt } 53026305db96SHeinrich Schuchardt } 53036305db96SHeinrich Schuchardt 53046305db96SHeinrich Schuchardt# check for missing a space in a string concatenation 53056305db96SHeinrich Schuchardt if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) { 53066305db96SHeinrich Schuchardt WARN('MISSING_SPACE', 53076305db96SHeinrich Schuchardt "break quoted strings at a space character\n" . $hereprev); 53086305db96SHeinrich Schuchardt } 53096305db96SHeinrich Schuchardt 53106305db96SHeinrich Schuchardt# check for an embedded function name in a string when the function is known 53116305db96SHeinrich Schuchardt# This does not work very well for -f --file checking as it depends on patch 53126305db96SHeinrich Schuchardt# context providing the function name or a single line form for in-file 53136305db96SHeinrich Schuchardt# function declarations 53146305db96SHeinrich Schuchardt if ($line =~ /^\+.*$String/ && 53156305db96SHeinrich Schuchardt defined($context_function) && 53166305db96SHeinrich Schuchardt get_quoted_string($line, $rawline) =~ /\b$context_function\b/ && 53176305db96SHeinrich Schuchardt length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) { 53186305db96SHeinrich Schuchardt WARN("EMBEDDED_FUNCTION_NAME", 53196305db96SHeinrich Schuchardt "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr); 53206305db96SHeinrich Schuchardt } 53216305db96SHeinrich Schuchardt 53226305db96SHeinrich Schuchardt# check for spaces before a quoted newline 53236305db96SHeinrich Schuchardt if ($rawline =~ /^.*\".*\s\\n/) { 53246305db96SHeinrich Schuchardt if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE", 53256305db96SHeinrich Schuchardt "unnecessary whitespace before a quoted newline\n" . $herecurr) && 53266305db96SHeinrich Schuchardt $fix) { 53276305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/; 53286305db96SHeinrich Schuchardt } 53296305db96SHeinrich Schuchardt 53306305db96SHeinrich Schuchardt } 53316305db96SHeinrich Schuchardt 53326305db96SHeinrich Schuchardt# concatenated string without spaces between elements 5333*c398f2dfSHeinrich Schuchardt if ($line =~ /$String[A-Z_]/ || $line =~ /[A-Za-z0-9_]$String/) { 53346305db96SHeinrich Schuchardt CHK("CONCATENATED_STRING", 53356305db96SHeinrich Schuchardt "Concatenated strings should use spaces between elements\n" . $herecurr); 53366305db96SHeinrich Schuchardt } 53376305db96SHeinrich Schuchardt 53386305db96SHeinrich Schuchardt# uncoalesced string fragments 5339*c398f2dfSHeinrich Schuchardt if ($line =~ /$String\s*"/) { 53406305db96SHeinrich Schuchardt WARN("STRING_FRAGMENTS", 53416305db96SHeinrich Schuchardt "Consecutive strings are generally better as a single string\n" . $herecurr); 53426305db96SHeinrich Schuchardt } 53436305db96SHeinrich Schuchardt 53446305db96SHeinrich Schuchardt# check for non-standard and hex prefixed decimal printf formats 53456305db96SHeinrich Schuchardt my $show_L = 1; #don't show the same defect twice 53466305db96SHeinrich Schuchardt my $show_Z = 1; 53476305db96SHeinrich Schuchardt while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) { 53486305db96SHeinrich Schuchardt my $string = substr($rawline, $-[1], $+[1] - $-[1]); 53496305db96SHeinrich Schuchardt $string =~ s/%%/__/g; 53506305db96SHeinrich Schuchardt # check for %L 53516305db96SHeinrich Schuchardt if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) { 53526305db96SHeinrich Schuchardt WARN("PRINTF_L", 53536305db96SHeinrich Schuchardt "\%L$1 is non-standard C, use %ll$1\n" . $herecurr); 53546305db96SHeinrich Schuchardt $show_L = 0; 53556305db96SHeinrich Schuchardt } 53566305db96SHeinrich Schuchardt # check for %Z 53576305db96SHeinrich Schuchardt if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) { 53586305db96SHeinrich Schuchardt WARN("PRINTF_Z", 53596305db96SHeinrich Schuchardt "%Z$1 is non-standard C, use %z$1\n" . $herecurr); 53606305db96SHeinrich Schuchardt $show_Z = 0; 53616305db96SHeinrich Schuchardt } 53626305db96SHeinrich Schuchardt # check for 0x<decimal> 53636305db96SHeinrich Schuchardt if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) { 53646305db96SHeinrich Schuchardt ERROR("PRINTF_0XDECIMAL", 53656305db96SHeinrich Schuchardt "Prefixing 0x with decimal output is defective\n" . $herecurr); 53666305db96SHeinrich Schuchardt } 53676305db96SHeinrich Schuchardt } 53686305db96SHeinrich Schuchardt 53696305db96SHeinrich Schuchardt# check for line continuations in quoted strings with odd counts of " 5370*c398f2dfSHeinrich Schuchardt if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) { 53716305db96SHeinrich Schuchardt WARN("LINE_CONTINUATIONS", 53726305db96SHeinrich Schuchardt "Avoid line continuations in quoted strings\n" . $herecurr); 5373dd88ab32SMasahiro Yamada } 5374dd88ab32SMasahiro Yamada 5375dd88ab32SMasahiro Yamada# warn about #if 0 5376dd88ab32SMasahiro Yamada if ($line =~ /^.\s*\#\s*if\s+0\b/) { 5377dd88ab32SMasahiro Yamada CHK("REDUNDANT_CODE", 5378dd88ab32SMasahiro Yamada "if this code is redundant consider removing it\n" . 5379dd88ab32SMasahiro Yamada $herecurr); 5380dd88ab32SMasahiro Yamada } 5381dd88ab32SMasahiro Yamada 5382dd88ab32SMasahiro Yamada# check for needless "if (<foo>) fn(<foo>)" uses 5383dd88ab32SMasahiro Yamada if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) { 53846305db96SHeinrich Schuchardt my $tested = quotemeta($1); 53856305db96SHeinrich Schuchardt my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;'; 53866305db96SHeinrich Schuchardt if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) { 53876305db96SHeinrich Schuchardt my $func = $1; 53886305db96SHeinrich Schuchardt if (WARN('NEEDLESS_IF', 53896305db96SHeinrich Schuchardt "$func(NULL) is safe and this check is probably not required\n" . $hereprev) && 53906305db96SHeinrich Schuchardt $fix) { 53916305db96SHeinrich Schuchardt my $do_fix = 1; 53926305db96SHeinrich Schuchardt my $leading_tabs = ""; 53936305db96SHeinrich Schuchardt my $new_leading_tabs = ""; 53946305db96SHeinrich Schuchardt if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) { 53956305db96SHeinrich Schuchardt $leading_tabs = $1; 53966305db96SHeinrich Schuchardt } else { 53976305db96SHeinrich Schuchardt $do_fix = 0; 53986305db96SHeinrich Schuchardt } 53996305db96SHeinrich Schuchardt if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) { 54006305db96SHeinrich Schuchardt $new_leading_tabs = $1; 54016305db96SHeinrich Schuchardt if (length($leading_tabs) + 1 ne length($new_leading_tabs)) { 54026305db96SHeinrich Schuchardt $do_fix = 0; 54036305db96SHeinrich Schuchardt } 54046305db96SHeinrich Schuchardt } else { 54056305db96SHeinrich Schuchardt $do_fix = 0; 54066305db96SHeinrich Schuchardt } 54076305db96SHeinrich Schuchardt if ($do_fix) { 54086305db96SHeinrich Schuchardt fix_delete_line($fixlinenr - 1, $prevrawline); 54096305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/; 54106305db96SHeinrich Schuchardt } 54116305db96SHeinrich Schuchardt } 54126305db96SHeinrich Schuchardt } 54136305db96SHeinrich Schuchardt } 54146305db96SHeinrich Schuchardt 54156305db96SHeinrich Schuchardt# check for unnecessary "Out of Memory" messages 54166305db96SHeinrich Schuchardt if ($line =~ /^\+.*\b$logFunctions\s*\(/ && 54176305db96SHeinrich Schuchardt $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ && 54186305db96SHeinrich Schuchardt (defined $1 || defined $3) && 54196305db96SHeinrich Schuchardt $linenr > 3) { 54206305db96SHeinrich Schuchardt my $testval = $2; 54216305db96SHeinrich Schuchardt my $testline = $lines[$linenr - 3]; 54226305db96SHeinrich Schuchardt 54236305db96SHeinrich Schuchardt my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0); 54246305db96SHeinrich Schuchardt# print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n"); 54256305db96SHeinrich Schuchardt 54266305db96SHeinrich Schuchardt if ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|kmemdup|(?:dev_)?alloc_skb)/) { 54276305db96SHeinrich Schuchardt WARN("OOM_MESSAGE", 54286305db96SHeinrich Schuchardt "Possible unnecessary 'out of memory' message\n" . $hereprev); 54296305db96SHeinrich Schuchardt } 54306305db96SHeinrich Schuchardt } 54316305db96SHeinrich Schuchardt 54326305db96SHeinrich Schuchardt# check for logging functions with KERN_<LEVEL> 54336305db96SHeinrich Schuchardt if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ && 54346305db96SHeinrich Schuchardt $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) { 54356305db96SHeinrich Schuchardt my $level = $1; 54366305db96SHeinrich Schuchardt if (WARN("UNNECESSARY_KERN_LEVEL", 54376305db96SHeinrich Schuchardt "Possible unnecessary $level\n" . $herecurr) && 54386305db96SHeinrich Schuchardt $fix) { 54396305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\s*$level\s*//; 54406305db96SHeinrich Schuchardt } 54416305db96SHeinrich Schuchardt } 54426305db96SHeinrich Schuchardt 54436305db96SHeinrich Schuchardt# check for logging continuations 54446305db96SHeinrich Schuchardt if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) { 54456305db96SHeinrich Schuchardt WARN("LOGGING_CONTINUATION", 54466305db96SHeinrich Schuchardt "Avoid logging continuation uses where feasible\n" . $herecurr); 54476305db96SHeinrich Schuchardt } 54486305db96SHeinrich Schuchardt 54496305db96SHeinrich Schuchardt# check for mask then right shift without a parentheses 54506305db96SHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 54516305db96SHeinrich Schuchardt $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ && 54526305db96SHeinrich Schuchardt $4 !~ /^\&/) { # $LvalOrFunc may be &foo, ignore if so 54536305db96SHeinrich Schuchardt WARN("MASK_THEN_SHIFT", 54546305db96SHeinrich Schuchardt "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr); 54556305db96SHeinrich Schuchardt } 54566305db96SHeinrich Schuchardt 54576305db96SHeinrich Schuchardt# check for pointer comparisons to NULL 54586305db96SHeinrich Schuchardt if ($^V && $^V ge 5.10.0) { 54596305db96SHeinrich Schuchardt while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) { 54606305db96SHeinrich Schuchardt my $val = $1; 54616305db96SHeinrich Schuchardt my $equal = "!"; 54626305db96SHeinrich Schuchardt $equal = "" if ($4 eq "!="); 54636305db96SHeinrich Schuchardt if (CHK("COMPARISON_TO_NULL", 54646305db96SHeinrich Schuchardt "Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) && 54656305db96SHeinrich Schuchardt $fix) { 54666305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/; 54676305db96SHeinrich Schuchardt } 5468dd88ab32SMasahiro Yamada } 5469dd88ab32SMasahiro Yamada } 5470dd88ab32SMasahiro Yamada 54716b9709d9STom Rini# check for bad placement of section $InitAttribute (e.g.: __initdata) 54726b9709d9STom Rini if ($line =~ /(\b$InitAttribute\b)/) { 54736b9709d9STom Rini my $attr = $1; 54746b9709d9STom Rini if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) { 54756b9709d9STom Rini my $ptr = $1; 54766b9709d9STom Rini my $var = $2; 54776b9709d9STom Rini if ((($ptr =~ /\b(union|struct)\s+$attr\b/ && 54786b9709d9STom Rini ERROR("MISPLACED_INIT", 54796b9709d9STom Rini "$attr should be placed after $var\n" . $herecurr)) || 54806b9709d9STom Rini ($ptr !~ /\b(union|struct)\s+$attr\b/ && 54816b9709d9STom Rini WARN("MISPLACED_INIT", 54826b9709d9STom Rini "$attr should be placed after $var\n" . $herecurr))) && 54836b9709d9STom Rini $fix) { 54846305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e; 54856b9709d9STom Rini } 54866b9709d9STom Rini } 54876b9709d9STom Rini } 54886b9709d9STom Rini 54896b9709d9STom Rini# check for $InitAttributeData (ie: __initdata) with const 54906b9709d9STom Rini if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) { 54916b9709d9STom Rini my $attr = $1; 54926b9709d9STom Rini $attr =~ /($InitAttributePrefix)(.*)/; 54936b9709d9STom Rini my $attr_prefix = $1; 54946b9709d9STom Rini my $attr_type = $2; 54956b9709d9STom Rini if (ERROR("INIT_ATTRIBUTE", 54966b9709d9STom Rini "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) && 54976b9709d9STom Rini $fix) { 54986305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 54996b9709d9STom Rini s/$InitAttributeData/${attr_prefix}initconst/; 55006b9709d9STom Rini } 55016b9709d9STom Rini } 55026b9709d9STom Rini 55036b9709d9STom Rini# check for $InitAttributeConst (ie: __initconst) without const 55046b9709d9STom Rini if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) { 55056b9709d9STom Rini my $attr = $1; 55066b9709d9STom Rini if (ERROR("INIT_ATTRIBUTE", 55076b9709d9STom Rini "Use of $attr requires a separate use of const\n" . $herecurr) && 55086b9709d9STom Rini $fix) { 55096305db96SHeinrich Schuchardt my $lead = $fixed[$fixlinenr] =~ 55106b9709d9STom Rini /(^\+\s*(?:static\s+))/; 55116b9709d9STom Rini $lead = rtrim($1); 55126b9709d9STom Rini $lead = "$lead " if ($lead !~ /^\+$/); 55136b9709d9STom Rini $lead = "${lead}const "; 55146305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/; 55156305db96SHeinrich Schuchardt } 55166305db96SHeinrich Schuchardt } 55176305db96SHeinrich Schuchardt 55186305db96SHeinrich Schuchardt# check for __read_mostly with const non-pointer (should just be const) 55196305db96SHeinrich Schuchardt if ($line =~ /\b__read_mostly\b/ && 55206305db96SHeinrich Schuchardt $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) { 55216305db96SHeinrich Schuchardt if (ERROR("CONST_READ_MOSTLY", 55226305db96SHeinrich Schuchardt "Invalid use of __read_mostly with const type\n" . $herecurr) && 55236305db96SHeinrich Schuchardt $fix) { 55246305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\s+__read_mostly\b//; 55256305db96SHeinrich Schuchardt } 55266305db96SHeinrich Schuchardt } 55276305db96SHeinrich Schuchardt 55286305db96SHeinrich Schuchardt# don't use __constant_<foo> functions outside of include/uapi/ 55296305db96SHeinrich Schuchardt if ($realfile !~ m@^include/uapi/@ && 55306305db96SHeinrich Schuchardt $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) { 55316305db96SHeinrich Schuchardt my $constant_func = $1; 55326305db96SHeinrich Schuchardt my $func = $constant_func; 55336305db96SHeinrich Schuchardt $func =~ s/^__constant_//; 55346305db96SHeinrich Schuchardt if (WARN("CONSTANT_CONVERSION", 55356305db96SHeinrich Schuchardt "$constant_func should be $func\n" . $herecurr) && 55366305db96SHeinrich Schuchardt $fix) { 55376305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g; 55386b9709d9STom Rini } 55396b9709d9STom Rini } 55406b9709d9STom Rini 5541dd88ab32SMasahiro Yamada# prefer usleep_range over udelay 5542dd88ab32SMasahiro Yamada if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) { 55436305db96SHeinrich Schuchardt my $delay = $1; 5544dd88ab32SMasahiro Yamada # ignore udelay's < 10, however 55456305db96SHeinrich Schuchardt if (! ($delay < 10) ) { 5546dd88ab32SMasahiro Yamada CHK("USLEEP_RANGE", 55476305db96SHeinrich Schuchardt "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr); 55486305db96SHeinrich Schuchardt } 55496305db96SHeinrich Schuchardt if ($delay > 2000) { 55506305db96SHeinrich Schuchardt WARN("LONG_UDELAY", 55516305db96SHeinrich Schuchardt "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr); 5552dd88ab32SMasahiro Yamada } 5553dd88ab32SMasahiro Yamada } 5554dd88ab32SMasahiro Yamada 5555dd88ab32SMasahiro Yamada# warn about unexpectedly long msleep's 5556dd88ab32SMasahiro Yamada if ($line =~ /\bmsleep\s*\((\d+)\);/) { 5557dd88ab32SMasahiro Yamada if ($1 < 20) { 5558dd88ab32SMasahiro Yamada WARN("MSLEEP", 55596305db96SHeinrich Schuchardt "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr); 5560dd88ab32SMasahiro Yamada } 5561dd88ab32SMasahiro Yamada } 5562dd88ab32SMasahiro Yamada 55636b9709d9STom Rini# check for comparisons of jiffies 55646b9709d9STom Rini if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) { 55656b9709d9STom Rini WARN("JIFFIES_COMPARISON", 55666b9709d9STom Rini "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr); 55676b9709d9STom Rini } 55686b9709d9STom Rini 55696b9709d9STom Rini# check for comparisons of get_jiffies_64() 55706b9709d9STom Rini if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) { 55716b9709d9STom Rini WARN("JIFFIES_COMPARISON", 55726b9709d9STom Rini "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr); 55736b9709d9STom Rini } 55746b9709d9STom Rini 5575dd88ab32SMasahiro Yamada# warn about #ifdefs in C files 5576dd88ab32SMasahiro Yamada# if ($line =~ /^.\s*\#\s*if(|n)def/ && ($realfile =~ /\.c$/)) { 5577dd88ab32SMasahiro Yamada# print "#ifdef in C files should be avoided\n"; 5578dd88ab32SMasahiro Yamada# print "$herecurr"; 5579dd88ab32SMasahiro Yamada# $clean = 0; 5580dd88ab32SMasahiro Yamada# } 5581dd88ab32SMasahiro Yamada 5582dd88ab32SMasahiro Yamada# warn about spacing in #ifdefs 5583dd88ab32SMasahiro Yamada if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) { 55846b9709d9STom Rini if (ERROR("SPACING", 55856b9709d9STom Rini "exactly one space required after that #$1\n" . $herecurr) && 55866b9709d9STom Rini $fix) { 55876305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ 55886b9709d9STom Rini s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /; 55896b9709d9STom Rini } 55906b9709d9STom Rini 5591dd88ab32SMasahiro Yamada } 5592dd88ab32SMasahiro Yamada 5593dd88ab32SMasahiro Yamada# check for spinlock_t definitions without a comment. 5594dd88ab32SMasahiro Yamada if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ || 5595dd88ab32SMasahiro Yamada $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) { 5596dd88ab32SMasahiro Yamada my $which = $1; 5597dd88ab32SMasahiro Yamada if (!ctx_has_comment($first_line, $linenr)) { 5598dd88ab32SMasahiro Yamada CHK("UNCOMMENTED_DEFINITION", 5599dd88ab32SMasahiro Yamada "$1 definition without comment\n" . $herecurr); 5600dd88ab32SMasahiro Yamada } 5601dd88ab32SMasahiro Yamada } 5602dd88ab32SMasahiro Yamada# check for memory barriers without a comment. 56036305db96SHeinrich Schuchardt 56046305db96SHeinrich Schuchardt my $barriers = qr{ 56056305db96SHeinrich Schuchardt mb| 56066305db96SHeinrich Schuchardt rmb| 56076305db96SHeinrich Schuchardt wmb| 56086305db96SHeinrich Schuchardt read_barrier_depends 56096305db96SHeinrich Schuchardt }x; 56106305db96SHeinrich Schuchardt my $barrier_stems = qr{ 56116305db96SHeinrich Schuchardt mb__before_atomic| 56126305db96SHeinrich Schuchardt mb__after_atomic| 56136305db96SHeinrich Schuchardt store_release| 56146305db96SHeinrich Schuchardt load_acquire| 56156305db96SHeinrich Schuchardt store_mb| 56166305db96SHeinrich Schuchardt (?:$barriers) 56176305db96SHeinrich Schuchardt }x; 56186305db96SHeinrich Schuchardt my $all_barriers = qr{ 56196305db96SHeinrich Schuchardt (?:$barriers)| 56206305db96SHeinrich Schuchardt smp_(?:$barrier_stems)| 56216305db96SHeinrich Schuchardt virt_(?:$barrier_stems) 56226305db96SHeinrich Schuchardt }x; 56236305db96SHeinrich Schuchardt 56246305db96SHeinrich Schuchardt if ($line =~ /\b(?:$all_barriers)\s*\(/) { 5625dd88ab32SMasahiro Yamada if (!ctx_has_comment($first_line, $linenr)) { 56266b9709d9STom Rini WARN("MEMORY_BARRIER", 5627dd88ab32SMasahiro Yamada "memory barrier without comment\n" . $herecurr); 5628dd88ab32SMasahiro Yamada } 5629dd88ab32SMasahiro Yamada } 56306305db96SHeinrich Schuchardt 56316305db96SHeinrich Schuchardt my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x; 56326305db96SHeinrich Schuchardt 56336305db96SHeinrich Schuchardt if ($realfile !~ m@^include/asm-generic/@ && 56346305db96SHeinrich Schuchardt $realfile !~ m@/barrier\.h$@ && 56356305db96SHeinrich Schuchardt $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ && 56366305db96SHeinrich Schuchardt $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) { 56376305db96SHeinrich Schuchardt WARN("MEMORY_BARRIER", 56386305db96SHeinrich Schuchardt "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr); 56396305db96SHeinrich Schuchardt } 56406305db96SHeinrich Schuchardt 56416305db96SHeinrich Schuchardt# check for waitqueue_active without a comment. 56426305db96SHeinrich Schuchardt if ($line =~ /\bwaitqueue_active\s*\(/) { 56436305db96SHeinrich Schuchardt if (!ctx_has_comment($first_line, $linenr)) { 56446305db96SHeinrich Schuchardt WARN("WAITQUEUE_ACTIVE", 56456305db96SHeinrich Schuchardt "waitqueue_active without comment\n" . $herecurr); 56466305db96SHeinrich Schuchardt } 56476305db96SHeinrich Schuchardt } 56486305db96SHeinrich Schuchardt 5649*c398f2dfSHeinrich Schuchardt# check for smp_read_barrier_depends and read_barrier_depends 5650*c398f2dfSHeinrich Schuchardt if (!$file && $line =~ /\b(smp_|)read_barrier_depends\s*\(/) { 5651*c398f2dfSHeinrich Schuchardt WARN("READ_BARRIER_DEPENDS", 5652*c398f2dfSHeinrich Schuchardt "$1read_barrier_depends should only be used in READ_ONCE or DEC Alpha code\n" . $herecurr); 5653*c398f2dfSHeinrich Schuchardt } 5654*c398f2dfSHeinrich Schuchardt 5655dd88ab32SMasahiro Yamada# check of hardware specific defines 5656dd88ab32SMasahiro Yamada if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) { 5657dd88ab32SMasahiro Yamada CHK("ARCH_DEFINES", 5658dd88ab32SMasahiro Yamada "architecture specific defines should be avoided\n" . $herecurr); 5659dd88ab32SMasahiro Yamada } 5660dd88ab32SMasahiro Yamada 56616305db96SHeinrich Schuchardt# check that the storage class is not after a type 56626305db96SHeinrich Schuchardt if ($line =~ /\b($Type)\s+($Storage)\b/) { 5663dd88ab32SMasahiro Yamada WARN("STORAGE_CLASS", 56646305db96SHeinrich Schuchardt "storage class '$2' should be located before type '$1'\n" . $herecurr); 56656305db96SHeinrich Schuchardt } 56666305db96SHeinrich Schuchardt# Check that the storage class is at the beginning of a declaration 56676305db96SHeinrich Schuchardt if ($line =~ /\b$Storage\b/ && 56686305db96SHeinrich Schuchardt $line !~ /^.\s*$Storage/ && 56696305db96SHeinrich Schuchardt $line =~ /^.\s*(.+?)\$Storage\s/ && 56706305db96SHeinrich Schuchardt $1 !~ /[\,\)]\s*$/) { 56716305db96SHeinrich Schuchardt WARN("STORAGE_CLASS", 56726305db96SHeinrich Schuchardt "storage class should be at the beginning of the declaration\n" . $herecurr); 5673dd88ab32SMasahiro Yamada } 5674dd88ab32SMasahiro Yamada 5675dd88ab32SMasahiro Yamada# check the location of the inline attribute, that it is between 5676dd88ab32SMasahiro Yamada# storage class and type. 5677dd88ab32SMasahiro Yamada if ($line =~ /\b$Type\s+$Inline\b/ || 5678dd88ab32SMasahiro Yamada $line =~ /\b$Inline\s+$Storage\b/) { 5679dd88ab32SMasahiro Yamada ERROR("INLINE_LOCATION", 5680dd88ab32SMasahiro Yamada "inline keyword should sit between storage class and type\n" . $herecurr); 5681dd88ab32SMasahiro Yamada } 5682dd88ab32SMasahiro Yamada 5683dd88ab32SMasahiro Yamada# Check for __inline__ and __inline, prefer inline 56846b9709d9STom Rini if ($realfile !~ m@\binclude/uapi/@ && 56856b9709d9STom Rini $line =~ /\b(__inline__|__inline)\b/) { 56866b9709d9STom Rini if (WARN("INLINE", 56876b9709d9STom Rini "plain inline is preferred over $1\n" . $herecurr) && 56886b9709d9STom Rini $fix) { 56896305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/; 56906b9709d9STom Rini 56916b9709d9STom Rini } 5692dd88ab32SMasahiro Yamada } 5693dd88ab32SMasahiro Yamada 5694dd88ab32SMasahiro Yamada# Check for __attribute__ packed, prefer __packed 56956b9709d9STom Rini if ($realfile !~ m@\binclude/uapi/@ && 56966b9709d9STom Rini $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) { 5697dd88ab32SMasahiro Yamada WARN("PREFER_PACKED", 5698dd88ab32SMasahiro Yamada "__packed is preferred over __attribute__((packed))\n" . $herecurr); 5699dd88ab32SMasahiro Yamada } 5700dd88ab32SMasahiro Yamada 57015c761ce5SHeinrich Schuchardt# Check for new packed members, warn to use care 57025c761ce5SHeinrich Schuchardt if ($realfile !~ m@\binclude/uapi/@ && 57035c761ce5SHeinrich Schuchardt $line =~ /\b(__attribute__\s*\(\s*\(.*\bpacked|__packed)\b/) { 57045c761ce5SHeinrich Schuchardt WARN("NEW_PACKED", 57055c761ce5SHeinrich Schuchardt "Adding new packed members is to be done with care\n" . $herecurr); 57065c761ce5SHeinrich Schuchardt } 57075c761ce5SHeinrich Schuchardt 5708dd88ab32SMasahiro Yamada# Check for __attribute__ aligned, prefer __aligned 57096b9709d9STom Rini if ($realfile !~ m@\binclude/uapi/@ && 57106b9709d9STom Rini $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) { 5711dd88ab32SMasahiro Yamada WARN("PREFER_ALIGNED", 5712dd88ab32SMasahiro Yamada "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr); 5713dd88ab32SMasahiro Yamada } 5714dd88ab32SMasahiro Yamada 5715dd88ab32SMasahiro Yamada# Check for __attribute__ format(printf, prefer __printf 57166b9709d9STom Rini if ($realfile !~ m@\binclude/uapi/@ && 57176b9709d9STom Rini $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) { 57186b9709d9STom Rini if (WARN("PREFER_PRINTF", 57196b9709d9STom Rini "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) && 57206b9709d9STom Rini $fix) { 57216305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex; 57226b9709d9STom Rini 57236b9709d9STom Rini } 5724dd88ab32SMasahiro Yamada } 5725dd88ab32SMasahiro Yamada 5726dd88ab32SMasahiro Yamada# Check for __attribute__ format(scanf, prefer __scanf 57276b9709d9STom Rini if ($realfile !~ m@\binclude/uapi/@ && 57286b9709d9STom Rini $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) { 57296b9709d9STom Rini if (WARN("PREFER_SCANF", 57306b9709d9STom Rini "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) && 57316b9709d9STom Rini $fix) { 57326305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex; 57336305db96SHeinrich Schuchardt } 57346305db96SHeinrich Schuchardt } 57356305db96SHeinrich Schuchardt 57366305db96SHeinrich Schuchardt# Check for __attribute__ weak, or __weak declarations (may have link issues) 57376305db96SHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 57386305db96SHeinrich Schuchardt $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ && 57396305db96SHeinrich Schuchardt ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ || 57406305db96SHeinrich Schuchardt $line =~ /\b__weak\b/)) { 57416305db96SHeinrich Schuchardt ERROR("WEAK_DECLARATION", 57426305db96SHeinrich Schuchardt "Using weak declarations can have unintended link defects\n" . $herecurr); 57436305db96SHeinrich Schuchardt } 57446305db96SHeinrich Schuchardt 57456305db96SHeinrich Schuchardt# check for c99 types like uint8_t used outside of uapi/ and tools/ 57466305db96SHeinrich Schuchardt if ($realfile !~ m@\binclude/uapi/@ && 57476305db96SHeinrich Schuchardt $realfile !~ m@\btools/@ && 57486305db96SHeinrich Schuchardt $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) { 57496305db96SHeinrich Schuchardt my $type = $1; 57506305db96SHeinrich Schuchardt if ($type =~ /\b($typeC99Typedefs)\b/) { 57516305db96SHeinrich Schuchardt $type = $1; 57526305db96SHeinrich Schuchardt my $kernel_type = 'u'; 57536305db96SHeinrich Schuchardt $kernel_type = 's' if ($type =~ /^_*[si]/); 57546305db96SHeinrich Schuchardt $type =~ /(\d+)/; 57556305db96SHeinrich Schuchardt $kernel_type .= $1; 57566305db96SHeinrich Schuchardt if (CHK("PREFER_KERNEL_TYPES", 57576305db96SHeinrich Schuchardt "Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) && 57586305db96SHeinrich Schuchardt $fix) { 57596305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/; 57606305db96SHeinrich Schuchardt } 57616305db96SHeinrich Schuchardt } 57626305db96SHeinrich Schuchardt } 57636305db96SHeinrich Schuchardt 57646305db96SHeinrich Schuchardt# check for cast of C90 native int or longer types constants 57656305db96SHeinrich Schuchardt if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) { 57666305db96SHeinrich Schuchardt my $cast = $1; 57676305db96SHeinrich Schuchardt my $const = $2; 57686305db96SHeinrich Schuchardt if (WARN("TYPECAST_INT_CONSTANT", 57696305db96SHeinrich Schuchardt "Unnecessary typecast of c90 int constant\n" . $herecurr) && 57706305db96SHeinrich Schuchardt $fix) { 57716305db96SHeinrich Schuchardt my $suffix = ""; 57726305db96SHeinrich Schuchardt my $newconst = $const; 57736305db96SHeinrich Schuchardt $newconst =~ s/${Int_type}$//; 57746305db96SHeinrich Schuchardt $suffix .= 'U' if ($cast =~ /\bunsigned\b/); 57756305db96SHeinrich Schuchardt if ($cast =~ /\blong\s+long\b/) { 57766305db96SHeinrich Schuchardt $suffix .= 'LL'; 57776305db96SHeinrich Schuchardt } elsif ($cast =~ /\blong\b/) { 57786305db96SHeinrich Schuchardt $suffix .= 'L'; 57796305db96SHeinrich Schuchardt } 57806305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/; 57816b9709d9STom Rini } 5782dd88ab32SMasahiro Yamada } 5783dd88ab32SMasahiro Yamada 5784dd88ab32SMasahiro Yamada# check for sizeof(&) 5785dd88ab32SMasahiro Yamada if ($line =~ /\bsizeof\s*\(\s*\&/) { 5786dd88ab32SMasahiro Yamada WARN("SIZEOF_ADDRESS", 5787dd88ab32SMasahiro Yamada "sizeof(& should be avoided\n" . $herecurr); 5788dd88ab32SMasahiro Yamada } 5789dd88ab32SMasahiro Yamada 5790dd88ab32SMasahiro Yamada# check for sizeof without parenthesis 5791dd88ab32SMasahiro Yamada if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) { 57926b9709d9STom Rini if (WARN("SIZEOF_PARENTHESIS", 57936b9709d9STom Rini "sizeof $1 should be sizeof($1)\n" . $herecurr) && 57946b9709d9STom Rini $fix) { 57956305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex; 57966b9709d9STom Rini } 5797dd88ab32SMasahiro Yamada } 5798dd88ab32SMasahiro Yamada 5799dd88ab32SMasahiro Yamada# check for struct spinlock declarations 5800dd88ab32SMasahiro Yamada if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) { 5801dd88ab32SMasahiro Yamada WARN("USE_SPINLOCK_T", 5802dd88ab32SMasahiro Yamada "struct spinlock should be spinlock_t\n" . $herecurr); 5803dd88ab32SMasahiro Yamada } 5804dd88ab32SMasahiro Yamada 58056b9709d9STom Rini# check for seq_printf uses that could be seq_puts 58066b9709d9STom Rini if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) { 58076b9709d9STom Rini my $fmt = get_quoted_string($line, $rawline); 58086305db96SHeinrich Schuchardt $fmt =~ s/%%//g; 58096305db96SHeinrich Schuchardt if ($fmt !~ /%/) { 58106b9709d9STom Rini if (WARN("PREFER_SEQ_PUTS", 58116b9709d9STom Rini "Prefer seq_puts to seq_printf\n" . $herecurr) && 58126b9709d9STom Rini $fix) { 58136305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/; 58146b9709d9STom Rini } 58156b9709d9STom Rini } 58166b9709d9STom Rini } 58176b9709d9STom Rini 58186305db96SHeinrich Schuchardt# check for vsprintf extension %p<foo> misuses 58196305db96SHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 58206305db96SHeinrich Schuchardt defined $stat && 58216305db96SHeinrich Schuchardt $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s && 58226305db96SHeinrich Schuchardt $1 !~ /^_*volatile_*$/) { 5823*c398f2dfSHeinrich Schuchardt my $specifier; 5824*c398f2dfSHeinrich Schuchardt my $extension; 5825*c398f2dfSHeinrich Schuchardt my $bad_specifier = ""; 5826*c398f2dfSHeinrich Schuchardt my $stat_real; 5827*c398f2dfSHeinrich Schuchardt 58286305db96SHeinrich Schuchardt my $lc = $stat =~ tr@\n@@; 58296305db96SHeinrich Schuchardt $lc = $lc + $linenr; 58306305db96SHeinrich Schuchardt for (my $count = $linenr; $count <= $lc; $count++) { 58316305db96SHeinrich Schuchardt my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0)); 58326305db96SHeinrich Schuchardt $fmt =~ s/%%//g; 5833*c398f2dfSHeinrich Schuchardt 5834*c398f2dfSHeinrich Schuchardt while ($fmt =~ /(\%[\*\d\.]*p(\w))/g) { 5835*c398f2dfSHeinrich Schuchardt $specifier = $1; 5836*c398f2dfSHeinrich Schuchardt $extension = $2; 5837*c398f2dfSHeinrich Schuchardt if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOx]/) { 5838*c398f2dfSHeinrich Schuchardt $bad_specifier = $specifier; 58396305db96SHeinrich Schuchardt last; 58406305db96SHeinrich Schuchardt } 5841*c398f2dfSHeinrich Schuchardt if ($extension eq "x" && !defined($stat_real)) { 5842*c398f2dfSHeinrich Schuchardt if (!defined($stat_real)) { 5843*c398f2dfSHeinrich Schuchardt $stat_real = get_stat_real($linenr, $lc); 58446305db96SHeinrich Schuchardt } 5845*c398f2dfSHeinrich Schuchardt WARN("VSPRINTF_SPECIFIER_PX", 5846*c398f2dfSHeinrich Schuchardt "Using vsprintf specifier '\%px' potentially exposes the kernel memory layout, if you don't really need the address please consider using '\%p'.\n" . "$here\n$stat_real\n"); 58476305db96SHeinrich Schuchardt } 5848*c398f2dfSHeinrich Schuchardt } 5849*c398f2dfSHeinrich Schuchardt if ($bad_specifier ne "") { 5850*c398f2dfSHeinrich Schuchardt my $stat_real = get_stat_real($linenr, $lc); 5851*c398f2dfSHeinrich Schuchardt my $ext_type = "Invalid"; 5852*c398f2dfSHeinrich Schuchardt my $use = ""; 5853*c398f2dfSHeinrich Schuchardt if ($bad_specifier =~ /p[Ff]/) { 5854*c398f2dfSHeinrich Schuchardt $ext_type = "Deprecated"; 5855*c398f2dfSHeinrich Schuchardt $use = " - use %pS instead"; 5856*c398f2dfSHeinrich Schuchardt $use =~ s/pS/ps/ if ($bad_specifier =~ /pf/); 5857*c398f2dfSHeinrich Schuchardt } 5858*c398f2dfSHeinrich Schuchardt 58596305db96SHeinrich Schuchardt WARN("VSPRINTF_POINTER_EXTENSION", 5860*c398f2dfSHeinrich Schuchardt "$ext_type vsprintf pointer extension '$bad_specifier'$use\n" . "$here\n$stat_real\n"); 5861*c398f2dfSHeinrich Schuchardt } 58626305db96SHeinrich Schuchardt } 58636305db96SHeinrich Schuchardt } 58646305db96SHeinrich Schuchardt 5865dd88ab32SMasahiro Yamada# Check for misused memsets 5866dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 5867dd88ab32SMasahiro Yamada defined $stat && 58686305db96SHeinrich Schuchardt $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) { 5869dd88ab32SMasahiro Yamada 5870dd88ab32SMasahiro Yamada my $ms_addr = $2; 5871dd88ab32SMasahiro Yamada my $ms_val = $7; 5872dd88ab32SMasahiro Yamada my $ms_size = $12; 5873dd88ab32SMasahiro Yamada 5874dd88ab32SMasahiro Yamada if ($ms_size =~ /^(0x|)0$/i) { 5875dd88ab32SMasahiro Yamada ERROR("MEMSET", 5876dd88ab32SMasahiro Yamada "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n"); 5877dd88ab32SMasahiro Yamada } elsif ($ms_size =~ /^(0x|)1$/i) { 5878dd88ab32SMasahiro Yamada WARN("MEMSET", 5879dd88ab32SMasahiro Yamada "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n"); 5880dd88ab32SMasahiro Yamada } 5881dd88ab32SMasahiro Yamada } 5882dd88ab32SMasahiro Yamada 58836b9709d9STom Rini# Check for memcpy(foo, bar, ETH_ALEN) that could be ether_addr_copy(foo, bar) 58846305db96SHeinrich Schuchardt# if ($^V && $^V ge 5.10.0 && 58856305db96SHeinrich Schuchardt# defined $stat && 58866305db96SHeinrich Schuchardt# $stat =~ /^\+(?:.*?)\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) { 58876305db96SHeinrich Schuchardt# if (WARN("PREFER_ETHER_ADDR_COPY", 58886305db96SHeinrich Schuchardt# "Prefer ether_addr_copy() over memcpy() if the Ethernet addresses are __aligned(2)\n" . "$here\n$stat\n") && 58896305db96SHeinrich Schuchardt# $fix) { 58906305db96SHeinrich Schuchardt# $fixed[$fixlinenr] =~ s/\bmemcpy\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/ether_addr_copy($2, $7)/; 58916305db96SHeinrich Schuchardt# } 58926305db96SHeinrich Schuchardt# } 58936305db96SHeinrich Schuchardt 58946305db96SHeinrich Schuchardt# Check for memcmp(foo, bar, ETH_ALEN) that could be ether_addr_equal*(foo, bar) 58956305db96SHeinrich Schuchardt# if ($^V && $^V ge 5.10.0 && 58966305db96SHeinrich Schuchardt# defined $stat && 58976305db96SHeinrich Schuchardt# $stat =~ /^\+(?:.*?)\bmemcmp\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) { 58986305db96SHeinrich Schuchardt# WARN("PREFER_ETHER_ADDR_EQUAL", 58996305db96SHeinrich Schuchardt# "Prefer ether_addr_equal() or ether_addr_equal_unaligned() over memcmp()\n" . "$here\n$stat\n") 59006305db96SHeinrich Schuchardt# } 59016305db96SHeinrich Schuchardt 59026305db96SHeinrich Schuchardt# check for memset(foo, 0x0, ETH_ALEN) that could be eth_zero_addr 59036305db96SHeinrich Schuchardt# check for memset(foo, 0xFF, ETH_ALEN) that could be eth_broadcast_addr 59046305db96SHeinrich Schuchardt# if ($^V && $^V ge 5.10.0 && 59056305db96SHeinrich Schuchardt# defined $stat && 59066305db96SHeinrich Schuchardt# $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*ETH_ALEN\s*\)/) { 59076305db96SHeinrich Schuchardt# 59086305db96SHeinrich Schuchardt# my $ms_val = $7; 59096305db96SHeinrich Schuchardt# 59106305db96SHeinrich Schuchardt# if ($ms_val =~ /^(?:0x|)0+$/i) { 59116305db96SHeinrich Schuchardt# if (WARN("PREFER_ETH_ZERO_ADDR", 59126305db96SHeinrich Schuchardt# "Prefer eth_zero_addr over memset()\n" . "$here\n$stat\n") && 59136305db96SHeinrich Schuchardt# $fix) { 59146305db96SHeinrich Schuchardt# $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_zero_addr($2)/; 59156305db96SHeinrich Schuchardt# } 59166305db96SHeinrich Schuchardt# } elsif ($ms_val =~ /^(?:0xff|255)$/i) { 59176305db96SHeinrich Schuchardt# if (WARN("PREFER_ETH_BROADCAST_ADDR", 59186305db96SHeinrich Schuchardt# "Prefer eth_broadcast_addr() over memset()\n" . "$here\n$stat\n") && 59196305db96SHeinrich Schuchardt# $fix) { 59206305db96SHeinrich Schuchardt# $fixed[$fixlinenr] =~ s/\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*,\s*ETH_ALEN\s*\)/eth_broadcast_addr($2)/; 59216305db96SHeinrich Schuchardt# } 59226305db96SHeinrich Schuchardt# } 59236305db96SHeinrich Schuchardt# } 59246b9709d9STom Rini 5925dd88ab32SMasahiro Yamada# typecasts on min/max could be min_t/max_t 5926dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 5927dd88ab32SMasahiro Yamada defined $stat && 5928dd88ab32SMasahiro Yamada $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) { 5929dd88ab32SMasahiro Yamada if (defined $2 || defined $7) { 5930dd88ab32SMasahiro Yamada my $call = $1; 5931dd88ab32SMasahiro Yamada my $cast1 = deparenthesize($2); 5932dd88ab32SMasahiro Yamada my $arg1 = $3; 5933dd88ab32SMasahiro Yamada my $cast2 = deparenthesize($7); 5934dd88ab32SMasahiro Yamada my $arg2 = $8; 5935dd88ab32SMasahiro Yamada my $cast; 5936dd88ab32SMasahiro Yamada 5937dd88ab32SMasahiro Yamada if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) { 5938dd88ab32SMasahiro Yamada $cast = "$cast1 or $cast2"; 5939dd88ab32SMasahiro Yamada } elsif ($cast1 ne "") { 5940dd88ab32SMasahiro Yamada $cast = $cast1; 5941dd88ab32SMasahiro Yamada } else { 5942dd88ab32SMasahiro Yamada $cast = $cast2; 5943dd88ab32SMasahiro Yamada } 5944dd88ab32SMasahiro Yamada WARN("MINMAX", 5945dd88ab32SMasahiro Yamada "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n"); 5946dd88ab32SMasahiro Yamada } 5947dd88ab32SMasahiro Yamada } 5948dd88ab32SMasahiro Yamada 5949dd88ab32SMasahiro Yamada# check usleep_range arguments 5950dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 5951dd88ab32SMasahiro Yamada defined $stat && 5952dd88ab32SMasahiro Yamada $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) { 5953dd88ab32SMasahiro Yamada my $min = $1; 5954dd88ab32SMasahiro Yamada my $max = $7; 5955dd88ab32SMasahiro Yamada if ($min eq $max) { 5956dd88ab32SMasahiro Yamada WARN("USLEEP_RANGE", 5957dd88ab32SMasahiro Yamada "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n"); 5958dd88ab32SMasahiro Yamada } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ && 5959dd88ab32SMasahiro Yamada $min > $max) { 5960dd88ab32SMasahiro Yamada WARN("USLEEP_RANGE", 5961dd88ab32SMasahiro Yamada "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n"); 5962dd88ab32SMasahiro Yamada } 5963dd88ab32SMasahiro Yamada } 5964dd88ab32SMasahiro Yamada 59656b9709d9STom Rini# check for naked sscanf 59666b9709d9STom Rini if ($^V && $^V ge 5.10.0 && 59676b9709d9STom Rini defined $stat && 59686305db96SHeinrich Schuchardt $line =~ /\bsscanf\b/ && 59696b9709d9STom Rini ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ && 59706b9709d9STom Rini $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ && 59716b9709d9STom Rini $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) { 59726b9709d9STom Rini my $lc = $stat =~ tr@\n@@; 59736b9709d9STom Rini $lc = $lc + $linenr; 5974*c398f2dfSHeinrich Schuchardt my $stat_real = get_stat_real($linenr, $lc); 59756b9709d9STom Rini WARN("NAKED_SSCANF", 59766b9709d9STom Rini "unchecked sscanf return value\n" . "$here\n$stat_real\n"); 59776b9709d9STom Rini } 59786b9709d9STom Rini 59796305db96SHeinrich Schuchardt# check for simple sscanf that should be kstrto<foo> 59806305db96SHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 59816305db96SHeinrich Schuchardt defined $stat && 59826305db96SHeinrich Schuchardt $line =~ /\bsscanf\b/) { 59836305db96SHeinrich Schuchardt my $lc = $stat =~ tr@\n@@; 59846305db96SHeinrich Schuchardt $lc = $lc + $linenr; 5985*c398f2dfSHeinrich Schuchardt my $stat_real = get_stat_real($linenr, $lc); 59866305db96SHeinrich Schuchardt if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) { 59876305db96SHeinrich Schuchardt my $format = $6; 59886305db96SHeinrich Schuchardt my $count = $format =~ tr@%@%@; 59896305db96SHeinrich Schuchardt if ($count == 1 && 59906305db96SHeinrich Schuchardt $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) { 59916305db96SHeinrich Schuchardt WARN("SSCANF_TO_KSTRTO", 59926305db96SHeinrich Schuchardt "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n"); 59936305db96SHeinrich Schuchardt } 59946305db96SHeinrich Schuchardt } 59956305db96SHeinrich Schuchardt } 59966305db96SHeinrich Schuchardt 59976b9709d9STom Rini# check for new externs in .h files. 59986b9709d9STom Rini if ($realfile =~ /\.h$/ && 59996b9709d9STom Rini $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) { 60006b9709d9STom Rini if (CHK("AVOID_EXTERNS", 60016b9709d9STom Rini "extern prototypes should be avoided in .h files\n" . $herecurr) && 60026b9709d9STom Rini $fix) { 60036305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/; 60046b9709d9STom Rini } 60056b9709d9STom Rini } 60066b9709d9STom Rini 6007dd88ab32SMasahiro Yamada# check for new externs in .c files. 6008dd88ab32SMasahiro Yamada if ($realfile =~ /\.c$/ && defined $stat && 6009dd88ab32SMasahiro Yamada $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s) 6010dd88ab32SMasahiro Yamada { 6011dd88ab32SMasahiro Yamada my $function_name = $1; 6012dd88ab32SMasahiro Yamada my $paren_space = $2; 6013dd88ab32SMasahiro Yamada 6014dd88ab32SMasahiro Yamada my $s = $stat; 6015dd88ab32SMasahiro Yamada if (defined $cond) { 6016dd88ab32SMasahiro Yamada substr($s, 0, length($cond), ''); 6017dd88ab32SMasahiro Yamada } 6018dd88ab32SMasahiro Yamada if ($s =~ /^\s*;/ && 6019dd88ab32SMasahiro Yamada $function_name ne 'uninitialized_var') 6020dd88ab32SMasahiro Yamada { 6021dd88ab32SMasahiro Yamada WARN("AVOID_EXTERNS", 6022dd88ab32SMasahiro Yamada "externs should be avoided in .c files\n" . $herecurr); 6023dd88ab32SMasahiro Yamada } 6024dd88ab32SMasahiro Yamada 6025dd88ab32SMasahiro Yamada if ($paren_space =~ /\n/) { 6026dd88ab32SMasahiro Yamada WARN("FUNCTION_ARGUMENTS", 6027dd88ab32SMasahiro Yamada "arguments for function declarations should follow identifier\n" . $herecurr); 6028dd88ab32SMasahiro Yamada } 6029dd88ab32SMasahiro Yamada 6030dd88ab32SMasahiro Yamada } elsif ($realfile =~ /\.c$/ && defined $stat && 6031dd88ab32SMasahiro Yamada $stat =~ /^.\s*extern\s+/) 6032dd88ab32SMasahiro Yamada { 6033dd88ab32SMasahiro Yamada WARN("AVOID_EXTERNS", 6034dd88ab32SMasahiro Yamada "externs should be avoided in .c files\n" . $herecurr); 6035dd88ab32SMasahiro Yamada } 6036dd88ab32SMasahiro Yamada 60376305db96SHeinrich Schuchardt# check for function declarations that have arguments without identifier names 60386305db96SHeinrich Schuchardt if (defined $stat && 6039*c398f2dfSHeinrich Schuchardt $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s && 60406305db96SHeinrich Schuchardt $1 ne "void") { 60416305db96SHeinrich Schuchardt my $args = trim($1); 60426305db96SHeinrich Schuchardt while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) { 60436305db96SHeinrich Schuchardt my $arg = trim($1); 60446305db96SHeinrich Schuchardt if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) { 60456305db96SHeinrich Schuchardt WARN("FUNCTION_ARGUMENTS", 60466305db96SHeinrich Schuchardt "function definition argument '$arg' should also have an identifier name\n" . $herecurr); 60476305db96SHeinrich Schuchardt } 60486305db96SHeinrich Schuchardt } 60496305db96SHeinrich Schuchardt } 60506305db96SHeinrich Schuchardt 60516305db96SHeinrich Schuchardt# check for function definitions 60526305db96SHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 60536305db96SHeinrich Schuchardt defined $stat && 60546305db96SHeinrich Schuchardt $stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) { 60556305db96SHeinrich Schuchardt $context_function = $1; 60566305db96SHeinrich Schuchardt 60576305db96SHeinrich Schuchardt# check for multiline function definition with misplaced open brace 60586305db96SHeinrich Schuchardt my $ok = 0; 60596305db96SHeinrich Schuchardt my $cnt = statement_rawlines($stat); 60606305db96SHeinrich Schuchardt my $herectx = $here . "\n"; 60616305db96SHeinrich Schuchardt for (my $n = 0; $n < $cnt; $n++) { 60626305db96SHeinrich Schuchardt my $rl = raw_line($linenr, $n); 60636305db96SHeinrich Schuchardt $herectx .= $rl . "\n"; 60646305db96SHeinrich Schuchardt $ok = 1 if ($rl =~ /^[ \+]\{/); 60656305db96SHeinrich Schuchardt $ok = 1 if ($rl =~ /\{/ && $n == 0); 60666305db96SHeinrich Schuchardt last if $rl =~ /^[ \+].*\{/; 60676305db96SHeinrich Schuchardt } 60686305db96SHeinrich Schuchardt if (!$ok) { 60696305db96SHeinrich Schuchardt ERROR("OPEN_BRACE", 60706305db96SHeinrich Schuchardt "open brace '{' following function definitions go on the next line\n" . $herectx); 60716305db96SHeinrich Schuchardt } 60726305db96SHeinrich Schuchardt } 60736305db96SHeinrich Schuchardt 6074dd88ab32SMasahiro Yamada# checks for new __setup's 6075dd88ab32SMasahiro Yamada if ($rawline =~ /\b__setup\("([^"]*)"/) { 6076dd88ab32SMasahiro Yamada my $name = $1; 6077dd88ab32SMasahiro Yamada 6078dd88ab32SMasahiro Yamada if (!grep(/$name/, @setup_docs)) { 6079dd88ab32SMasahiro Yamada CHK("UNDOCUMENTED_SETUP", 60806305db96SHeinrich Schuchardt "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.rst\n" . $herecurr); 6081dd88ab32SMasahiro Yamada } 6082dd88ab32SMasahiro Yamada } 6083dd88ab32SMasahiro Yamada 6084dd88ab32SMasahiro Yamada# check for pointless casting of kmalloc return 6085dd88ab32SMasahiro Yamada if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) { 6086dd88ab32SMasahiro Yamada WARN("UNNECESSARY_CASTS", 6087dd88ab32SMasahiro Yamada "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr); 6088dd88ab32SMasahiro Yamada } 6089dd88ab32SMasahiro Yamada 60906b9709d9STom Rini# alloc style 60916b9709d9STom Rini# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...) 60926b9709d9STom Rini if ($^V && $^V ge 5.10.0 && 60936b9709d9STom Rini $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) { 60946b9709d9STom Rini CHK("ALLOC_SIZEOF_STRUCT", 60956b9709d9STom Rini "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr); 60966b9709d9STom Rini } 60976b9709d9STom Rini 60986305db96SHeinrich Schuchardt# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc 60996305db96SHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 61006305db96SHeinrich Schuchardt defined $stat && 61016305db96SHeinrich Schuchardt $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) { 61026305db96SHeinrich Schuchardt my $oldfunc = $3; 61036305db96SHeinrich Schuchardt my $a1 = $4; 61046305db96SHeinrich Schuchardt my $a2 = $10; 61056305db96SHeinrich Schuchardt my $newfunc = "kmalloc_array"; 61066305db96SHeinrich Schuchardt $newfunc = "kcalloc" if ($oldfunc eq "kzalloc"); 61076305db96SHeinrich Schuchardt my $r1 = $a1; 61086305db96SHeinrich Schuchardt my $r2 = $a2; 61096305db96SHeinrich Schuchardt if ($a1 =~ /^sizeof\s*\S/) { 61106305db96SHeinrich Schuchardt $r1 = $a2; 61116305db96SHeinrich Schuchardt $r2 = $a1; 61126305db96SHeinrich Schuchardt } 61136305db96SHeinrich Schuchardt if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ && 61146305db96SHeinrich Schuchardt !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) { 61156305db96SHeinrich Schuchardt my $cnt = statement_rawlines($stat); 6116*c398f2dfSHeinrich Schuchardt my $herectx = get_stat_here($linenr, $cnt, $here); 6117*c398f2dfSHeinrich Schuchardt 61186305db96SHeinrich Schuchardt if (WARN("ALLOC_WITH_MULTIPLY", 61196305db96SHeinrich Schuchardt "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) && 61206305db96SHeinrich Schuchardt $cnt == 1 && 61216305db96SHeinrich Schuchardt $fix) { 61226305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e; 61236305db96SHeinrich Schuchardt } 61246305db96SHeinrich Schuchardt } 61256305db96SHeinrich Schuchardt } 61266305db96SHeinrich Schuchardt 61276b9709d9STom Rini# check for krealloc arg reuse 61286b9709d9STom Rini if ($^V && $^V ge 5.10.0 && 61296b9709d9STom Rini $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) { 61306b9709d9STom Rini WARN("KREALLOC_ARG_REUSE", 61316b9709d9STom Rini "Reusing the krealloc arg is almost always a bug\n" . $herecurr); 61326b9709d9STom Rini } 61336b9709d9STom Rini 6134dd88ab32SMasahiro Yamada# check for alloc argument mismatch 6135dd88ab32SMasahiro Yamada if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) { 6136dd88ab32SMasahiro Yamada WARN("ALLOC_ARRAY_ARGS", 6137dd88ab32SMasahiro Yamada "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr); 6138dd88ab32SMasahiro Yamada } 6139dd88ab32SMasahiro Yamada 6140dd88ab32SMasahiro Yamada# check for multiple semicolons 6141dd88ab32SMasahiro Yamada if ($line =~ /;\s*;\s*$/) { 61426b9709d9STom Rini if (WARN("ONE_SEMICOLON", 61436b9709d9STom Rini "Statements terminations use 1 semicolon\n" . $herecurr) && 61446b9709d9STom Rini $fix) { 61456305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g; 61466305db96SHeinrich Schuchardt } 61476305db96SHeinrich Schuchardt } 61486305db96SHeinrich Schuchardt 61496305db96SHeinrich Schuchardt# check for #defines like: 1 << <digit> that could be BIT(digit), it is not exported to uapi 61506305db96SHeinrich Schuchardt if ($realfile !~ m@^include/uapi/@ && 61516305db96SHeinrich Schuchardt $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) { 61526305db96SHeinrich Schuchardt my $ull = ""; 61536305db96SHeinrich Schuchardt $ull = "_ULL" if (defined($1) && $1 =~ /ll/i); 61546305db96SHeinrich Schuchardt if (CHK("BIT_MACRO", 61556305db96SHeinrich Schuchardt "Prefer using the BIT$ull macro\n" . $herecurr) && 61566305db96SHeinrich Schuchardt $fix) { 61576305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/; 61586305db96SHeinrich Schuchardt } 61596305db96SHeinrich Schuchardt } 61606305db96SHeinrich Schuchardt 61616305db96SHeinrich Schuchardt# check for #if defined CONFIG_<FOO> || defined CONFIG_<FOO>_MODULE 61626305db96SHeinrich Schuchardt if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) { 61636305db96SHeinrich Schuchardt my $config = $1; 61646305db96SHeinrich Schuchardt if (WARN("PREFER_IS_ENABLED", 61656305db96SHeinrich Schuchardt "Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE\n" . $herecurr) && 61666305db96SHeinrich Schuchardt $fix) { 61676305db96SHeinrich Schuchardt $fixed[$fixlinenr] = "\+#if IS_ENABLED($config)"; 61686b9709d9STom Rini } 61696b9709d9STom Rini } 61706b9709d9STom Rini 6171fc0b5948SRobert P. J. Day# check for case / default statements not preceded by break/fallthrough/switch 61726b9709d9STom Rini if ($line =~ /^.\s*(?:case\s+(?:$Ident|$Constant)\s*|default):/) { 61736b9709d9STom Rini my $has_break = 0; 61746b9709d9STom Rini my $has_statement = 0; 61756b9709d9STom Rini my $count = 0; 61766b9709d9STom Rini my $prevline = $linenr; 61776305db96SHeinrich Schuchardt while ($prevline > 1 && ($file || $count < 3) && !$has_break) { 61786b9709d9STom Rini $prevline--; 61796b9709d9STom Rini my $rline = $rawlines[$prevline - 1]; 61806b9709d9STom Rini my $fline = $lines[$prevline - 1]; 61816b9709d9STom Rini last if ($fline =~ /^\@\@/); 61826b9709d9STom Rini next if ($fline =~ /^\-/); 61836b9709d9STom Rini next if ($fline =~ /^.(?:\s*(?:case\s+(?:$Ident|$Constant)[\s$;]*|default):[\s$;]*)*$/); 61846b9709d9STom Rini $has_break = 1 if ($rline =~ /fall[\s_-]*(through|thru)/i); 61856b9709d9STom Rini next if ($fline =~ /^.[\s$;]*$/); 61866b9709d9STom Rini $has_statement = 1; 61876b9709d9STom Rini $count++; 6188*c398f2dfSHeinrich Schuchardt $has_break = 1 if ($fline =~ /\bswitch\b|\b(?:break\s*;[\s$;]*$|exit\s*\(\b|return\b|goto\b|continue\b)/); 61896b9709d9STom Rini } 61906b9709d9STom Rini if (!$has_break && $has_statement) { 61916b9709d9STom Rini WARN("MISSING_BREAK", 6192fc0b5948SRobert P. J. Day "Possible switch case/default not preceded by break or fallthrough comment\n" . $herecurr); 61936b9709d9STom Rini } 6194dd88ab32SMasahiro Yamada } 6195dd88ab32SMasahiro Yamada 6196dd88ab32SMasahiro Yamada# check for switch/default statements without a break; 6197dd88ab32SMasahiro Yamada if ($^V && $^V ge 5.10.0 && 6198dd88ab32SMasahiro Yamada defined $stat && 6199dd88ab32SMasahiro Yamada $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) { 6200dd88ab32SMasahiro Yamada my $cnt = statement_rawlines($stat); 6201*c398f2dfSHeinrich Schuchardt my $herectx = get_stat_here($linenr, $cnt, $here); 6202*c398f2dfSHeinrich Schuchardt 6203dd88ab32SMasahiro Yamada WARN("DEFAULT_NO_BREAK", 6204dd88ab32SMasahiro Yamada "switch default: should use break\n" . $herectx); 6205dd88ab32SMasahiro Yamada } 6206dd88ab32SMasahiro Yamada 6207dd88ab32SMasahiro Yamada# check for gcc specific __FUNCTION__ 62086b9709d9STom Rini if ($line =~ /\b__FUNCTION__\b/) { 62096b9709d9STom Rini if (WARN("USE_FUNC", 62106b9709d9STom Rini "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) && 62116b9709d9STom Rini $fix) { 62126305db96SHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g; 62136b9709d9STom Rini } 6214dd88ab32SMasahiro Yamada } 6215dd88ab32SMasahiro Yamada 62166305db96SHeinrich Schuchardt# check for uses of __DATE__, __TIME__, __TIMESTAMP__ 62176305db96SHeinrich Schuchardt while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) { 62186305db96SHeinrich Schuchardt ERROR("DATE_TIME", 62196305db96SHeinrich Schuchardt "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr); 62206305db96SHeinrich Schuchardt } 62216305db96SHeinrich Schuchardt 6222dd88ab32SMasahiro Yamada# check for use of yield() 6223dd88ab32SMasahiro Yamada if ($line =~ /\byield\s*\(\s*\)/) { 6224dd88ab32SMasahiro Yamada WARN("YIELD", 6225dd88ab32SMasahiro Yamada "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr); 6226dd88ab32SMasahiro Yamada } 6227dd88ab32SMasahiro Yamada 62286b9709d9STom Rini# check for comparisons against true and false 62296b9709d9STom Rini if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) { 62306b9709d9STom Rini my $lead = $1; 62316b9709d9STom Rini my $arg = $2; 62326b9709d9STom Rini my $test = $3; 62336b9709d9STom Rini my $otype = $4; 62346b9709d9STom Rini my $trail = $5; 62356b9709d9STom Rini my $op = "!"; 62366b9709d9STom Rini 62376b9709d9STom Rini ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i); 62386b9709d9STom Rini 62396b9709d9STom Rini my $type = lc($otype); 62406b9709d9STom Rini if ($type =~ /^(?:true|false)$/) { 62416b9709d9STom Rini if (("$test" eq "==" && "$type" eq "true") || 62426b9709d9STom Rini ("$test" eq "!=" && "$type" eq "false")) { 62436b9709d9STom Rini $op = ""; 62446b9709d9STom Rini } 62456b9709d9STom Rini 62466b9709d9STom Rini CHK("BOOL_COMPARISON", 62476b9709d9STom Rini "Using comparison to $otype is error prone\n" . $herecurr); 62486b9709d9STom Rini 62496b9709d9STom Rini## maybe suggesting a correct construct would better 62506b9709d9STom Rini## "Using comparison to $otype is error prone. Perhaps use '${lead}${op}${arg}${trail}'\n" . $herecurr); 62516b9709d9STom Rini 62526b9709d9STom Rini } 62536b9709d9STom Rini } 62546b9709d9STom Rini 6255dd88ab32SMasahiro Yamada# check for semaphores initialized locked 6256dd88ab32SMasahiro Yamada if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) { 6257dd88ab32SMasahiro Yamada WARN("CONSIDER_COMPLETION", 6258dd88ab32SMasahiro Yamada "consider using a completion\n" . $herecurr); 6259dd88ab32SMasahiro Yamada } 6260dd88ab32SMasahiro Yamada 6261dd88ab32SMasahiro Yamada# recommend kstrto* over simple_strto* and strict_strto* 6262dd88ab32SMasahiro Yamada if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) { 6263dd88ab32SMasahiro Yamada WARN("CONSIDER_KSTRTO", 6264dd88ab32SMasahiro Yamada "$1 is obsolete, use k$3 instead\n" . $herecurr); 6265dd88ab32SMasahiro Yamada } 6266dd88ab32SMasahiro Yamada 62676305db96SHeinrich Schuchardt# check for __initcall(), use device_initcall() explicitly or more appropriate function please 6268dd88ab32SMasahiro Yamada if ($line =~ /^.\s*__initcall\s*\(/) { 6269dd88ab32SMasahiro Yamada WARN("USE_DEVICE_INITCALL", 62706305db96SHeinrich Schuchardt "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr); 6271dd88ab32SMasahiro Yamada } 6272dd88ab32SMasahiro Yamada 62736305db96SHeinrich Schuchardt# check for various structs that are normally const (ops, kgdb, device_tree) 62746305db96SHeinrich Schuchardt# and avoid what seem like struct definitions 'struct foo {' 6275dd88ab32SMasahiro Yamada if ($line !~ /\bconst\b/ && 62766305db96SHeinrich Schuchardt $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) { 6277dd88ab32SMasahiro Yamada WARN("CONST_STRUCT", 62786305db96SHeinrich Schuchardt "struct $1 should normally be const\n" . $herecurr); 6279dd88ab32SMasahiro Yamada } 6280dd88ab32SMasahiro Yamada 6281dd88ab32SMasahiro Yamada# use of NR_CPUS is usually wrong 6282dd88ab32SMasahiro Yamada# ignore definitions of NR_CPUS and usage to define arrays as likely right 6283dd88ab32SMasahiro Yamada if ($line =~ /\bNR_CPUS\b/ && 6284dd88ab32SMasahiro Yamada $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ && 6285dd88ab32SMasahiro Yamada $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ && 6286dd88ab32SMasahiro Yamada $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ && 6287dd88ab32SMasahiro Yamada $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ && 6288dd88ab32SMasahiro Yamada $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/) 6289dd88ab32SMasahiro Yamada { 6290dd88ab32SMasahiro Yamada WARN("NR_CPUS", 6291dd88ab32SMasahiro Yamada "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr); 6292dd88ab32SMasahiro Yamada } 6293dd88ab32SMasahiro Yamada 62946b9709d9STom Rini# Use of __ARCH_HAS_<FOO> or ARCH_HAVE_<BAR> is wrong. 62956b9709d9STom Rini if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) { 62966b9709d9STom Rini ERROR("DEFINE_ARCH_HAS", 62976b9709d9STom Rini "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr); 62986b9709d9STom Rini } 62996b9709d9STom Rini 63006305db96SHeinrich Schuchardt# likely/unlikely comparisons similar to "(likely(foo) > 0)" 63016305db96SHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 63026305db96SHeinrich Schuchardt $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) { 63036305db96SHeinrich Schuchardt WARN("LIKELY_MISUSE", 63046305db96SHeinrich Schuchardt "Using $1 should generally have parentheses around the comparison\n" . $herecurr); 6305dd88ab32SMasahiro Yamada } 6306dd88ab32SMasahiro Yamada 6307dd88ab32SMasahiro Yamada# whine mightly about in_atomic 6308dd88ab32SMasahiro Yamada if ($line =~ /\bin_atomic\s*\(/) { 6309dd88ab32SMasahiro Yamada if ($realfile =~ m@^drivers/@) { 6310dd88ab32SMasahiro Yamada ERROR("IN_ATOMIC", 6311dd88ab32SMasahiro Yamada "do not use in_atomic in drivers\n" . $herecurr); 6312dd88ab32SMasahiro Yamada } elsif ($realfile !~ m@^kernel/@) { 6313dd88ab32SMasahiro Yamada WARN("IN_ATOMIC", 6314dd88ab32SMasahiro Yamada "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr); 6315dd88ab32SMasahiro Yamada } 6316dd88ab32SMasahiro Yamada } 6317dd88ab32SMasahiro Yamada 63186305db96SHeinrich Schuchardt# check for mutex_trylock_recursive usage 63196305db96SHeinrich Schuchardt if ($line =~ /mutex_trylock_recursive/) { 63206305db96SHeinrich Schuchardt ERROR("LOCKING", 63216305db96SHeinrich Schuchardt "recursive locking is bad, do not use this ever.\n" . $herecurr); 63226305db96SHeinrich Schuchardt } 63236305db96SHeinrich Schuchardt 6324dd88ab32SMasahiro Yamada# check for lockdep_set_novalidate_class 6325dd88ab32SMasahiro Yamada if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ || 6326dd88ab32SMasahiro Yamada $line =~ /__lockdep_no_validate__\s*\)/ ) { 6327dd88ab32SMasahiro Yamada if ($realfile !~ m@^kernel/lockdep@ && 6328dd88ab32SMasahiro Yamada $realfile !~ m@^include/linux/lockdep@ && 6329dd88ab32SMasahiro Yamada $realfile !~ m@^drivers/base/core@) { 6330dd88ab32SMasahiro Yamada ERROR("LOCKDEP", 6331dd88ab32SMasahiro Yamada "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr); 6332dd88ab32SMasahiro Yamada } 6333dd88ab32SMasahiro Yamada } 6334dd88ab32SMasahiro Yamada 63356305db96SHeinrich Schuchardt if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ || 63366305db96SHeinrich Schuchardt $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) { 6337dd88ab32SMasahiro Yamada WARN("EXPORTED_WORLD_WRITABLE", 6338dd88ab32SMasahiro Yamada "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr); 6339dd88ab32SMasahiro Yamada } 63406305db96SHeinrich Schuchardt 6341*c398f2dfSHeinrich Schuchardt# check for DEVICE_ATTR uses that could be DEVICE_ATTR_<FOO> 6342*c398f2dfSHeinrich Schuchardt# and whether or not function naming is typical and if 6343*c398f2dfSHeinrich Schuchardt# DEVICE_ATTR permissions uses are unusual too 6344*c398f2dfSHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 6345*c398f2dfSHeinrich Schuchardt defined $stat && 6346*c398f2dfSHeinrich Schuchardt $stat =~ /\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?\s*(\s*(?:${multi_mode_perms_string_search}|0[0-7]{3,3})\s*)\s*\)?\s*,\s*(\w+)\s*,\s*(\w+)\s*\)/) { 6347*c398f2dfSHeinrich Schuchardt my $var = $1; 6348*c398f2dfSHeinrich Schuchardt my $perms = $2; 6349*c398f2dfSHeinrich Schuchardt my $show = $3; 6350*c398f2dfSHeinrich Schuchardt my $store = $4; 6351*c398f2dfSHeinrich Schuchardt my $octal_perms = perms_to_octal($perms); 6352*c398f2dfSHeinrich Schuchardt if ($show =~ /^${var}_show$/ && 6353*c398f2dfSHeinrich Schuchardt $store =~ /^${var}_store$/ && 6354*c398f2dfSHeinrich Schuchardt $octal_perms eq "0644") { 6355*c398f2dfSHeinrich Schuchardt if (WARN("DEVICE_ATTR_RW", 6356*c398f2dfSHeinrich Schuchardt "Use DEVICE_ATTR_RW\n" . $herecurr) && 6357*c398f2dfSHeinrich Schuchardt $fix) { 6358*c398f2dfSHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/; 6359*c398f2dfSHeinrich Schuchardt } 6360*c398f2dfSHeinrich Schuchardt } elsif ($show =~ /^${var}_show$/ && 6361*c398f2dfSHeinrich Schuchardt $store =~ /^NULL$/ && 6362*c398f2dfSHeinrich Schuchardt $octal_perms eq "0444") { 6363*c398f2dfSHeinrich Schuchardt if (WARN("DEVICE_ATTR_RO", 6364*c398f2dfSHeinrich Schuchardt "Use DEVICE_ATTR_RO\n" . $herecurr) && 6365*c398f2dfSHeinrich Schuchardt $fix) { 6366*c398f2dfSHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/; 6367*c398f2dfSHeinrich Schuchardt } 6368*c398f2dfSHeinrich Schuchardt } elsif ($show =~ /^NULL$/ && 6369*c398f2dfSHeinrich Schuchardt $store =~ /^${var}_store$/ && 6370*c398f2dfSHeinrich Schuchardt $octal_perms eq "0200") { 6371*c398f2dfSHeinrich Schuchardt if (WARN("DEVICE_ATTR_WO", 6372*c398f2dfSHeinrich Schuchardt "Use DEVICE_ATTR_WO\n" . $herecurr) && 6373*c398f2dfSHeinrich Schuchardt $fix) { 6374*c398f2dfSHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/; 6375*c398f2dfSHeinrich Schuchardt } 6376*c398f2dfSHeinrich Schuchardt } elsif ($octal_perms eq "0644" || 6377*c398f2dfSHeinrich Schuchardt $octal_perms eq "0444" || 6378*c398f2dfSHeinrich Schuchardt $octal_perms eq "0200") { 6379*c398f2dfSHeinrich Schuchardt my $newshow = "$show"; 6380*c398f2dfSHeinrich Schuchardt $newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show"); 6381*c398f2dfSHeinrich Schuchardt my $newstore = $store; 6382*c398f2dfSHeinrich Schuchardt $newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store"); 6383*c398f2dfSHeinrich Schuchardt my $rename = ""; 6384*c398f2dfSHeinrich Schuchardt if ($show ne $newshow) { 6385*c398f2dfSHeinrich Schuchardt $rename .= " '$show' to '$newshow'"; 6386*c398f2dfSHeinrich Schuchardt } 6387*c398f2dfSHeinrich Schuchardt if ($store ne $newstore) { 6388*c398f2dfSHeinrich Schuchardt $rename .= " '$store' to '$newstore'"; 6389*c398f2dfSHeinrich Schuchardt } 6390*c398f2dfSHeinrich Schuchardt WARN("DEVICE_ATTR_FUNCTIONS", 6391*c398f2dfSHeinrich Schuchardt "Consider renaming function(s)$rename\n" . $herecurr); 6392*c398f2dfSHeinrich Schuchardt } else { 6393*c398f2dfSHeinrich Schuchardt WARN("DEVICE_ATTR_PERMS", 6394*c398f2dfSHeinrich Schuchardt "DEVICE_ATTR unusual permissions '$perms' used\n" . $herecurr); 6395*c398f2dfSHeinrich Schuchardt } 6396*c398f2dfSHeinrich Schuchardt } 6397*c398f2dfSHeinrich Schuchardt 63986305db96SHeinrich Schuchardt# Mode permission misuses where it seems decimal should be octal 63996305db96SHeinrich Schuchardt# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop 6400*c398f2dfSHeinrich Schuchardt# o Ignore module_param*(...) uses with a decimal 0 permission as that has a 6401*c398f2dfSHeinrich Schuchardt# specific definition of not visible in sysfs. 6402*c398f2dfSHeinrich Schuchardt# o Ignore proc_create*(...) uses with a decimal 0 permission as that means 6403*c398f2dfSHeinrich Schuchardt# use the default permissions 64046305db96SHeinrich Schuchardt if ($^V && $^V ge 5.10.0 && 64056305db96SHeinrich Schuchardt defined $stat && 64066305db96SHeinrich Schuchardt $line =~ /$mode_perms_search/) { 64076305db96SHeinrich Schuchardt foreach my $entry (@mode_permission_funcs) { 64086305db96SHeinrich Schuchardt my $func = $entry->[0]; 64096305db96SHeinrich Schuchardt my $arg_pos = $entry->[1]; 64106305db96SHeinrich Schuchardt 64116305db96SHeinrich Schuchardt my $lc = $stat =~ tr@\n@@; 64126305db96SHeinrich Schuchardt $lc = $lc + $linenr; 6413*c398f2dfSHeinrich Schuchardt my $stat_real = get_stat_real($linenr, $lc); 64146305db96SHeinrich Schuchardt 64156305db96SHeinrich Schuchardt my $skip_args = ""; 64166305db96SHeinrich Schuchardt if ($arg_pos > 1) { 64176305db96SHeinrich Schuchardt $arg_pos--; 64186305db96SHeinrich Schuchardt $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}"; 64196305db96SHeinrich Schuchardt } 64206305db96SHeinrich Schuchardt my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]"; 64216305db96SHeinrich Schuchardt if ($stat =~ /$test/) { 64226305db96SHeinrich Schuchardt my $val = $1; 64236305db96SHeinrich Schuchardt $val = $6 if ($skip_args ne ""); 6424*c398f2dfSHeinrich Schuchardt if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") && 6425*c398f2dfSHeinrich Schuchardt (($val =~ /^$Int$/ && $val !~ /^$Octal$/) || 6426*c398f2dfSHeinrich Schuchardt ($val =~ /^$Octal$/ && length($val) ne 4))) { 64276305db96SHeinrich Schuchardt ERROR("NON_OCTAL_PERMISSIONS", 64286305db96SHeinrich Schuchardt "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real); 64296305db96SHeinrich Schuchardt } 64306305db96SHeinrich Schuchardt if ($val =~ /^$Octal$/ && (oct($val) & 02)) { 64316305db96SHeinrich Schuchardt ERROR("EXPORTED_WORLD_WRITABLE", 64326305db96SHeinrich Schuchardt "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real); 64336305db96SHeinrich Schuchardt } 64346305db96SHeinrich Schuchardt } 64356305db96SHeinrich Schuchardt } 64366305db96SHeinrich Schuchardt } 64376305db96SHeinrich Schuchardt 64386305db96SHeinrich Schuchardt# check for uses of S_<PERMS> that could be octal for readability 6439*c398f2dfSHeinrich Schuchardt while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) { 6440*c398f2dfSHeinrich Schuchardt my $oval = $1; 6441*c398f2dfSHeinrich Schuchardt my $octal = perms_to_octal($oval); 64426305db96SHeinrich Schuchardt if (WARN("SYMBOLIC_PERMS", 64436305db96SHeinrich Schuchardt "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) && 64446305db96SHeinrich Schuchardt $fix) { 6445*c398f2dfSHeinrich Schuchardt $fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/; 64466305db96SHeinrich Schuchardt } 64476305db96SHeinrich Schuchardt } 64486305db96SHeinrich Schuchardt 64496305db96SHeinrich Schuchardt# validate content of MODULE_LICENSE against list from include/linux/module.h 64506305db96SHeinrich Schuchardt if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) { 64516305db96SHeinrich Schuchardt my $extracted_string = get_quoted_string($line, $rawline); 64526305db96SHeinrich Schuchardt my $valid_licenses = qr{ 64536305db96SHeinrich Schuchardt GPL| 64546305db96SHeinrich Schuchardt GPL\ v2| 64556305db96SHeinrich Schuchardt GPL\ and\ additional\ rights| 64566305db96SHeinrich Schuchardt Dual\ BSD/GPL| 64576305db96SHeinrich Schuchardt Dual\ MIT/GPL| 64586305db96SHeinrich Schuchardt Dual\ MPL/GPL| 64596305db96SHeinrich Schuchardt Proprietary 64606305db96SHeinrich Schuchardt }x; 64616305db96SHeinrich Schuchardt if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) { 64626305db96SHeinrich Schuchardt WARN("MODULE_LICENSE", 64636305db96SHeinrich Schuchardt "unknown module license " . $extracted_string . "\n" . $herecurr); 64646305db96SHeinrich Schuchardt } 64656305db96SHeinrich Schuchardt } 6466dd88ab32SMasahiro Yamada } 6467dd88ab32SMasahiro Yamada 6468dd88ab32SMasahiro Yamada # If we have no input at all, then there is nothing to report on 6469dd88ab32SMasahiro Yamada # so just keep quiet. 6470dd88ab32SMasahiro Yamada if ($#rawlines == -1) { 6471dd88ab32SMasahiro Yamada exit(0); 6472dd88ab32SMasahiro Yamada } 6473dd88ab32SMasahiro Yamada 6474dd88ab32SMasahiro Yamada # In mailback mode only produce a report in the negative, for 6475dd88ab32SMasahiro Yamada # things that appear to be patches. 6476dd88ab32SMasahiro Yamada if ($mailback && ($clean == 1 || !$is_patch)) { 6477dd88ab32SMasahiro Yamada exit(0); 6478dd88ab32SMasahiro Yamada } 6479dd88ab32SMasahiro Yamada 6480dd88ab32SMasahiro Yamada # This is not a patch, and we are are in 'no-patch' mode so 6481dd88ab32SMasahiro Yamada # just keep quiet. 6482dd88ab32SMasahiro Yamada if (!$chk_patch && !$is_patch) { 6483dd88ab32SMasahiro Yamada exit(0); 6484dd88ab32SMasahiro Yamada } 6485dd88ab32SMasahiro Yamada 6486*c398f2dfSHeinrich Schuchardt if (!$is_patch && $filename !~ /cover-letter\.patch$/) { 6487dd88ab32SMasahiro Yamada ERROR("NOT_UNIFIED_DIFF", 6488dd88ab32SMasahiro Yamada "Does not appear to be a unified-diff format patch\n"); 6489dd88ab32SMasahiro Yamada } 64906305db96SHeinrich Schuchardt if ($is_patch && $has_commit_log && $chk_signoff && $signoff == 0) { 6491dd88ab32SMasahiro Yamada ERROR("MISSING_SIGN_OFF", 6492dd88ab32SMasahiro Yamada "Missing Signed-off-by: line(s)\n"); 6493dd88ab32SMasahiro Yamada } 6494dd88ab32SMasahiro Yamada 6495dd88ab32SMasahiro Yamada print report_dump(); 6496dd88ab32SMasahiro Yamada if ($summary && !($clean == 1 && $quiet == 1)) { 6497dd88ab32SMasahiro Yamada print "$filename " if ($summary_file); 6498dd88ab32SMasahiro Yamada print "total: $cnt_error errors, $cnt_warn warnings, " . 6499dd88ab32SMasahiro Yamada (($check)? "$cnt_chk checks, " : "") . 6500dd88ab32SMasahiro Yamada "$cnt_lines lines checked\n"; 6501dd88ab32SMasahiro Yamada } 6502dd88ab32SMasahiro Yamada 6503dd88ab32SMasahiro Yamada if ($quiet == 0) { 65046305db96SHeinrich Schuchardt # If there were any defects found and not already fixing them 65056305db96SHeinrich Schuchardt if (!$clean and !$fix) { 65066305db96SHeinrich Schuchardt print << "EOM" 6507dd88ab32SMasahiro Yamada 65086305db96SHeinrich SchuchardtNOTE: For some of the reported defects, checkpatch may be able to 65096305db96SHeinrich Schuchardt mechanically convert to the typical style using --fix or --fix-inplace. 65106305db96SHeinrich SchuchardtEOM 6511dd88ab32SMasahiro Yamada } 6512dd88ab32SMasahiro Yamada # If there were whitespace errors which cleanpatch can fix 6513dd88ab32SMasahiro Yamada # then suggest that. 6514dd88ab32SMasahiro Yamada if ($rpt_cleaners) { 6515dd88ab32SMasahiro Yamada $rpt_cleaners = 0; 65166305db96SHeinrich Schuchardt print << "EOM" 65176305db96SHeinrich Schuchardt 65186305db96SHeinrich SchuchardtNOTE: Whitespace errors detected. 65196305db96SHeinrich Schuchardt You may wish to use scripts/cleanpatch or scripts/cleanfile 65206305db96SHeinrich SchuchardtEOM 6521dd88ab32SMasahiro Yamada } 6522dd88ab32SMasahiro Yamada } 6523dd88ab32SMasahiro Yamada 65246305db96SHeinrich Schuchardt if ($clean == 0 && $fix && 65256305db96SHeinrich Schuchardt ("@rawlines" ne "@fixed" || 65266305db96SHeinrich Schuchardt $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) { 65276b9709d9STom Rini my $newfile = $filename; 65286b9709d9STom Rini $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace); 65296b9709d9STom Rini my $linecount = 0; 65306b9709d9STom Rini my $f; 65316b9709d9STom Rini 65326305db96SHeinrich Schuchardt @fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted); 65336305db96SHeinrich Schuchardt 65346b9709d9STom Rini open($f, '>', $newfile) 65356b9709d9STom Rini or die "$P: Can't open $newfile for write\n"; 65366b9709d9STom Rini foreach my $fixed_line (@fixed) { 65376b9709d9STom Rini $linecount++; 65386b9709d9STom Rini if ($file) { 65396b9709d9STom Rini if ($linecount > 3) { 65406b9709d9STom Rini $fixed_line =~ s/^\+//; 65416b9709d9STom Rini print $f $fixed_line . "\n"; 6542dd88ab32SMasahiro Yamada } 65436b9709d9STom Rini } else { 65446b9709d9STom Rini print $f $fixed_line . "\n"; 65456b9709d9STom Rini } 65466b9709d9STom Rini } 65476b9709d9STom Rini close($f); 65486b9709d9STom Rini 65496b9709d9STom Rini if (!$quiet) { 65506b9709d9STom Rini print << "EOM"; 65516305db96SHeinrich Schuchardt 65526b9709d9STom RiniWrote EXPERIMENTAL --fix correction(s) to '$newfile' 65536b9709d9STom Rini 65546b9709d9STom RiniDo _NOT_ trust the results written to this file. 65556b9709d9STom RiniDo _NOT_ submit these changes without inspecting them for correctness. 65566b9709d9STom Rini 65576b9709d9STom RiniThis EXPERIMENTAL file is simply a convenience to help rewrite patches. 65586b9709d9STom RiniNo warranties, expressed or implied... 65596b9709d9STom RiniEOM 65606b9709d9STom Rini } 6561dd88ab32SMasahiro Yamada } 6562dd88ab32SMasahiro Yamada 65636305db96SHeinrich Schuchardt if ($quiet == 0) { 65646305db96SHeinrich Schuchardt print "\n"; 65656305db96SHeinrich Schuchardt if ($clean == 1) { 65666305db96SHeinrich Schuchardt print "$vname has no obvious style problems and is ready for submission.\n"; 65676305db96SHeinrich Schuchardt } else { 65686305db96SHeinrich Schuchardt print "$vname has style problems, please review.\n"; 6569dd88ab32SMasahiro Yamada } 6570dd88ab32SMasahiro Yamada } 6571dd88ab32SMasahiro Yamada return $clean; 6572dd88ab32SMasahiro Yamada} 6573