ANDROID: Snapshot Mainline's version of checkpatch.pl
Nothing fancy here. Keeping full history is not required. `git checkout mainline/master -- scripts/checkpatch.pl` This may need to be done periodically. Bug: 316492624 Signed-off-by: Lee Jones <joneslee@google.com> Change-Id: I4c90b50197ca7277c59e96bf332ecf795c4f3d12
This commit is contained in:
parent
4fa87d4d8f
commit
ac1031618a
@ -74,6 +74,8 @@ my $git_command ='export LANGUAGE=en_US.UTF-8; git';
|
||||
my $tabsize = 8;
|
||||
my ${CONFIG_} = "CONFIG_";
|
||||
|
||||
my %maybe_linker_symbol; # for externs in c exceptions, when seen in *vmlinux.lds.h
|
||||
|
||||
sub help {
|
||||
my ($exitcode) = @_;
|
||||
|
||||
@ -620,6 +622,22 @@ our $signature_tags = qr{(?xi:
|
||||
Cc:
|
||||
)};
|
||||
|
||||
our @link_tags = qw(Link Closes);
|
||||
|
||||
#Create a search and print patterns for all these strings to be used directly below
|
||||
our $link_tags_search = "";
|
||||
our $link_tags_print = "";
|
||||
foreach my $entry (@link_tags) {
|
||||
if ($link_tags_search ne "") {
|
||||
$link_tags_search .= '|';
|
||||
$link_tags_print .= ' or ';
|
||||
}
|
||||
$entry .= ':';
|
||||
$link_tags_search .= $entry;
|
||||
$link_tags_print .= "'$entry'";
|
||||
}
|
||||
$link_tags_search = "(?:${link_tags_search})";
|
||||
|
||||
our $tracing_logging_tags = qr{(?xi:
|
||||
[=-]*> |
|
||||
<[=-]* |
|
||||
@ -702,6 +720,17 @@ sub find_standard_signature {
|
||||
return "";
|
||||
}
|
||||
|
||||
our $obsolete_archives = qr{(?xi:
|
||||
\Qfreedesktop.org/archives/dri-devel\E |
|
||||
\Qlists.infradead.org\E |
|
||||
\Qlkml.org\E |
|
||||
\Qmail-archive.com\E |
|
||||
\Qmailman.alsa-project.org/pipermail\E |
|
||||
\Qmarc.info\E |
|
||||
\Qozlabs.org/pipermail\E |
|
||||
\Qspinics.net\E
|
||||
)};
|
||||
|
||||
our @typeListMisordered = (
|
||||
qr{char\s+(?:un)?signed},
|
||||
qr{int\s+(?:(?:un)?signed\s+)?short\s},
|
||||
@ -812,7 +841,9 @@ our %deprecated_apis = (
|
||||
"get_state_synchronize_sched" => "get_state_synchronize_rcu",
|
||||
"cond_synchronize_sched" => "cond_synchronize_rcu",
|
||||
"kmap" => "kmap_local_page",
|
||||
"kunmap" => "kunmap_local",
|
||||
"kmap_atomic" => "kmap_local_page",
|
||||
"kunmap_atomic" => "kunmap_local",
|
||||
);
|
||||
|
||||
#Create a search pattern for all these strings to speed up a loop below
|
||||
@ -3131,21 +3162,33 @@ sub process {
|
||||
if ($sign_off =~ /^co-developed-by:$/i) {
|
||||
if ($email eq $author) {
|
||||
WARN("BAD_SIGN_OFF",
|
||||
"Co-developed-by: should not be used to attribute nominal patch author '$author'\n" . "$here\n" . $rawline);
|
||||
"Co-developed-by: should not be used to attribute nominal patch author '$author'\n" . $herecurr);
|
||||
}
|
||||
if (!defined $lines[$linenr]) {
|
||||
WARN("BAD_SIGN_OFF",
|
||||
"Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline);
|
||||
} elsif ($rawlines[$linenr] !~ /^\s*signed-off-by:\s*(.*)/i) {
|
||||
"Co-developed-by: must be immediately followed by Signed-off-by:\n" . $herecurr);
|
||||
} elsif ($rawlines[$linenr] !~ /^signed-off-by:\s*(.*)/i) {
|
||||
WARN("BAD_SIGN_OFF",
|
||||
"Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]);
|
||||
"Co-developed-by: must be immediately followed by Signed-off-by:\n" . $herecurr . $rawlines[$linenr] . "\n");
|
||||
} elsif ($1 ne $email) {
|
||||
WARN("BAD_SIGN_OFF",
|
||||
"Co-developed-by and Signed-off-by: name/email do not match \n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]);
|
||||
"Co-developed-by and Signed-off-by: name/email do not match\n" . $herecurr . $rawlines[$linenr] . "\n");
|
||||
}
|
||||
}
|
||||
|
||||
# check if Reported-by: is followed by a Closes: tag
|
||||
if ($sign_off =~ /^reported(?:|-and-tested)-by:$/i) {
|
||||
if (!defined $lines[$linenr]) {
|
||||
WARN("BAD_REPORTED_BY_LINK",
|
||||
"Reported-by: should be immediately followed by Closes: with a URL to the report\n" . $herecurr . "\n");
|
||||
} elsif ($rawlines[$linenr] !~ /^closes:\s*/i) {
|
||||
WARN("BAD_REPORTED_BY_LINK",
|
||||
"Reported-by: should be immediately followed by Closes: with a URL to the report\n" . $herecurr . $rawlines[$linenr] . "\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Check Fixes: styles is correct
|
||||
if (!$in_header_lines &&
|
||||
$line =~ /^\s*fixes:?\s*(?:commit\s*)?[0-9a-f]{5,}\b/i) {
|
||||
@ -3225,11 +3268,11 @@ sub process {
|
||||
# file delta changes
|
||||
$line =~ /^\s*(?:[\w\.\-\+]*\/)++[\w\.\-\+]+:/ ||
|
||||
# filename then :
|
||||
$line =~ /^\s*(?:Fixes:|Link:|$signature_tags)/i ||
|
||||
# A Fixes: or Link: line or signature tag line
|
||||
$line =~ /^\s*(?:Fixes:|$link_tags_search|$signature_tags)/i ||
|
||||
# A Fixes:, link or signature tag line
|
||||
$commit_log_possible_stack_dump)) {
|
||||
WARN("COMMIT_LOG_LONG_LINE",
|
||||
"Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr);
|
||||
"Prefer a maximum 75 chars per line (possible unwrapped commit description?)\n" . $herecurr);
|
||||
$commit_log_long_line = 1;
|
||||
}
|
||||
|
||||
@ -3239,6 +3282,29 @@ sub process {
|
||||
$commit_log_possible_stack_dump = 0;
|
||||
}
|
||||
|
||||
# Check for odd tags before a URI/URL
|
||||
if ($in_commit_log &&
|
||||
$line =~ /^\s*(\w+:)\s*http/ && $1 !~ /^$link_tags_search$/) {
|
||||
if ($1 =~ /^v(?:ersion)?\d+/i) {
|
||||
WARN("COMMIT_LOG_VERSIONING",
|
||||
"Patch version information should be after the --- line\n" . $herecurr);
|
||||
} else {
|
||||
WARN("COMMIT_LOG_USE_LINK",
|
||||
"Unknown link reference '$1', use $link_tags_print instead\n" . $herecurr);
|
||||
}
|
||||
}
|
||||
|
||||
# Check for misuse of the link tags
|
||||
if ($in_commit_log &&
|
||||
$line =~ /^\s*(\w+:)\s*(\S+)/) {
|
||||
my $tag = $1;
|
||||
my $value = $2;
|
||||
if ($tag =~ /^$link_tags_search$/ && $value !~ m{^https?://}) {
|
||||
WARN("COMMIT_LOG_WRONG_LINK",
|
||||
"'$tag' should be followed by a public http(s) link\n" . $herecurr);
|
||||
}
|
||||
}
|
||||
|
||||
# Check for lines starting with a #
|
||||
if ($in_commit_log && $line =~ /^#/) {
|
||||
if (WARN("COMMIT_COMMENT_SYMBOL",
|
||||
@ -3324,6 +3390,12 @@ sub process {
|
||||
$last_git_commit_id_linenr = $linenr if ($line =~ /\bcommit\s*$/i);
|
||||
}
|
||||
|
||||
# Check for mailing list archives other than lore.kernel.org
|
||||
if ($rawline =~ m{http.*\b$obsolete_archives}) {
|
||||
WARN("PREFER_LORE_ARCHIVE",
|
||||
"Use lore.kernel.org archive links when possible - see https://lore.kernel.org/lists.html\n" . $herecurr);
|
||||
}
|
||||
|
||||
# Check for added, moved or deleted files
|
||||
if (!$reported_maintainer_file && !$in_commit_log &&
|
||||
($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
|
||||
@ -3693,7 +3765,7 @@ sub process {
|
||||
"'$spdx_license' is not supported in LICENSES/...\n" . $herecurr);
|
||||
}
|
||||
if ($realfile =~ m@^Documentation/devicetree/bindings/@ &&
|
||||
not $spdx_license =~ /GPL-2\.0.*BSD-2-Clause/) {
|
||||
$spdx_license !~ /GPL-2\.0(?:-only)? OR BSD-2-Clause/) {
|
||||
my $msg_level = \&WARN;
|
||||
$msg_level = \&CHK if ($file);
|
||||
if (&{$msg_level}("SPDX_LICENSE_TAG",
|
||||
@ -3703,12 +3775,17 @@ sub process {
|
||||
$fixed[$fixlinenr] =~ s/SPDX-License-Identifier: .*/SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)/;
|
||||
}
|
||||
}
|
||||
if ($realfile =~ m@^include/dt-bindings/@ &&
|
||||
$spdx_license !~ /GPL-2\.0(?:-only)? OR \S+/) {
|
||||
WARN("SPDX_LICENSE_TAG",
|
||||
"DT binding headers should be licensed (GPL-2.0-only OR .*)\n" . $herecurr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# check for embedded filenames
|
||||
if ($rawline =~ /^\+.*\Q$realfile\E/) {
|
||||
if ($rawline =~ /^\+.*\b\Q$realfile\E\b/) {
|
||||
WARN("EMBEDDED_FILENAME",
|
||||
"It's generally not useful to have the filename in the file\n" . $herecurr);
|
||||
}
|
||||
@ -4971,7 +5048,7 @@ sub process {
|
||||
if|for|while|switch|return|case|
|
||||
volatile|__volatile__|
|
||||
__attribute__|format|__extension__|
|
||||
asm|__asm__)$/x)
|
||||
asm|__asm__|scoped_guard)$/x)
|
||||
{
|
||||
# cpp #define statements have non-optional spaces, ie
|
||||
# if there is a space between the name and the open
|
||||
@ -5766,6 +5843,8 @@ sub process {
|
||||
$var !~ /^(?:[A-Z]+_){1,5}[A-Z]{1,3}[a-z]/ &&
|
||||
#Ignore Page<foo> variants
|
||||
$var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
|
||||
#Ignore ETHTOOL_LINK_MODE_<foo> variants
|
||||
$var !~ /^ETHTOOL_LINK_MODE_/ &&
|
||||
#Ignore SI style variants like nS, mV and dB
|
||||
#(ie: max_uV, regulator_min_uA_show, RANGE_mA_VALUE)
|
||||
$var !~ /^(?:[a-z0-9_]*|[A-Z0-9_]*)?_?[a-z][A-Z](?:_[a-z0-9_]+|_[A-Z0-9_]+)?$/ &&
|
||||
@ -5901,6 +5980,7 @@ sub process {
|
||||
$dstat !~ /$exceptions/ &&
|
||||
$dstat !~ /^\.$Ident\s*=/ && # .foo =
|
||||
$dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ && # stringification #foo
|
||||
$dstat !~ /^case\b/ && # case ...
|
||||
$dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ && # do {...} while (...); // do {...} while (...)
|
||||
$dstat !~ /^while\s*$Constant\s*$Constant\s*$/ && # while (...) {...}
|
||||
$dstat !~ /^for\s*$Constant$/ && # for (...)
|
||||
@ -5973,6 +6053,9 @@ sub process {
|
||||
|
||||
# check for line continuations outside of #defines, preprocessor #, and asm
|
||||
|
||||
} elsif ($realfile =~ m@/vmlinux.lds.h$@) {
|
||||
$line =~ s/(\w+)/$maybe_linker_symbol{$1}++/ge;
|
||||
#print "REAL: $realfile\nln: $line\nkeys:", sort keys %maybe_linker_symbol;
|
||||
} else {
|
||||
if ($prevline !~ /^..*\\$/ &&
|
||||
$line !~ /^\+\s*\#.*\\$/ && # preprocessor
|
||||
@ -6910,10 +6993,22 @@ sub process {
|
||||
# }
|
||||
# }
|
||||
|
||||
# strcpy uses that should likely be strscpy
|
||||
if ($line =~ /\bstrcpy\s*\(/) {
|
||||
WARN("STRCPY",
|
||||
"Prefer strscpy over strcpy - see: https://github.com/KSPP/linux/issues/88\n" . $herecurr);
|
||||
}
|
||||
|
||||
# strlcpy uses that should likely be strscpy
|
||||
if ($line =~ /\bstrlcpy\s*\(/) {
|
||||
WARN("STRLCPY",
|
||||
"Prefer strscpy over strlcpy - see: https://lore.kernel.org/r/CAHk-=wgfRnXz0W3D37d01q3JFkr_i_uTL=V6A6G1oUZcprmknw\@mail.gmail.com/\n" . $herecurr);
|
||||
"Prefer strscpy over strlcpy - see: https://github.com/KSPP/linux/issues/89\n" . $herecurr);
|
||||
}
|
||||
|
||||
# strncpy uses that should likely be strscpy or strscpy_pad
|
||||
if ($line =~ /\bstrncpy\s*\(/) {
|
||||
WARN("STRNCPY",
|
||||
"Prefer strscpy, strscpy_pad, or __nonstring over strncpy - see: https://github.com/KSPP/linux/issues/90\n" . $herecurr);
|
||||
}
|
||||
|
||||
# typecasts on min/max could be min_t/max_t
|
||||
@ -7020,6 +7115,21 @@ sub process {
|
||||
"arguments for function declarations should follow identifier\n" . $herecurr);
|
||||
}
|
||||
|
||||
} elsif ($realfile =~ /\.c$/ && defined $stat &&
|
||||
$stat =~ /^\+extern struct\s+(\w+)\s+(\w+)\[\];/)
|
||||
{
|
||||
my ($st_type, $st_name) = ($1, $2);
|
||||
|
||||
for my $s (keys %maybe_linker_symbol) {
|
||||
#print "Linker symbol? $st_name : $s\n";
|
||||
goto LIKELY_LINKER_SYMBOL
|
||||
if $st_name =~ /$s/;
|
||||
}
|
||||
WARN("AVOID_EXTERNS",
|
||||
"found a file-scoped extern type:$st_type name:$st_name in .c file\n"
|
||||
. "is this a linker symbol ?\n" . $herecurr);
|
||||
LIKELY_LINKER_SYMBOL:
|
||||
|
||||
} elsif ($realfile =~ /\.c$/ && defined $stat &&
|
||||
$stat =~ /^.\s*extern\s+/)
|
||||
{
|
||||
@ -7128,7 +7238,7 @@ sub process {
|
||||
}
|
||||
|
||||
# check for alloc argument mismatch
|
||||
if ($line =~ /\b((?:devm_)?(?:kcalloc|kmalloc_array))\s*\(\s*sizeof\b/) {
|
||||
if ($line =~ /\b((?:devm_)?((?:k|kv)?(calloc|malloc_array)(?:_node)?))\s*\(\s*sizeof\b/) {
|
||||
WARN("ALLOC_ARRAY_ARGS",
|
||||
"$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
|
||||
}
|
||||
@ -7331,6 +7441,16 @@ sub process {
|
||||
}
|
||||
}
|
||||
|
||||
# check for array definition/declarations that should use flexible arrays instead
|
||||
if ($sline =~ /^[\+ ]\s*\}(?:\s*__packed)?\s*;\s*$/ &&
|
||||
$prevline =~ /^\+\s*(?:\}(?:\s*__packed\s*)?|$Type)\s*$Ident\s*\[\s*(0|1)\s*\]\s*;\s*$/) {
|
||||
if (ERROR("FLEXIBLE_ARRAY",
|
||||
"Use C99 flexible arrays - see https://docs.kernel.org/process/deprecated.html#zero-length-and-one-element-arrays\n" . $hereprev) &&
|
||||
$1 == '0' && $fix) {
|
||||
$fixed[$fixlinenr - 1] =~ s/\[\s*0\s*\]/[]/;
|
||||
}
|
||||
}
|
||||
|
||||
# nested likely/unlikely calls
|
||||
if ($line =~ /\b(?:(?:un)?likely)\s*\(\s*!?\s*(IS_ERR(?:_OR_NULL|_VALUE)?|WARN)/) {
|
||||
WARN("LIKELY_MISUSE",
|
||||
@ -7348,6 +7468,30 @@ sub process {
|
||||
}
|
||||
}
|
||||
|
||||
# Complain about RCU Tasks Trace used outside of BPF (and of course, RCU).
|
||||
our $rcu_trace_funcs = qr{(?x:
|
||||
rcu_read_lock_trace |
|
||||
rcu_read_lock_trace_held |
|
||||
rcu_read_unlock_trace |
|
||||
call_rcu_tasks_trace |
|
||||
synchronize_rcu_tasks_trace |
|
||||
rcu_barrier_tasks_trace |
|
||||
rcu_request_urgent_qs_task
|
||||
)};
|
||||
our $rcu_trace_paths = qr{(?x:
|
||||
kernel/bpf/ |
|
||||
include/linux/bpf |
|
||||
net/bpf/ |
|
||||
kernel/rcu/ |
|
||||
include/linux/rcu
|
||||
)};
|
||||
if ($line =~ /\b($rcu_trace_funcs)\s*\(/) {
|
||||
if ($realfile !~ m{^$rcu_trace_paths}) {
|
||||
WARN("RCU_TASKS_TRACE",
|
||||
"use of RCU tasks trace is incorrect outside BPF or core RCU code\n" . $herecurr);
|
||||
}
|
||||
}
|
||||
|
||||
# check for lockdep_set_novalidate_class
|
||||
if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
|
||||
$line =~ /__lockdep_no_validate__\s*\)/ ) {
|
||||
|
Loading…
Reference in New Issue
Block a user