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