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