scripts: Update checkpatch to latest from the linux kernel
This is pulled from commit a8c964eacb21288b2dbfa9d80cee5968a3b8fb21 of the Linux kernel with local zephyr related modifications. Fixes #4135. Signed-off-by: Anas Nashif <anas.nashif@intel.com>
This commit is contained in:
parent
09330fa7b0
commit
1eb244cf6c
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/perl -w
|
#!/usr/bin/env perl
|
||||||
# (c) 2001, Dave Jones. (the file handling bit)
|
# (c) 2001, Dave Jones. (the file handling bit)
|
||||||
# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
|
# (c) 2005, Joel Schopp <jschopp@austin.ibm.com> (the ugly bit)
|
||||||
# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
|
# (c) 2007,2008, Andy Whitcroft <apw@uk.ibm.com> (new conditions, test suite)
|
||||||
|
@ -6,6 +6,7 @@
|
||||||
# Licensed under the terms of the GNU GPL License version 2
|
# Licensed under the terms of the GNU GPL License version 2
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
|
use warnings;
|
||||||
use POSIX;
|
use POSIX;
|
||||||
use File::Basename;
|
use File::Basename;
|
||||||
use Cwd 'abs_path';
|
use Cwd 'abs_path';
|
||||||
|
@ -45,8 +46,8 @@ my %use_type = ();
|
||||||
my @use = ();
|
my @use = ();
|
||||||
my %ignore_type = ();
|
my %ignore_type = ();
|
||||||
my @ignore = ();
|
my @ignore = ();
|
||||||
my $help = 0;
|
|
||||||
my @exclude = ();
|
my @exclude = ();
|
||||||
|
my $help = 0;
|
||||||
my $configuration_file = ".checkpatch.conf";
|
my $configuration_file = ".checkpatch.conf";
|
||||||
my $max_line_length = 80;
|
my $max_line_length = 80;
|
||||||
my $ignore_perl_version = 0;
|
my $ignore_perl_version = 0;
|
||||||
|
@ -56,7 +57,8 @@ my $spelling_file = "$D/spelling.txt";
|
||||||
my $codespell = 0;
|
my $codespell = 0;
|
||||||
my $codespellfile = "/usr/share/codespell/dictionary.txt";
|
my $codespellfile = "/usr/share/codespell/dictionary.txt";
|
||||||
my $conststructsfile = "$D/const_structs.checkpatch";
|
my $conststructsfile = "$D/const_structs.checkpatch";
|
||||||
my $color = 1;
|
my $typedefsfile = "";
|
||||||
|
my $color = "auto";
|
||||||
my $allow_c99_comments = 0;
|
my $allow_c99_comments = 0;
|
||||||
|
|
||||||
sub help {
|
sub help {
|
||||||
|
@ -89,8 +91,8 @@ Options:
|
||||||
--list-types list the possible message types
|
--list-types list the possible message types
|
||||||
--types TYPE(,TYPE2...) show only these comma separated message types
|
--types TYPE(,TYPE2...) show only these comma separated message types
|
||||||
--ignore TYPE(,TYPE2...) ignore various comma separated message types
|
--ignore TYPE(,TYPE2...) ignore various comma separated message types
|
||||||
--show-types show the specific message type in the output
|
|
||||||
--exclude DIR(,DIR22...) exclude directories
|
--exclude DIR(,DIR22...) exclude directories
|
||||||
|
--show-types show the specific message type in the output
|
||||||
--max-line-length=n set the maximum line length, if exceeded, warn
|
--max-line-length=n set the maximum line length, if exceeded, warn
|
||||||
--min-conf-desc-length=n set the min description length, if shorter, warn
|
--min-conf-desc-length=n set the min description length, if shorter, warn
|
||||||
--root=PATH PATH to the kernel tree root
|
--root=PATH PATH to the kernel tree root
|
||||||
|
@ -115,7 +117,9 @@ Options:
|
||||||
--codespell Use the codespell dictionary for spelling/typos
|
--codespell Use the codespell dictionary for spelling/typos
|
||||||
(default:/usr/share/codespell/dictionary.txt)
|
(default:/usr/share/codespell/dictionary.txt)
|
||||||
--codespellfile Use this codespell dictionary
|
--codespellfile Use this codespell dictionary
|
||||||
--color Use colors when output is STDOUT (default: on)
|
--typedefsfile Read additional types from this file
|
||||||
|
--color[=WHEN] Use colors 'always', 'never', or only when output
|
||||||
|
is a terminal ('auto'). Default is 'auto'.
|
||||||
-h, --help, --version display this help and exit
|
-h, --help, --version display this help and exit
|
||||||
|
|
||||||
When FILE is - read standard input.
|
When FILE is - read standard input.
|
||||||
|
@ -143,7 +147,8 @@ sub list_types {
|
||||||
close($script);
|
close($script);
|
||||||
|
|
||||||
my @types = ();
|
my @types = ();
|
||||||
for ($text =~ /\b(?:(?:CHK|WARN|ERROR)\s*\(\s*"([^"]+)")/g) {
|
# Also catch when type or level is passed through a variable
|
||||||
|
for ($text =~ /(?:(?:\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) {
|
||||||
push (@types, $_);
|
push (@types, $_);
|
||||||
}
|
}
|
||||||
@types = sort(uniq(@types));
|
@types = sort(uniq(@types));
|
||||||
|
@ -181,6 +186,14 @@ if (-f $conf) {
|
||||||
unshift(@ARGV, @conf_args) if @conf_args;
|
unshift(@ARGV, @conf_args) if @conf_args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Perl's Getopt::Long allows options to take optional arguments after a space.
|
||||||
|
# Prevent --color by itself from consuming other arguments
|
||||||
|
foreach (@ARGV) {
|
||||||
|
if ($_ eq "--color" || $_ eq "-color") {
|
||||||
|
$_ = "--color=$color";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GetOptions(
|
GetOptions(
|
||||||
'q|quiet+' => \$quiet,
|
'q|quiet+' => \$quiet,
|
||||||
'tree!' => \$tree,
|
'tree!' => \$tree,
|
||||||
|
@ -194,7 +207,7 @@ GetOptions(
|
||||||
'subjective!' => \$check,
|
'subjective!' => \$check,
|
||||||
'strict!' => \$check,
|
'strict!' => \$check,
|
||||||
'ignore=s' => \@ignore,
|
'ignore=s' => \@ignore,
|
||||||
'exclude=s' => \@exclude,
|
'exclude=s' => \@exclude,
|
||||||
'types=s' => \@use,
|
'types=s' => \@use,
|
||||||
'show-types!' => \$show_types,
|
'show-types!' => \$show_types,
|
||||||
'list-types!' => \$list_types,
|
'list-types!' => \$list_types,
|
||||||
|
@ -211,7 +224,10 @@ GetOptions(
|
||||||
'test-only=s' => \$tst_only,
|
'test-only=s' => \$tst_only,
|
||||||
'codespell!' => \$codespell,
|
'codespell!' => \$codespell,
|
||||||
'codespellfile=s' => \$codespellfile,
|
'codespellfile=s' => \$codespellfile,
|
||||||
'color!' => \$color,
|
'typedefsfile=s' => \$typedefsfile,
|
||||||
|
'color=s' => \$color,
|
||||||
|
'no-color' => \$color, #keep old behaviors of -nocolor
|
||||||
|
'nocolor' => \$color, #keep old behaviors of -nocolor
|
||||||
'h|help' => \$help,
|
'h|help' => \$help,
|
||||||
'version' => \$help
|
'version' => \$help
|
||||||
) or help(1);
|
) or help(1);
|
||||||
|
@ -237,6 +253,18 @@ if ($#ARGV < 0) {
|
||||||
push(@ARGV, '-');
|
push(@ARGV, '-');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($color =~ /^[01]$/) {
|
||||||
|
$color = !$color;
|
||||||
|
} elsif ($color =~ /^always$/i) {
|
||||||
|
$color = 1;
|
||||||
|
} elsif ($color =~ /^never$/i) {
|
||||||
|
$color = 0;
|
||||||
|
} elsif ($color =~ /^auto$/i) {
|
||||||
|
$color = (-t STDOUT);
|
||||||
|
} else {
|
||||||
|
die "Invalid color mode: $color\n";
|
||||||
|
}
|
||||||
|
|
||||||
sub hash_save_array_words {
|
sub hash_save_array_words {
|
||||||
my ($hashRef, $arrayRef) = @_;
|
my ($hashRef, $arrayRef) = @_;
|
||||||
|
|
||||||
|
@ -338,7 +366,7 @@ our $Attribute = qr{
|
||||||
__percpu|
|
__percpu|
|
||||||
__nocast|
|
__nocast|
|
||||||
__safe|
|
__safe|
|
||||||
__bitwise__|
|
__bitwise|
|
||||||
__packed__|
|
__packed__|
|
||||||
__packed2__|
|
__packed2__|
|
||||||
__naked|
|
__naked|
|
||||||
|
@ -429,7 +457,7 @@ our $typeTypedefs = qr{(?x:
|
||||||
our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
|
our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
|
||||||
|
|
||||||
our $logFunctions = qr{(?x:
|
our $logFunctions = qr{(?x:
|
||||||
printk(?:_ratelimited|_once|)|
|
printk(?:_ratelimited|_once|_deferred_once|_deferred|)|
|
||||||
(?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
|
(?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
|
||||||
WARN(?:_RATELIMIT|_ONCE|)|
|
WARN(?:_RATELIMIT|_ONCE|)|
|
||||||
panic|
|
panic|
|
||||||
|
@ -634,29 +662,44 @@ if ($codespell) {
|
||||||
|
|
||||||
$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
|
$misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
|
||||||
|
|
||||||
my $const_structs = "";
|
sub read_words {
|
||||||
if (open(my $conststructs, '<', $conststructsfile)) {
|
my ($wordsRef, $file) = @_;
|
||||||
while (<$conststructs>) {
|
|
||||||
my $line = $_;
|
|
||||||
|
|
||||||
$line =~ s/\s*\n?$//g;
|
if (open(my $words, '<', $file)) {
|
||||||
$line =~ s/^\s*//g;
|
while (<$words>) {
|
||||||
|
my $line = $_;
|
||||||
|
|
||||||
next if ($line =~ m/^\s*#/);
|
$line =~ s/\s*\n?$//g;
|
||||||
next if ($line =~ m/^\s*$/);
|
$line =~ s/^\s*//g;
|
||||||
if ($line =~ /\s/) {
|
|
||||||
print("$conststructsfile: '$line' invalid - ignored\n");
|
next if ($line =~ m/^\s*#/);
|
||||||
next;
|
next if ($line =~ m/^\s*$/);
|
||||||
|
if ($line =~ /\s/) {
|
||||||
|
print("$file: '$line' invalid - ignored\n");
|
||||||
|
next;
|
||||||
|
}
|
||||||
|
|
||||||
|
$$wordsRef .= '|' if ($$wordsRef ne "");
|
||||||
|
$$wordsRef .= $line;
|
||||||
}
|
}
|
||||||
|
close($file);
|
||||||
$const_structs .= '|' if ($const_structs ne "");
|
return 1;
|
||||||
$const_structs .= $line;
|
|
||||||
}
|
}
|
||||||
close($conststructsfile);
|
|
||||||
#} else {
|
return 0;
|
||||||
# warn "No structs that should be const will be found - file '$conststructsfile': $!\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $const_structs = "";
|
||||||
|
#read_words(\$const_structs, $conststructsfile)
|
||||||
|
# or warn "No structs that should be const will be found - file '$conststructsfile': $!\n";
|
||||||
|
|
||||||
|
my $typeOtherTypedefs = "";
|
||||||
|
if (length($typedefsfile)) {
|
||||||
|
read_words(\$typeOtherTypedefs, $typedefsfile)
|
||||||
|
or warn "No additional types will be considered - file '$typedefsfile': $!\n";
|
||||||
|
}
|
||||||
|
$typeTypedefs .= '|' . $typeOtherTypedefs if ($typeOtherTypedefs ne "");
|
||||||
|
|
||||||
sub build_types {
|
sub build_types {
|
||||||
my $mods = "(?x: \n" . join("|\n ", (@modifierList, @modifierListFile)) . "\n)";
|
my $mods = "(?x: \n" . join("|\n ", (@modifierList, @modifierListFile)) . "\n)";
|
||||||
my $all = "(?x: \n" . join("|\n ", (@typeList, @typeListFile)) . "\n)";
|
my $all = "(?x: \n" . join("|\n ", (@typeList, @typeListFile)) . "\n)";
|
||||||
|
@ -719,7 +762,7 @@ our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
|
||||||
|
|
||||||
our $declaration_macros = qr{(?x:
|
our $declaration_macros = qr{(?x:
|
||||||
(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
|
(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
|
||||||
(?:$Storage\s+)?LIST_HEAD\s*\(|
|
(?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
|
||||||
(?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(
|
(?:$Storage\s+)?${Type}\s+uninitialized_var\s*\(
|
||||||
)};
|
)};
|
||||||
|
|
||||||
|
@ -763,6 +806,16 @@ sub seed_camelcase_file {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub is_maintained_obsolete {
|
||||||
|
my ($filename) = @_;
|
||||||
|
|
||||||
|
return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
|
||||||
|
|
||||||
|
my $status = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
|
||||||
|
|
||||||
|
return $status =~ /obsolete/i;
|
||||||
|
}
|
||||||
|
|
||||||
my $camelcase_seeded = 0;
|
my $camelcase_seeded = 0;
|
||||||
sub seed_camelcase_includes {
|
sub seed_camelcase_includes {
|
||||||
return if ($camelcase_seeded);
|
return if ($camelcase_seeded);
|
||||||
|
@ -843,6 +896,7 @@ sub git_commit_info {
|
||||||
# echo "commit $(cut -c 1-12,41-)"
|
# echo "commit $(cut -c 1-12,41-)"
|
||||||
# done
|
# done
|
||||||
} elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
|
} elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
|
||||||
|
$id = undef;
|
||||||
} else {
|
} else {
|
||||||
$id = substr($lines[0], 0, 12);
|
$id = substr($lines[0], 0, 12);
|
||||||
$desc = substr($lines[0], 41);
|
$desc = substr($lines[0], 41);
|
||||||
|
@ -952,7 +1006,7 @@ EOM
|
||||||
print << "EOM"
|
print << "EOM"
|
||||||
|
|
||||||
NOTE: If any of the errors are false positives, please report
|
NOTE: If any of the errors are false positives, please report
|
||||||
them to the maintainer.
|
them to the maintainers.
|
||||||
EOM
|
EOM
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1843,6 +1897,8 @@ my $prefix = '';
|
||||||
sub show_type {
|
sub show_type {
|
||||||
my ($type) = @_;
|
my ($type) = @_;
|
||||||
|
|
||||||
|
$type =~ tr/[a-z]/[A-Z]/;
|
||||||
|
|
||||||
return defined $use_type{$type} if (scalar keys %use_type > 0);
|
return defined $use_type{$type} if (scalar keys %use_type > 0);
|
||||||
|
|
||||||
return !defined $ignore_type{$type};
|
return !defined $ignore_type{$type};
|
||||||
|
@ -1856,7 +1912,7 @@ sub report {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
my $output = '';
|
my $output = '';
|
||||||
if (-t STDOUT && $color) {
|
if ($color) {
|
||||||
if ($level eq 'ERROR') {
|
if ($level eq 'ERROR') {
|
||||||
$output .= RED;
|
$output .= RED;
|
||||||
} elsif ($level eq 'WARNING') {
|
} elsif ($level eq 'WARNING') {
|
||||||
|
@ -1867,10 +1923,10 @@ sub report {
|
||||||
}
|
}
|
||||||
$output .= $prefix . $level . ':';
|
$output .= $prefix . $level . ':';
|
||||||
if ($show_types) {
|
if ($show_types) {
|
||||||
$output .= BLUE if (-t STDOUT && $color);
|
$output .= BLUE if ($color);
|
||||||
$output .= "$type:";
|
$output .= "$type:";
|
||||||
}
|
}
|
||||||
$output .= RESET if (-t STDOUT && $color);
|
$output .= RESET if ($color);
|
||||||
$output .= ' ' . $msg . "\n";
|
$output .= ' ' . $msg . "\n";
|
||||||
|
|
||||||
if ($showfile) {
|
if ($showfile) {
|
||||||
|
@ -2129,7 +2185,7 @@ sub process {
|
||||||
my $in_header_lines = $file ? 0 : 1;
|
my $in_header_lines = $file ? 0 : 1;
|
||||||
my $in_commit_log = 0; #Scanning lines before patch
|
my $in_commit_log = 0; #Scanning lines before patch
|
||||||
my $has_commit_log = 0; #Encountered lines before patch
|
my $has_commit_log = 0; #Encountered lines before patch
|
||||||
my $commit_log_possible_stack_dump = 0;
|
my $commit_log_possible_stack_dump = 0;
|
||||||
my $commit_log_long_line = 0;
|
my $commit_log_long_line = 0;
|
||||||
my $commit_log_has_diff = 0;
|
my $commit_log_has_diff = 0;
|
||||||
my $reported_maintainer_file = 0;
|
my $reported_maintainer_file = 0;
|
||||||
|
@ -2149,6 +2205,7 @@ sub process {
|
||||||
my $realline = 0;
|
my $realline = 0;
|
||||||
my $realcnt = 0;
|
my $realcnt = 0;
|
||||||
my $here = '';
|
my $here = '';
|
||||||
|
my $context_function; #undef'd unless there's a known function
|
||||||
my $in_comment = 0;
|
my $in_comment = 0;
|
||||||
my $comment_edge = 0;
|
my $comment_edge = 0;
|
||||||
my $first_line = 0;
|
my $first_line = 0;
|
||||||
|
@ -2182,12 +2239,12 @@ sub process {
|
||||||
|
|
||||||
if ($rawline=~/^\+\+\+\s+(\S+)/) {
|
if ($rawline=~/^\+\+\+\s+(\S+)/) {
|
||||||
$setup_docs = 0;
|
$setup_docs = 0;
|
||||||
if ($1 =~ m@Documentation/kernel-parameters.txt$@) {
|
if ($1 =~ m@Documentation/admin-guide/kernel-parameters.rst$@) {
|
||||||
$setup_docs = 1;
|
$setup_docs = 1;
|
||||||
}
|
}
|
||||||
#next;
|
#next;
|
||||||
}
|
}
|
||||||
if ($rawline=~/^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
|
if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
|
||||||
$realline=$1-1;
|
$realline=$1-1;
|
||||||
if (defined $2) {
|
if (defined $2) {
|
||||||
$realcnt=$3+1;
|
$realcnt=$3+1;
|
||||||
|
@ -2266,7 +2323,8 @@ sub process {
|
||||||
|
|
||||||
#extract the line range in the file after the patch is applied
|
#extract the line range in the file after the patch is applied
|
||||||
if (!$in_commit_log &&
|
if (!$in_commit_log &&
|
||||||
$line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
|
$line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {
|
||||||
|
my $context = $4;
|
||||||
$is_patch = 1;
|
$is_patch = 1;
|
||||||
$first_line = $linenr + 1;
|
$first_line = $linenr + 1;
|
||||||
$realline=$1-1;
|
$realline=$1-1;
|
||||||
|
@ -2282,6 +2340,11 @@ sub process {
|
||||||
%suppress_whiletrailers = ();
|
%suppress_whiletrailers = ();
|
||||||
%suppress_export = ();
|
%suppress_export = ();
|
||||||
$suppress_statement = 0;
|
$suppress_statement = 0;
|
||||||
|
if ($context =~ /\b(\w+)\s*\(/) {
|
||||||
|
$context_function = $1;
|
||||||
|
} else {
|
||||||
|
undef $context_function;
|
||||||
|
}
|
||||||
next;
|
next;
|
||||||
|
|
||||||
# track the line number as we move through the hunk, note that
|
# track the line number as we move through the hunk, note that
|
||||||
|
@ -2357,6 +2420,10 @@ sub process {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($found_file) {
|
if ($found_file) {
|
||||||
|
if (is_maintained_obsolete($realfile)) {
|
||||||
|
WARN("OBSOLETE",
|
||||||
|
"$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy. No unnecessary modifications please.\n");
|
||||||
|
}
|
||||||
if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
|
if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
|
||||||
$check = 1;
|
$check = 1;
|
||||||
} else {
|
} else {
|
||||||
|
@ -2489,6 +2556,12 @@ sub process {
|
||||||
"The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);
|
"The 'stable' address should be 'stable\@vger.kernel.org'\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Check for unwanted Gerrit info
|
||||||
|
if ($in_commit_log && $line =~ /^\s*change-id:/i) {
|
||||||
|
ERROR("GERRIT_CHANGE_ID",
|
||||||
|
"Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
|
||||||
|
}
|
||||||
|
|
||||||
# Check if the commit log is in a possible stack dump
|
# Check if the commit log is in a possible stack dump
|
||||||
if ($in_commit_log && !$commit_log_possible_stack_dump &&
|
if ($in_commit_log && !$commit_log_possible_stack_dump &&
|
||||||
($line =~ /^\s*(?:WARNING:|BUG:)/ ||
|
($line =~ /^\s*(?:WARNING:|BUG:)/ ||
|
||||||
|
@ -2523,6 +2596,7 @@ sub process {
|
||||||
# Check for git id commit length and improperly formed commit descriptions
|
# Check for git id commit length and improperly formed commit descriptions
|
||||||
if ($in_commit_log && !$commit_log_possible_stack_dump &&
|
if ($in_commit_log && !$commit_log_possible_stack_dump &&
|
||||||
$line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i &&
|
$line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i &&
|
||||||
|
$line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
|
||||||
($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
|
($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
|
||||||
($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
|
($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
|
||||||
$line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
|
$line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
|
||||||
|
@ -2571,7 +2645,8 @@ sub process {
|
||||||
($id, $description) = git_commit_info($orig_commit,
|
($id, $description) = git_commit_info($orig_commit,
|
||||||
$id, $orig_desc);
|
$id, $orig_desc);
|
||||||
|
|
||||||
if ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens) {
|
if (defined($id) &&
|
||||||
|
($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) {
|
||||||
ERROR("GIT_COMMIT_ID",
|
ERROR("GIT_COMMIT_ID",
|
||||||
"Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr);
|
"Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
@ -2583,6 +2658,7 @@ sub process {
|
||||||
$line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
|
$line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
|
||||||
($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
|
($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
|
||||||
(defined($1) || defined($2))))) {
|
(defined($1) || defined($2))))) {
|
||||||
|
$is_patch = 1;
|
||||||
$reported_maintainer_file = 1;
|
$reported_maintainer_file = 1;
|
||||||
WARN("FILE_PATH_CHANGES",
|
WARN("FILE_PATH_CHANGES",
|
||||||
"added, moved or deleted file(s), does CODEOWNERS need updating?\n" . $herecurr);
|
"added, moved or deleted file(s), does CODEOWNERS need updating?\n" . $herecurr);
|
||||||
|
@ -2595,20 +2671,6 @@ sub process {
|
||||||
$herecurr) if (!$emitted_corrupt++);
|
$herecurr) if (!$emitted_corrupt++);
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check for absolute kernel paths.
|
|
||||||
if ($tree) {
|
|
||||||
while ($line =~ m{(?:^|\s)(/\S*)}g) {
|
|
||||||
my $file = $1;
|
|
||||||
|
|
||||||
if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
|
|
||||||
check_absolute_file($1, $herecurr)) {
|
|
||||||
#
|
|
||||||
} else {
|
|
||||||
check_absolute_file($file, $herecurr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
|
# UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php
|
||||||
if (($realfile =~ /^$/ || $line =~ /^\+/) &&
|
if (($realfile =~ /^$/ || $line =~ /^\+/) &&
|
||||||
$rawline !~ m/^$UTF8*$/) {
|
$rawline !~ m/^$UTF8*$/) {
|
||||||
|
@ -2625,8 +2687,8 @@ sub process {
|
||||||
# Check if it's the start of a commit log
|
# Check if it's the start of a commit log
|
||||||
# (not a header line and we haven't seen the patch filename)
|
# (not a header line and we haven't seen the patch filename)
|
||||||
if ($in_header_lines && $realfile =~ /^$/ &&
|
if ($in_header_lines && $realfile =~ /^$/ &&
|
||||||
!($rawline =~ /^\s+\S/ ||
|
!($rawline =~ /^\s+(?:\S|$)/ ||
|
||||||
$rawline =~ /^(commit\b|from\b|[\w-]+:).*$/i)) {
|
$rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {
|
||||||
$in_header_lines = 0;
|
$in_header_lines = 0;
|
||||||
$in_commit_log = 1;
|
$in_commit_log = 1;
|
||||||
$has_commit_log = 1;
|
$has_commit_log = 1;
|
||||||
|
@ -2646,6 +2708,20 @@ sub process {
|
||||||
"8-bit UTF-8 used in possible commit log\n" . $herecurr);
|
"8-bit UTF-8 used in possible commit log\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Check for absolute kernel paths in commit message
|
||||||
|
if ($tree && $in_commit_log) {
|
||||||
|
while ($line =~ m{(?:^|\s)(/\S*)}g) {
|
||||||
|
my $file = $1;
|
||||||
|
|
||||||
|
if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
|
||||||
|
check_absolute_file($1, $herecurr)) {
|
||||||
|
#
|
||||||
|
} else {
|
||||||
|
check_absolute_file($file, $herecurr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Check for various typo / spelling mistakes
|
# Check for various typo / spelling mistakes
|
||||||
if (defined($misspellings) &&
|
if (defined($misspellings) &&
|
||||||
($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
|
($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
|
||||||
|
@ -2654,10 +2730,10 @@ sub process {
|
||||||
my $typo_fix = $spelling_fix{lc($typo)};
|
my $typo_fix = $spelling_fix{lc($typo)};
|
||||||
$typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
|
$typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
|
||||||
$typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
|
$typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
|
||||||
my $msg_type = \&WARN;
|
my $msg_level = \&WARN;
|
||||||
$msg_type = \&CHK if ($file);
|
$msg_level = \&CHK if ($file);
|
||||||
if (&{$msg_type}("TYPO_SPELLING",
|
if (&{$msg_level}("TYPO_SPELLING",
|
||||||
"'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) &&
|
"'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) &&
|
||||||
$fix) {
|
$fix) {
|
||||||
$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
|
$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
|
||||||
}
|
}
|
||||||
|
@ -2688,13 +2764,14 @@ sub process {
|
||||||
|
|
||||||
# Check for FSF mailing addresses.
|
# Check for FSF mailing addresses.
|
||||||
if ($rawline =~ /\bwrite to the Free/i ||
|
if ($rawline =~ /\bwrite to the Free/i ||
|
||||||
|
$rawline =~ /\b675\s+Mass\s+Ave/i ||
|
||||||
$rawline =~ /\b59\s+Temple\s+Pl/i ||
|
$rawline =~ /\b59\s+Temple\s+Pl/i ||
|
||||||
$rawline =~ /\b51\s+Franklin\s+St/i) {
|
$rawline =~ /\b51\s+Franklin\s+St/i) {
|
||||||
my $herevet = "$here\n" . cat_vet($rawline) . "\n";
|
my $herevet = "$here\n" . cat_vet($rawline) . "\n";
|
||||||
my $msg_type = \&ERROR;
|
my $msg_level = \&ERROR;
|
||||||
$msg_type = \&CHK if ($file);
|
$msg_level = \&CHK if ($file);
|
||||||
&{$msg_type}("FSF_MAILING_ADDRESS",
|
&{$msg_level}("FSF_MAILING_ADDRESS",
|
||||||
"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)
|
"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)
|
||||||
}
|
}
|
||||||
|
|
||||||
# check for Kconfig help text having a real description
|
# check for Kconfig help text having a real description
|
||||||
|
@ -2739,11 +2816,15 @@ sub process {
|
||||||
#print "is_start<$is_start> is_end<$is_end> length<$length>\n";
|
#print "is_start<$is_start> is_end<$is_end> length<$length>\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
|
# check for MAINTAINERS entries that don't have the right form
|
||||||
if ($realfile =~ /Kconfig/ &&
|
if ($realfile =~ /^MAINTAINERS$/ &&
|
||||||
$line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
|
$rawline =~ /^\+[A-Z]:/ &&
|
||||||
WARN("CONFIG_EXPERIMENTAL",
|
$rawline !~ /^\+[A-Z]:\t\S/) {
|
||||||
"Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
|
if (WARN("MAINTAINERS_STYLE",
|
||||||
|
"MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) &&
|
||||||
|
$fix) {
|
||||||
|
$fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# discourage the use of boolean for type definition attributes of Kconfig options
|
# discourage the use of boolean for type definition attributes of Kconfig options
|
||||||
|
@ -2805,7 +2886,7 @@ sub process {
|
||||||
}
|
}
|
||||||
|
|
||||||
# check we are in a valid source file if not then ignore this hunk
|
# check we are in a valid source file if not then ignore this hunk
|
||||||
next if ($realfile !~ /\.(h|c|s|S|pl|sh|dtsi|dts)$/);
|
next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
|
||||||
|
|
||||||
# line length limit (with some exclusions)
|
# line length limit (with some exclusions)
|
||||||
#
|
#
|
||||||
|
@ -2815,7 +2896,7 @@ sub process {
|
||||||
# #defines that are a single string
|
# #defines that are a single string
|
||||||
#
|
#
|
||||||
# There are 3 different line length message types:
|
# There are 3 different line length message types:
|
||||||
# LONG_LINE_COMMENT a comment starts before but extends beyond $max_linelength
|
# LONG_LINE_COMMENT a comment starts before but extends beyond $max_line_length
|
||||||
# LONG_LINE_STRING a string starts before but extends beyond $max_line_length
|
# LONG_LINE_STRING a string starts before but extends beyond $max_line_length
|
||||||
# LONG_LINE all other lines longer than $max_line_length
|
# LONG_LINE all other lines longer than $max_line_length
|
||||||
#
|
#
|
||||||
|
@ -2933,7 +3014,7 @@ sub process {
|
||||||
|
|
||||||
# check multi-line statement indentation matches previous line
|
# check multi-line statement indentation matches previous line
|
||||||
if ($^V && $^V ge 5.10.0 &&
|
if ($^V && $^V ge 5.10.0 &&
|
||||||
$prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|$Ident\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
|
$prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
|
||||||
$prevline =~ /^\+(\t*)(.*)$/;
|
$prevline =~ /^\+(\t*)(.*)$/;
|
||||||
my $oldindent = $1;
|
my $oldindent = $1;
|
||||||
my $rest = $2;
|
my $rest = $2;
|
||||||
|
@ -3121,6 +3202,17 @@ sub process {
|
||||||
# check we are in a valid C source file if not then ignore this hunk
|
# check we are in a valid C source file if not then ignore this hunk
|
||||||
next if ($realfile !~ /\.(h|c)$/);
|
next if ($realfile !~ /\.(h|c)$/);
|
||||||
|
|
||||||
|
# check if this appears to be the start function declaration, save the name
|
||||||
|
if ($sline =~ /^\+\{\s*$/ &&
|
||||||
|
$prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) {
|
||||||
|
$context_function = $1;
|
||||||
|
}
|
||||||
|
|
||||||
|
# check if this appears to be the end of function declaration
|
||||||
|
if ($sline =~ /^\+\}\s*$/) {
|
||||||
|
undef $context_function;
|
||||||
|
}
|
||||||
|
|
||||||
# check indentation of any line with a bare else
|
# check indentation of any line with a bare else
|
||||||
# (but not if it is a multiple line "if (foo) return bar; else return baz;")
|
# (but not if it is a multiple line "if (foo) return bar; else return baz;")
|
||||||
# if the previous line is a break or return and is indented 1 tab more...
|
# if the previous line is a break or return and is indented 1 tab more...
|
||||||
|
@ -3145,12 +3237,6 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
|
|
||||||
if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
|
|
||||||
WARN("CONFIG_EXPERIMENTAL",
|
|
||||||
"Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
# check for RCS/CVS revision markers
|
# check for RCS/CVS revision markers
|
||||||
if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
|
if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
|
||||||
WARN("CVS_KEYWORD",
|
WARN("CVS_KEYWORD",
|
||||||
|
@ -3179,7 +3265,7 @@ sub process {
|
||||||
my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
|
my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
|
||||||
$realline_next);
|
$realline_next);
|
||||||
#print "LINE<$line>\n";
|
#print "LINE<$line>\n";
|
||||||
if ($linenr >= $suppress_statement &&
|
if ($linenr > $suppress_statement &&
|
||||||
$realcnt && $sline =~ /.\s*\S/) {
|
$realcnt && $sline =~ /.\s*\S/) {
|
||||||
($stat, $cond, $line_nr_next, $remain_next, $off_next) =
|
($stat, $cond, $line_nr_next, $remain_next, $off_next) =
|
||||||
ctx_statement_block($linenr, $realcnt, 0);
|
ctx_statement_block($linenr, $realcnt, 0);
|
||||||
|
@ -3326,7 +3412,7 @@ sub process {
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check relative indent for conditionals and blocks.
|
# Check relative indent for conditionals and blocks.
|
||||||
if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|do\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
|
if ($line =~ /\b(?:(?:if|while|for|(?:[a-z_]+|)for_each[a-z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
|
||||||
($stat, $cond, $line_nr_next, $remain_next, $off_next) =
|
($stat, $cond, $line_nr_next, $remain_next, $off_next) =
|
||||||
ctx_statement_block($linenr, $realcnt, 0)
|
ctx_statement_block($linenr, $realcnt, 0)
|
||||||
if (!defined $stat);
|
if (!defined $stat);
|
||||||
|
@ -3418,6 +3504,8 @@ sub process {
|
||||||
if ($check && $s ne '' &&
|
if ($check && $s ne '' &&
|
||||||
(($sindent % 8) != 0 ||
|
(($sindent % 8) != 0 ||
|
||||||
($sindent < $indent) ||
|
($sindent < $indent) ||
|
||||||
|
($sindent == $indent &&
|
||||||
|
($s !~ /^\s*(?:\}|\{|else\b)/)) ||
|
||||||
($sindent > $indent + 8))) {
|
($sindent > $indent + 8))) {
|
||||||
WARN("SUSPECT_CODE_INDENT",
|
WARN("SUSPECT_CODE_INDENT",
|
||||||
"suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
|
"suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
|
||||||
|
@ -3440,6 +3528,18 @@ sub process {
|
||||||
#ignore lines not being added
|
#ignore lines not being added
|
||||||
next if ($line =~ /^[^\+]/);
|
next if ($line =~ /^[^\+]/);
|
||||||
|
|
||||||
|
# check for dereferences that span multiple lines
|
||||||
|
if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ &&
|
||||||
|
$line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) {
|
||||||
|
$prevline =~ /($Lval\s*(?:\.|->))\s*$/;
|
||||||
|
my $ref = $1;
|
||||||
|
$line =~ /^.\s*($Lval)/;
|
||||||
|
$ref .= $1;
|
||||||
|
$ref =~ s/\s//g;
|
||||||
|
WARN("MULTILINE_DEREFERENCE",
|
||||||
|
"Avoid multiple line dereference - prefer '$ref'\n" . $hereprev);
|
||||||
|
}
|
||||||
|
|
||||||
# check for declarations of signed or unsigned without int
|
# check for declarations of signed or unsigned without int
|
||||||
while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
|
while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
|
||||||
my $type = $1;
|
my $type = $1;
|
||||||
|
@ -3499,7 +3599,7 @@ sub process {
|
||||||
$fixedline =~ s/\s*=\s*$/ = {/;
|
$fixedline =~ s/\s*=\s*$/ = {/;
|
||||||
fix_insert_line($fixlinenr, $fixedline);
|
fix_insert_line($fixlinenr, $fixedline);
|
||||||
$fixedline = $line;
|
$fixedline = $line;
|
||||||
$fixedline =~ s/^(.\s*){\s*/$1/;
|
$fixedline =~ s/^(.\s*)\{\s*/$1/;
|
||||||
fix_insert_line($fixlinenr, $fixedline);
|
fix_insert_line($fixlinenr, $fixedline);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3668,7 +3768,7 @@ sub process {
|
||||||
$line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
|
$line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
|
||||||
$line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
|
$line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
|
||||||
$line !~ /\b$typeTypedefs\b/ &&
|
$line !~ /\b$typeTypedefs\b/ &&
|
||||||
$line !~ /\b__bitwise(?:__|)\b/) {
|
$line !~ /\b__bitwise\b/) {
|
||||||
WARN("NEW_TYPEDEFS",
|
WARN("NEW_TYPEDEFS",
|
||||||
"do not add new typedefs\n" . $herecurr);
|
"do not add new typedefs\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
@ -3731,10 +3831,10 @@ sub process {
|
||||||
|
|
||||||
# avoid BUG() or BUG_ON()
|
# avoid BUG() or BUG_ON()
|
||||||
if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
|
if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
|
||||||
my $msg_type = \&WARN;
|
my $msg_level = \&WARN;
|
||||||
$msg_type = \&CHK if ($file);
|
$msg_level = \&CHK if ($file);
|
||||||
&{$msg_type}("AVOID_BUG",
|
&{$msg_level}("AVOID_BUG",
|
||||||
"Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr);
|
"Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
# avoid LINUX_VERSION_CODE
|
# avoid LINUX_VERSION_CODE
|
||||||
|
@ -3840,7 +3940,7 @@ sub process {
|
||||||
my $fixedline = rtrim($prevrawline) . " {";
|
my $fixedline = rtrim($prevrawline) . " {";
|
||||||
fix_insert_line($fixlinenr, $fixedline);
|
fix_insert_line($fixlinenr, $fixedline);
|
||||||
$fixedline = $rawline;
|
$fixedline = $rawline;
|
||||||
$fixedline =~ s/^(.\s*){\s*/$1\t/;
|
$fixedline =~ s/^(.\s*)\{\s*/$1\t/;
|
||||||
if ($fixedline !~ /^\+\s*$/) {
|
if ($fixedline !~ /^\+\s*$/) {
|
||||||
fix_insert_line($fixlinenr, $fixedline);
|
fix_insert_line($fixlinenr, $fixedline);
|
||||||
}
|
}
|
||||||
|
@ -4261,11 +4361,11 @@ sub process {
|
||||||
|
|
||||||
# messages are ERROR, but ?: are CHK
|
# messages are ERROR, but ?: are CHK
|
||||||
if ($ok == 0) {
|
if ($ok == 0) {
|
||||||
my $msg_type = \&ERROR;
|
my $msg_level = \&ERROR;
|
||||||
$msg_type = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
|
$msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
|
||||||
|
|
||||||
if (&{$msg_type}("SPACING",
|
if (&{$msg_level}("SPACING",
|
||||||
"spaces required around that '$op' $at\n" . $hereptr)) {
|
"spaces required around that '$op' $at\n" . $hereptr)) {
|
||||||
$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
|
$good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
|
||||||
if (defined $fix_elements[$n + 2]) {
|
if (defined $fix_elements[$n + 2]) {
|
||||||
$fix_elements[$n + 2] =~ s/^\s+//;
|
$fix_elements[$n + 2] =~ s/^\s+//;
|
||||||
|
@ -4330,7 +4430,7 @@ sub process {
|
||||||
if (ERROR("SPACING",
|
if (ERROR("SPACING",
|
||||||
"space required before the open brace '{'\n" . $herecurr) &&
|
"space required before the open brace '{'\n" . $herecurr) &&
|
||||||
$fix) {
|
$fix) {
|
||||||
$fixed[$fixlinenr] =~ s/^(\+.*(?:do|\))){/$1 {/;
|
$fixed[$fixlinenr] =~ s/^(\+.*(?:do|\)))\{/$1 {/;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4418,6 +4518,30 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# check for unnecessary parentheses around comparisons in if uses
|
||||||
|
if ($^V && $^V ge 5.10.0 && defined($stat) &&
|
||||||
|
$stat =~ /(^.\s*if\s*($balanced_parens))/) {
|
||||||
|
my $if_stat = $1;
|
||||||
|
my $test = substr($2, 1, -1);
|
||||||
|
my $herectx;
|
||||||
|
while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) {
|
||||||
|
my $match = $1;
|
||||||
|
# avoid parentheses around potential macro args
|
||||||
|
next if ($match =~ /^\s*\w+\s*$/);
|
||||||
|
if (!defined($herectx)) {
|
||||||
|
$herectx = $here . "\n";
|
||||||
|
my $cnt = statement_rawlines($if_stat);
|
||||||
|
for (my $n = 0; $n < $cnt; $n++) {
|
||||||
|
my $rl = raw_line($linenr, $n);
|
||||||
|
$herectx .= $rl . "\n";
|
||||||
|
last if $rl =~ /^[ \+].*\{/;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CHK("UNNECESSARY_PARENTHESES",
|
||||||
|
"Unnecessary parentheses around '$match'\n" . $herectx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#goto labels aren't indented, allow a single space however
|
#goto labels aren't indented, allow a single space however
|
||||||
if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
|
if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
|
||||||
!($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
|
!($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
|
||||||
|
@ -4828,12 +4952,14 @@ sub process {
|
||||||
$dstat !~ /^\(\{/ && # ({...
|
$dstat !~ /^\(\{/ && # ({...
|
||||||
$ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
|
$ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
|
||||||
{
|
{
|
||||||
|
if ($dstat =~ /^\s*if\b/) {
|
||||||
if ($dstat =~ /;/) {
|
ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
|
||||||
WARN("MULTISTATEMENT_MACRO_USE_DO_WHILE",
|
"Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx");
|
||||||
|
} elsif ($dstat =~ /;/) {
|
||||||
|
ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
|
||||||
"Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
|
"Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
|
||||||
} else {
|
} else {
|
||||||
WARN("COMPLEX_MACRO",
|
ERROR("COMPLEX_MACRO",
|
||||||
"Macros with complex values should be enclosed in parentheses\n" . "$herectx");
|
"Macros with complex values should be enclosed in parentheses\n" . "$herectx");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4858,23 +4984,23 @@ sub process {
|
||||||
|
|
||||||
# check if any macro arguments are reused (ignore '...' and 'type')
|
# check if any macro arguments are reused (ignore '...' and 'type')
|
||||||
foreach my $arg (@def_args) {
|
foreach my $arg (@def_args) {
|
||||||
next if ($arg =~ /\.\.\./);
|
next if ($arg =~ /\.\.\./);
|
||||||
next if ($arg =~ /^type$/i);
|
next if ($arg =~ /^type$/i);
|
||||||
my $tmp = $define_stmt;
|
my $tmp_stmt = $define_stmt;
|
||||||
$tmp =~ s/\b(typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
|
$tmp_stmt =~ s/\b(typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
|
||||||
$tmp =~ s/\#+\s*$arg\b//g;
|
$tmp_stmt =~ s/\#+\s*$arg\b//g;
|
||||||
$tmp =~ s/\b$arg\s*\#\#//g;
|
$tmp_stmt =~ s/\b$arg\s*\#\#//g;
|
||||||
my $use_cnt = $tmp =~ s/\b$arg\b//g;
|
my $use_cnt = $tmp_stmt =~ s/\b$arg\b//g;
|
||||||
if ($use_cnt > 1) {
|
if ($use_cnt > 1) {
|
||||||
CHK("MACRO_ARG_REUSE",
|
CHK("MACRO_ARG_REUSE",
|
||||||
"Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");
|
"Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");
|
||||||
}
|
}
|
||||||
# check if any macro arguments may have other precedence issues
|
# check if any macro arguments may have other precedence issues
|
||||||
if ($define_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
|
if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
|
||||||
((defined($1) && $1 ne ',') ||
|
((defined($1) && $1 ne ',') ||
|
||||||
(defined($2) && $2 ne ','))) {
|
(defined($2) && $2 ne ','))) {
|
||||||
CHK("MACRO_ARG_PRECEDENCE",
|
CHK("MACRO_ARG_PRECEDENCE",
|
||||||
"Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx");
|
"Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5083,6 +5209,12 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# check for single line unbalanced braces
|
||||||
|
if ($sline =~ /^.\s*\}\s*else\s*$/ ||
|
||||||
|
$sline =~ /^.\s*else\s*\{\s*$/) {
|
||||||
|
CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr);
|
||||||
|
}
|
||||||
|
|
||||||
# check for unnecessary blank lines around braces
|
# check for unnecessary blank lines around braces
|
||||||
if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
|
if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
|
||||||
if (CHK("BRACES",
|
if (CHK("BRACES",
|
||||||
|
@ -5103,7 +5235,7 @@ sub process {
|
||||||
my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
|
my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
|
||||||
if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
|
if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
|
||||||
WARN("VOLATILE",
|
WARN("VOLATILE",
|
||||||
"Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr);
|
"Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check for user-visible strings broken across lines, which breaks the ability
|
# Check for user-visible strings broken across lines, which breaks the ability
|
||||||
|
@ -5145,6 +5277,18 @@ sub process {
|
||||||
"break quoted strings at a space character\n" . $hereprev);
|
"break quoted strings at a space character\n" . $hereprev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# check for an embedded function name in a string when the function is known
|
||||||
|
# This does not work very well for -f --file checking as it depends on patch
|
||||||
|
# context providing the function name or a single line form for in-file
|
||||||
|
# function declarations
|
||||||
|
if ($line =~ /^\+.*$String/ &&
|
||||||
|
defined($context_function) &&
|
||||||
|
get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
|
||||||
|
length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
|
||||||
|
WARN("EMBEDDED_FUNCTION_NAME",
|
||||||
|
"Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr);
|
||||||
|
}
|
||||||
|
|
||||||
# check for spaces before a quoted newline
|
# check for spaces before a quoted newline
|
||||||
if ($rawline =~ /^.*\".*\s\\n/) {
|
if ($rawline =~ /^.*\".*\s\\n/) {
|
||||||
if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
|
if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
|
||||||
|
@ -5167,18 +5311,27 @@ sub process {
|
||||||
"Consecutive strings are generally better as a single string\n" . $herecurr);
|
"Consecutive strings are generally better as a single string\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
# check for %L{u,d,i} and 0x%[udi] in strings
|
# check for non-standard and hex prefixed decimal printf formats
|
||||||
my $string;
|
my $show_L = 1; #don't show the same defect twice
|
||||||
|
my $show_Z = 1;
|
||||||
while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
|
while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
|
||||||
$string = substr($rawline, $-[1], $+[1] - $-[1]);
|
my $string = substr($rawline, $-[1], $+[1] - $-[1]);
|
||||||
$string =~ s/%%/__/g;
|
$string =~ s/%%/__/g;
|
||||||
if ($string =~ /(?<!%)%[\*\d\.\$]*L[udi]/) {
|
# check for %L
|
||||||
|
if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
|
||||||
WARN("PRINTF_L",
|
WARN("PRINTF_L",
|
||||||
"\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr);
|
"\%L$1 is non-standard C, use %ll$1\n" . $herecurr);
|
||||||
last;
|
$show_L = 0;
|
||||||
}
|
}
|
||||||
if ($string =~ /0x%[\*\d\.\$\Llzth]*[udi]/) {
|
# check for %Z
|
||||||
ERROR("PRINTF_0xDECIMAL",
|
if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) {
|
||||||
|
WARN("PRINTF_Z",
|
||||||
|
"%Z$1 is non-standard C, use %z$1\n" . $herecurr);
|
||||||
|
$show_Z = 0;
|
||||||
|
}
|
||||||
|
# check for 0x<decimal>
|
||||||
|
if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) {
|
||||||
|
ERROR("PRINTF_0XDECIMAL",
|
||||||
"Prefixing 0x with decimal output is defective\n" . $herecurr);
|
"Prefixing 0x with decimal output is defective\n" . $herecurr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5240,7 +5393,7 @@ sub process {
|
||||||
my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
|
my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
|
||||||
# print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
|
# print("line: <$line>\nprevline: <$prevline>\ns: <$s>\nc: <$c>\n\n\n");
|
||||||
|
|
||||||
if ($c =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|(?:dev_)?alloc_skb)/) {
|
if ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|kmemdup|(?:dev_)?alloc_skb)/) {
|
||||||
WARN("OOM_MESSAGE",
|
WARN("OOM_MESSAGE",
|
||||||
"Possible unnecessary 'out of memory' message\n" . $hereprev);
|
"Possible unnecessary 'out of memory' message\n" . $hereprev);
|
||||||
}
|
}
|
||||||
|
@ -5257,6 +5410,12 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# check for logging continuations
|
||||||
|
if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) {
|
||||||
|
WARN("LOGGING_CONTINUATION",
|
||||||
|
"Avoid logging continuation uses where feasible\n" . $herecurr);
|
||||||
|
}
|
||||||
|
|
||||||
# check for mask then right shift without a parentheses
|
# check for mask then right shift without a parentheses
|
||||||
if ($^V && $^V ge 5.10.0 &&
|
if ($^V && $^V ge 5.10.0 &&
|
||||||
$line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
|
$line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
|
||||||
|
@ -5457,33 +5616,24 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check for expedited grace periods that interrupt non-idle non-nohz
|
|
||||||
# online CPUs. These expedited can therefore degrade real-time response
|
|
||||||
# if used carelessly, and should be avoided where not absolutely
|
|
||||||
# needed. It is always OK to use synchronize_rcu_expedited() and
|
|
||||||
# synchronize_sched_expedited() at boot time (before real-time applications
|
|
||||||
# start) and in error situations where real-time response is compromised in
|
|
||||||
# any case. Note that synchronize_srcu_expedited() does -not- interrupt
|
|
||||||
# other CPUs, so don't warn on uses of synchronize_srcu_expedited().
|
|
||||||
# Of course, nothing comes for free, and srcu_read_lock() and
|
|
||||||
# srcu_read_unlock() do contain full memory barriers in payment for
|
|
||||||
# synchronize_srcu_expedited() non-interruption properties.
|
|
||||||
if ($line =~ /\b(synchronize_rcu_expedited|synchronize_sched_expedited)\(/) {
|
|
||||||
WARN("EXPEDITED_RCU_GRACE_PERIOD",
|
|
||||||
"expedited RCU grace periods should be avoided where they can degrade real-time response\n" . $herecurr);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
# check of hardware specific defines
|
# check of hardware specific defines
|
||||||
if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
|
if ($line =~ m@^.\s*\#\s*if.*\b(__i386__|__powerpc64__|__sun__|__s390x__)\b@ && $realfile !~ m@include/asm-@) {
|
||||||
CHK("ARCH_DEFINES",
|
CHK("ARCH_DEFINES",
|
||||||
"architecture specific defines should be avoided\n" . $herecurr);
|
"architecture specific defines should be avoided\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check that the storage class is at the beginning of a declaration
|
# check that the storage class is not after a type
|
||||||
if ($line =~ /\b$Storage\b/ && $line !~ /^.\s*$Storage\b/) {
|
if ($line =~ /\b($Type)\s+($Storage)\b/) {
|
||||||
WARN("STORAGE_CLASS",
|
WARN("STORAGE_CLASS",
|
||||||
"storage class should be at the beginning of the declaration\n" . $herecurr)
|
"storage class '$2' should be located before type '$1'\n" . $herecurr);
|
||||||
|
}
|
||||||
|
# Check that the storage class is at the beginning of a declaration
|
||||||
|
if ($line =~ /\b$Storage\b/ &&
|
||||||
|
$line !~ /^.\s*$Storage/ &&
|
||||||
|
$line =~ /^.\s*(.+?)\$Storage\s/ &&
|
||||||
|
$1 !~ /[\,\)]\s*$/) {
|
||||||
|
WARN("STORAGE_CLASS",
|
||||||
|
"storage class should be at the beginning of the declaration\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
# check the location of the inline attribute, that it is between
|
# check the location of the inline attribute, that it is between
|
||||||
|
@ -5617,6 +5767,32 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# check for vsprintf extension %p<foo> misuses
|
||||||
|
if ($^V && $^V ge 5.10.0 &&
|
||||||
|
defined $stat &&
|
||||||
|
$stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
|
||||||
|
$1 !~ /^_*volatile_*$/) {
|
||||||
|
my $bad_extension = "";
|
||||||
|
my $lc = $stat =~ tr@\n@@;
|
||||||
|
$lc = $lc + $linenr;
|
||||||
|
for (my $count = $linenr; $count <= $lc; $count++) {
|
||||||
|
my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
|
||||||
|
$fmt =~ s/%%//g;
|
||||||
|
if ($fmt =~ /(\%[\*\d\.]*p(?![\WFfSsBKRraEhMmIiUDdgVCbGNO]).)/) {
|
||||||
|
$bad_extension = $1;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($bad_extension ne "") {
|
||||||
|
my $stat_real = raw_line($linenr, 0);
|
||||||
|
for (my $count = $linenr + 1; $count <= $lc; $count++) {
|
||||||
|
$stat_real = $stat_real . "\n" . raw_line($count, 0);
|
||||||
|
}
|
||||||
|
WARN("VSPRINTF_POINTER_EXTENSION",
|
||||||
|
"Invalid vsprintf pointer extension '$bad_extension'\n" . "$here\n$stat_real\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Check for misused memsets
|
# Check for misused memsets
|
||||||
if ($^V && $^V ge 5.10.0 &&
|
if ($^V && $^V ge 5.10.0 &&
|
||||||
defined $stat &&
|
defined $stat &&
|
||||||
|
@ -5795,7 +5971,8 @@ sub process {
|
||||||
"externs should be avoided in .c files\n" . $herecurr);
|
"externs should be avoided in .c files\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($realfile =~ /\.[ch]$/ && defined $stat &&
|
# check for function declarations that have arguments without identifier names
|
||||||
|
if (defined $stat &&
|
||||||
$stat =~ /^.\s*(?:extern\s+)?$Type\s*$Ident\s*\(\s*([^{]+)\s*\)\s*;/s &&
|
$stat =~ /^.\s*(?:extern\s+)?$Type\s*$Ident\s*\(\s*([^{]+)\s*\)\s*;/s &&
|
||||||
$1 ne "void") {
|
$1 ne "void") {
|
||||||
my $args = trim($1);
|
my $args = trim($1);
|
||||||
|
@ -5808,13 +5985,36 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# check for function definitions
|
||||||
|
if ($^V && $^V ge 5.10.0 &&
|
||||||
|
defined $stat &&
|
||||||
|
$stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) {
|
||||||
|
$context_function = $1;
|
||||||
|
|
||||||
|
# check for multiline function definition with misplaced open brace
|
||||||
|
my $ok = 0;
|
||||||
|
my $cnt = statement_rawlines($stat);
|
||||||
|
my $herectx = $here . "\n";
|
||||||
|
for (my $n = 0; $n < $cnt; $n++) {
|
||||||
|
my $rl = raw_line($linenr, $n);
|
||||||
|
$herectx .= $rl . "\n";
|
||||||
|
$ok = 1 if ($rl =~ /^[ \+]\{/);
|
||||||
|
$ok = 1 if ($rl =~ /\{/ && $n == 0);
|
||||||
|
last if $rl =~ /^[ \+].*\{/;
|
||||||
|
}
|
||||||
|
if (!$ok) {
|
||||||
|
ERROR("OPEN_BRACE",
|
||||||
|
"open brace '{' following function definitions go on the next line\n" . $herectx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# checks for new __setup's
|
# checks for new __setup's
|
||||||
if ($rawline =~ /\b__setup\("([^"]*)"/) {
|
if ($rawline =~ /\b__setup\("([^"]*)"/) {
|
||||||
my $name = $1;
|
my $name = $1;
|
||||||
|
|
||||||
if (!grep(/$name/, @setup_docs)) {
|
if (!grep(/$name/, @setup_docs)) {
|
||||||
CHK("UNDOCUMENTED_SETUP",
|
CHK("UNDOCUMENTED_SETUP",
|
||||||
"__setup appears un-documented -- check Documentation/kernel-parameters.txt\n" . $herecurr);
|
"__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.rst\n" . $herecurr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5834,7 +6034,8 @@ sub process {
|
||||||
|
|
||||||
# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
|
# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc
|
||||||
if ($^V && $^V ge 5.10.0 &&
|
if ($^V && $^V ge 5.10.0 &&
|
||||||
$line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
|
defined $stat &&
|
||||||
|
$stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
|
||||||
my $oldfunc = $3;
|
my $oldfunc = $3;
|
||||||
my $a1 = $4;
|
my $a1 = $4;
|
||||||
my $a2 = $10;
|
my $a2 = $10;
|
||||||
|
@ -5848,11 +6049,17 @@ sub process {
|
||||||
}
|
}
|
||||||
if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
|
if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
|
||||||
!($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
|
!($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
|
||||||
|
my $ctx = '';
|
||||||
|
my $herectx = $here . "\n";
|
||||||
|
my $cnt = statement_rawlines($stat);
|
||||||
|
for (my $n = 0; $n < $cnt; $n++) {
|
||||||
|
$herectx .= raw_line($linenr, $n) . "\n";
|
||||||
|
}
|
||||||
if (WARN("ALLOC_WITH_MULTIPLY",
|
if (WARN("ALLOC_WITH_MULTIPLY",
|
||||||
"Prefer $newfunc over $oldfunc with multiply\n" . $herecurr) &&
|
"Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&
|
||||||
|
$cnt == 1 &&
|
||||||
$fix) {
|
$fix) {
|
||||||
$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;
|
$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;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5922,7 +6129,7 @@ sub process {
|
||||||
}
|
}
|
||||||
if (!$has_break && $has_statement) {
|
if (!$has_break && $has_statement) {
|
||||||
WARN("MISSING_BREAK",
|
WARN("MISSING_BREAK",
|
||||||
"Possible switch case/default not preceeded by break or fallthrough comment\n" . $herecurr);
|
"Possible switch case/default not preceded by break or fallthrough comment\n" . $herecurr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6007,11 +6214,11 @@ sub process {
|
||||||
}
|
}
|
||||||
|
|
||||||
# check for various structs that are normally const (ops, kgdb, device_tree)
|
# check for various structs that are normally const (ops, kgdb, device_tree)
|
||||||
|
# and avoid what seem like struct definitions 'struct foo {'
|
||||||
if ($line !~ /\bconst\b/ &&
|
if ($line !~ /\bconst\b/ &&
|
||||||
$line =~ /\bstruct\s+($const_structs)\b/) {
|
$line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
|
||||||
WARN("CONST_STRUCT",
|
WARN("CONST_STRUCT",
|
||||||
"struct $1 should normally be const\n" .
|
"struct $1 should normally be const\n" . $herecurr);
|
||||||
$herecurr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# use of NR_CPUS is usually wrong
|
# use of NR_CPUS is usually wrong
|
||||||
|
@ -6073,6 +6280,12 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# check for mutex_trylock_recursive usage
|
||||||
|
if ($line =~ /mutex_trylock_recursive/) {
|
||||||
|
ERROR("LOCKING",
|
||||||
|
"recursive locking is bad, do not use this ever.\n" . $herecurr);
|
||||||
|
}
|
||||||
|
|
||||||
# check for lockdep_set_novalidate_class
|
# check for lockdep_set_novalidate_class
|
||||||
if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
|
if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
|
||||||
$line =~ /__lockdep_no_validate__\s*\)/ ) {
|
$line =~ /__lockdep_no_validate__\s*\)/ ) {
|
||||||
|
@ -6217,6 +6430,16 @@ sub process {
|
||||||
|
|
||||||
NOTE: For some of the reported defects, checkpatch may be able to
|
NOTE: For some of the reported defects, checkpatch may be able to
|
||||||
mechanically convert to the typical style using --fix or --fix-inplace.
|
mechanically convert to the typical style using --fix or --fix-inplace.
|
||||||
|
EOM
|
||||||
|
}
|
||||||
|
# If there were whitespace errors which cleanpatch can fix
|
||||||
|
# then suggest that.
|
||||||
|
if ($rpt_cleaners) {
|
||||||
|
$rpt_cleaners = 0;
|
||||||
|
print << "EOM"
|
||||||
|
|
||||||
|
NOTE: Whitespace errors detected.
|
||||||
|
You may wish to use scripts/cleanpatch or scripts/cleanfile
|
||||||
EOM
|
EOM
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue