checkpatch.pl: Update to v5.7

Keep the U-Boot changes to $logFunctions

Signed-off-by: Simon Glass <sjg@chromium.org>
[trini: Resync with v5.7 release which changed the default max line
 length, update commit to reflect]
Signed-off-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
Simon Glass 2020-05-22 16:32:35 -06:00 committed by Tom Rini
parent 68ff234331
commit 048a648298

View file

@ -51,7 +51,7 @@ my %ignore_type = ();
my @ignore = (); my @ignore = ();
my $help = 0; my $help = 0;
my $configuration_file = ".checkpatch.conf"; my $configuration_file = ".checkpatch.conf";
my $max_line_length = 80; my $max_line_length = 100;
my $ignore_perl_version = 0; my $ignore_perl_version = 0;
my $minimum_perl_version = 5.10.0; my $minimum_perl_version = 5.10.0;
my $min_conf_desc_length = 4; my $min_conf_desc_length = 4;
@ -61,9 +61,7 @@ my $codespellfile = "/usr/share/codespell/dictionary.txt";
my $conststructsfile = "$D/const_structs.checkpatch"; my $conststructsfile = "$D/const_structs.checkpatch";
my $typedefsfile = ""; my $typedefsfile = "";
my $color = "auto"; my $color = "auto";
my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE my $allow_c99_comments = 1;
# git output parsing needs US English output, so first set backtick child process LANGUAGE
my $git_command ='export LANGUAGE=en_US.UTF-8; git';
sub help { sub help {
my ($exitcode) = @_; my ($exitcode) = @_;
@ -96,7 +94,9 @@ Options:
--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 --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, (default $max_line_length)
if exceeded, warn on patches
requires --strict for use with --file
--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
--no-summary suppress the per-file summary --no-summary suppress the per-file summary
@ -470,19 +470,8 @@ our $logFunctions = qr{(?x:
seq_vprintf|seq_printf|seq_puts seq_vprintf|seq_printf|seq_puts
)}; )};
our $allocFunctions = qr{(?x:
(?:(?:devm_)?
(?:kv|k|v)[czm]alloc(?:_node|_array)? |
kstrdup(?:_const)? |
kmemdup(?:_nul)?) |
(?:\w+)?alloc_skb(?:ip_align)? |
# dev_alloc_skb/netdev_alloc_skb, et al
dma_alloc_coherent
)};
our $signature_tags = qr{(?xi: our $signature_tags = qr{(?xi:
Signed-off-by:| Signed-off-by:|
Co-developed-by:|
Acked-by:| Acked-by:|
Tested-by:| Tested-by:|
Reviewed-by:| Reviewed-by:|
@ -588,27 +577,6 @@ foreach my $entry (@mode_permission_funcs) {
} }
$mode_perms_search = "(?:${mode_perms_search})"; $mode_perms_search = "(?:${mode_perms_search})";
our %deprecated_apis = (
"synchronize_rcu_bh" => "synchronize_rcu",
"synchronize_rcu_bh_expedited" => "synchronize_rcu_expedited",
"call_rcu_bh" => "call_rcu",
"rcu_barrier_bh" => "rcu_barrier",
"synchronize_sched" => "synchronize_rcu",
"synchronize_sched_expedited" => "synchronize_rcu_expedited",
"call_rcu_sched" => "call_rcu",
"rcu_barrier_sched" => "rcu_barrier",
"get_state_synchronize_sched" => "get_state_synchronize_rcu",
"cond_synchronize_sched" => "cond_synchronize_rcu",
);
#Create a search pattern for all these strings to speed up a loop below
our $deprecated_apis_search = "";
foreach my $entry (keys %deprecated_apis) {
$deprecated_apis_search .= '|' if ($deprecated_apis_search ne "");
$deprecated_apis_search .= $entry;
}
$deprecated_apis_search = "(?:${deprecated_apis_search})";
our $mode_perms_world_writable = qr{ our $mode_perms_world_writable = qr{
S_IWUGO | S_IWUGO |
S_IWOTH | S_IWOTH |
@ -908,7 +876,7 @@ sub seed_camelcase_includes {
$camelcase_seeded = 1; $camelcase_seeded = 1;
if (-e ".git") { if (-e ".git") {
my $git_last_include_commit = `${git_command} log --no-merges --pretty=format:"%h%n" -1 -- include`; my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
chomp $git_last_include_commit; chomp $git_last_include_commit;
$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit"; $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
} else { } else {
@ -936,7 +904,7 @@ sub seed_camelcase_includes {
} }
if (-e ".git") { if (-e ".git") {
$files = `${git_command} ls-files "include/*.h"`; $files = `git ls-files "include/*.h"`;
@include_files = split('\n', $files); @include_files = split('\n', $files);
} }
@ -960,13 +928,13 @@ sub git_commit_info {
return ($id, $desc) if ((which("git") eq "") || !(-e ".git")); return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
my $output = `${git_command} log --no-color --format='%H %s' -1 $commit 2>&1`; my $output = `git log --no-color --format='%H %s' -1 $commit 2>&1`;
$output =~ s/^\s*//gm; $output =~ s/^\s*//gm;
my @lines = split("\n", $output); my @lines = split("\n", $output);
return ($id, $desc) if ($#lines < 0); return ($id, $desc) if ($#lines < 0);
if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous/) { if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous\./) {
# Maybe one day convert this block of bash into something that returns # Maybe one day convert this block of bash into something that returns
# all matching commit ids, but it's very slow... # all matching commit ids, but it's very slow...
# #
@ -1010,7 +978,7 @@ if ($git) {
} else { } else {
$git_range = "-1 $commit_expr"; $git_range = "-1 $commit_expr";
} }
my $lines = `${git_command} log --no-color --no-merges --pretty=format:'%H %s' $git_range`; my $lines = `git log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
foreach my $line (split(/\n/, $lines)) { foreach my $line (split(/\n/, $lines)) {
$line =~ /^([0-9a-fA-F]{40,40}) (.*)$/; $line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
next if (!defined($1) || !defined($2)); next if (!defined($1) || !defined($2));
@ -1025,7 +993,6 @@ if ($git) {
} }
my $vname; my $vname;
$allow_c99_comments = !defined $ignore_type{"C99_COMMENT_TOLERANCE"};
for my $filename (@ARGV) { for my $filename (@ARGV) {
my $FILE; my $FILE;
if ($git) { if ($git) {
@ -2691,24 +2658,6 @@ sub process {
} else { } else {
$signatures{$sig_nospace} = 1; $signatures{$sig_nospace} = 1;
} }
# Check Co-developed-by: immediately followed by Signed-off-by: with same name and email
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);
}
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) {
WARN("BAD_SIGN_OFF",
"Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]);
} 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]);
}
}
} }
# Check email subject for common tools that don't need to be mentioned # Check email subject for common tools that don't need to be mentioned
@ -2729,10 +2678,8 @@ sub process {
($line =~ /^\s*(?:WARNING:|BUG:)/ || ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
$line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ || $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||
# timestamp # timestamp
$line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/) || $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/)) {
$line =~ /^(?:\s+\w+:\s+[0-9a-fA-F]+){3,3}/ || # stack dump address
$line =~ /^\s*\#\d+\s*\[[0-9a-fA-F]+\]\s*\w+ at [0-9a-fA-F]+/) {
# stack dump address styles
$commit_log_possible_stack_dump = 1; $commit_log_possible_stack_dump = 1;
} }
@ -2904,17 +2851,6 @@ sub process {
} }
} }
# check for invalid commit id
if ($in_commit_log && $line =~ /(^fixes:|\bcommit)\s+([0-9a-f]{6,40})\b/i) {
my $id;
my $description;
($id, $description) = git_commit_info($2, undef, undef);
if (!defined($id)) {
WARN("UNKNOWN_COMMIT_ID",
"Unknown commit id '$2', maybe rebased or not pulled?\n" . $herecurr);
}
}
# ignore non-hunk lines and lines being removed # ignore non-hunk lines and lines being removed
next if (!$hunk_line || $line =~ /^-/); next if (!$hunk_line || $line =~ /^-/);
@ -3044,7 +2980,7 @@ sub process {
my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g; my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
my $dt_path = $root . "/Documentation/devicetree/bindings/"; my $dt_path = $root . "/Documentation/devicetree/bindings/";
my $vp_file = $dt_path . "vendor-prefixes.yaml"; my $vp_file = $dt_path . "vendor-prefixes.txt";
foreach my $compat (@compats) { foreach my $compat (@compats) {
my $compat2 = $compat; my $compat2 = $compat;
@ -3059,7 +2995,7 @@ sub process {
next if $compat !~ /^([a-zA-Z0-9\-]+)\,/; next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
my $vendor = $1; my $vendor = $1;
`grep -Eq "\\"\\^\Q$vendor\E,\\.\\*\\":" $vp_file`; `grep -Eq "^$vendor\\b" $vp_file`;
if ( $? >> 8 ) { if ( $? >> 8 ) {
WARN("UNDOCUMENTED_DT_STRING", WARN("UNDOCUMENTED_DT_STRING",
"DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr); "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
@ -3083,24 +3019,16 @@ sub process {
$comment = '..'; $comment = '..';
} }
# check SPDX comment style for .[chsS] files
if ($realfile =~ /\.[chsS]$/ &&
$rawline =~ /SPDX-License-Identifier:/ &&
$rawline !~ m@^\+\s*\Q$comment\E\s*@) {
WARN("SPDX_LICENSE_TAG",
"Improper SPDX comment style for '$realfile', please use '$comment' instead\n" . $herecurr);
}
if ($comment !~ /^$/ && if ($comment !~ /^$/ &&
$rawline !~ m@^\+\Q$comment\E SPDX-License-Identifier: @) { $rawline !~ /^\+\Q$comment\E SPDX-License-Identifier: /) {
WARN("SPDX_LICENSE_TAG", WARN("SPDX_LICENSE_TAG",
"Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr); "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr);
} elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) { } elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) {
my $spdx_license = $1; my $spdx_license = $1;
if (!is_SPDX_License_valid($spdx_license)) { if (!is_SPDX_License_valid($spdx_license)) {
WARN("SPDX_LICENSE_TAG", WARN("SPDX_LICENSE_TAG",
"'$spdx_license' is not supported in LICENSES/...\n" . $herecurr); "'$spdx_license' is not supported in LICENSES/...\n" . $herecurr);
} }
} }
} }
} }
@ -3108,14 +3036,6 @@ 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|sh|dtsi|dts)$/); next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
# check for using SPDX-License-Identifier on the wrong line number
if ($realline != $checklicenseline &&
$rawline =~ /\bSPDX-License-Identifier:/ &&
substr($line, @-, @+ - @-) eq "$;" x (@+ - @-)) {
WARN("SPDX_LICENSE_TAG",
"Misplaced SPDX-License-Identifier tag - use line $checklicenseline instead\n" . $herecurr);
}
# line length limit (with some exclusions) # line length limit (with some exclusions)
# #
# There are a few types of lines that may extend beyond $max_line_length: # There are a few types of lines that may extend beyond $max_line_length:
@ -3173,8 +3093,10 @@ sub process {
if ($msg_type ne "" && if ($msg_type ne "" &&
(show_type("LONG_LINE") || show_type($msg_type))) { (show_type("LONG_LINE") || show_type($msg_type))) {
WARN($msg_type, my $msg_level = \&WARN;
"line over $max_line_length characters\n" . $herecurr); $msg_level = \&CHK if ($file);
&{$msg_level}($msg_type,
"line length of $length exceeds $max_line_length columns\n" . $herecurr);
} }
} }
@ -3953,23 +3875,14 @@ sub process {
WARN("STATIC_CONST_CHAR_ARRAY", WARN("STATIC_CONST_CHAR_ARRAY",
"static const char * array should probably be static const char * const\n" . "static const char * array should probably be static const char * const\n" .
$herecurr); $herecurr);
} }
# check for initialized const char arrays that should be static const
if ($line =~ /^\+\s*const\s+(char|unsigned\s+char|_*u8|(?:[us]_)?int8_t)\s+\w+\s*\[\s*(?:\w+\s*)?\]\s*=\s*"/) {
if (WARN("STATIC_CONST_CHAR_ARRAY",
"const array should probably be static const\n" . $herecurr) &&
$fix) {
$fixed[$fixlinenr] =~ s/(^.\s*)const\b/${1}static const/;
}
}
# check for static char foo[] = "bar" declarations. # check for static char foo[] = "bar" declarations.
if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) { if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
WARN("STATIC_CONST_CHAR_ARRAY", WARN("STATIC_CONST_CHAR_ARRAY",
"static char array declaration should probably be static const char\n" . "static char array declaration should probably be static const char\n" .
$herecurr); $herecurr);
} }
# check for const <foo> const where <foo> is not a pointer or array type # check for const <foo> const where <foo> is not a pointer or array type
if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) { if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
@ -4677,7 +4590,7 @@ sub process {
# closing brace should have a space following it when it has anything # closing brace should have a space following it when it has anything
# on the line # on the line
if ($line =~ /}(?!(?:,|;|\)|\}))\S/) { if ($line =~ /}(?!(?:,|;|\)))\S/) {
if (ERROR("SPACING", if (ERROR("SPACING",
"space required after that close brace '}'\n" . $herecurr) && "space required after that close brace '}'\n" . $herecurr) &&
$fix) { $fix) {
@ -5027,6 +4940,17 @@ sub process {
while ($line =~ m{($Constant|$Lval)}g) { while ($line =~ m{($Constant|$Lval)}g) {
my $var = $1; my $var = $1;
#gcc binary extension
if ($var =~ /^$Binary$/) {
if (WARN("GCC_BINARY_CONSTANT",
"Avoid gcc v4.3+ binary constant extension: <$var>\n" . $herecurr) &&
$fix) {
my $hexval = sprintf("0x%x", oct($var));
$fixed[$fixlinenr] =~
s/\b$var\b/$hexval/;
}
}
#CamelCase #CamelCase
if ($var !~ /^$Constant$/ && if ($var !~ /^$Constant$/ &&
$var =~ /[A-Z][a-z]|[a-z][A-Z]/ && $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
@ -5208,7 +5132,7 @@ sub process {
next if ($arg =~ /\.\.\./); next if ($arg =~ /\.\.\./);
next if ($arg =~ /^type$/i); next if ($arg =~ /^type$/i);
my $tmp_stmt = $define_stmt; my $tmp_stmt = $define_stmt;
$tmp_stmt =~ s/\b(sizeof|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_stmt =~ s/\#+\s*$arg\b//g; $tmp_stmt =~ s/\#+\s*$arg\b//g;
$tmp_stmt =~ s/\b$arg\s*\#\#//g; $tmp_stmt =~ s/\b$arg\s*\#\#//g;
my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g; my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g;
@ -5607,8 +5531,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 ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*$allocFunctions\s*\(/ && 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)/) {
$s !~ /\b__GFP_NOWARN\b/ ) {
WARN("OOM_MESSAGE", WARN("OOM_MESSAGE",
"Possible unnecessary 'out of memory' message\n" . $hereprev); "Possible unnecessary 'out of memory' message\n" . $hereprev);
} }
@ -5729,7 +5652,7 @@ sub process {
# ignore udelay's < 10, however # ignore udelay's < 10, however
if (! ($delay < 10) ) { if (! ($delay < 10) ) {
CHK("USLEEP_RANGE", CHK("USLEEP_RANGE",
"usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst\n" . $herecurr); "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr);
} }
if ($delay > 2000) { if ($delay > 2000) {
WARN("LONG_UDELAY", WARN("LONG_UDELAY",
@ -5741,7 +5664,7 @@ sub process {
if ($line =~ /\bmsleep\s*\((\d+)\);/) { if ($line =~ /\bmsleep\s*\((\d+)\);/) {
if ($1 < 20) { if ($1 < 20) {
WARN("MSLEEP", WARN("MSLEEP",
"msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst\n" . $herecurr); "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr);
} }
} }
@ -5890,18 +5813,6 @@ sub process {
"__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr); "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
} }
# Check for __attribute__ section, prefer __section
if ($realfile !~ m@\binclude/uapi/@ &&
$line =~ /\b__attribute__\s*\(\s*\(.*_*section_*\s*\(\s*("[^"]*")/) {
my $old = substr($rawline, $-[1], $+[1] - $-[1]);
my $new = substr($old, 1, -1);
if (WARN("PREFER_SECTION",
"__section($new) is preferred over __attribute__((section($old)))\n" . $herecurr) &&
$fix) {
$fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*_*section_*\s*\(\s*\Q$old\E\s*\)\s*\)\s*\)/__section($new)/;
}
}
# Check for __attribute__ format(printf, prefer __printf # Check for __attribute__ format(printf, prefer __printf
if ($realfile !~ m@\binclude/uapi/@ && if ($realfile !~ m@\binclude/uapi/@ &&
$line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) { $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
@ -6024,7 +5935,7 @@ sub process {
while ($fmt =~ /(\%[\*\d\.]*p(\w))/g) { while ($fmt =~ /(\%[\*\d\.]*p(\w))/g) {
$specifier = $1; $specifier = $1;
$extension = $2; $extension = $2;
if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOxt]/) { if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOx]/) {
$bad_specifier = $specifier; $bad_specifier = $specifier;
last; last;
} }
@ -6144,11 +6055,11 @@ sub process {
my $max = $7; my $max = $7;
if ($min eq $max) { if ($min eq $max) {
WARN("USLEEP_RANGE", WARN("USLEEP_RANGE",
"usleep_range should not use min == max args; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n"); "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
} elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ && } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
$min > $max) { $min > $max) {
WARN("USLEEP_RANGE", WARN("USLEEP_RANGE",
"usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n"); "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n");
} }
} }
@ -6271,8 +6182,8 @@ sub process {
} }
} }
# check for pointless casting of alloc functions # check for pointless casting of kmalloc return
if ($line =~ /\*\s*\)\s*$allocFunctions\b/) { if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
WARN("UNNECESSARY_CASTS", WARN("UNNECESSARY_CASTS",
"unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr); "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
} }
@ -6280,7 +6191,7 @@ sub process {
# alloc style # alloc style
# p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...) # p = alloc(sizeof(struct foo), ...) should be p = alloc(sizeof(*p), ...)
if ($perl_version_ok && if ($perl_version_ok &&
$line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k|v)[mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) { $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*([kv][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
CHK("ALLOC_SIZEOF_STRUCT", CHK("ALLOC_SIZEOF_STRUCT",
"Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr); "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
} }
@ -6443,6 +6354,19 @@ sub process {
} }
} }
# check for bool bitfields
if ($sline =~ /^.\s+bool\s*$Ident\s*:\s*\d+\s*;/) {
WARN("BOOL_BITFIELD",
"Avoid using bool as bitfield. Prefer bool bitfields as unsigned int or u<8|16|32>\n" . $herecurr);
}
# check for bool use in .h files
if ($realfile =~ /\.h$/ &&
$sline =~ /^.\s+bool\s*$Ident\s*(?::\s*d+\s*)?;/) {
CHK("BOOL_MEMBER",
"Avoid using bool structure members because of possible alignment issues - see: https://lkml.org/lkml/2017/11/21/384\n" . $herecurr);
}
# check for semaphores initialized locked # check for semaphores initialized locked
if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) { if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
WARN("CONSIDER_COMPLETION", WARN("CONSIDER_COMPLETION",
@ -6461,20 +6385,6 @@ sub process {
"please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr); "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
} }
# check for spin_is_locked(), suggest lockdep instead
if ($line =~ /\bspin_is_locked\(/) {
WARN("USE_LOCKDEP",
"Where possible, use lockdep_assert_held instead of assertions based on spin_is_locked\n" . $herecurr);
}
# check for deprecated apis
if ($line =~ /\b($deprecated_apis_search)\b\s*\(/) {
my $deprecated_api = $1;
my $new_api = $deprecated_apis{$deprecated_api};
WARN("DEPRECATED_API",
"Deprecated use of '$deprecated_api', prefer '$new_api' instead\n" . $herecurr);
}
# 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 {' # and avoid what seem like struct definitions 'struct foo {'
if ($line !~ /\bconst\b/ && if ($line !~ /\bconst\b/ &&
@ -6509,12 +6419,6 @@ sub process {
"Using $1 should generally have parentheses around the comparison\n" . $herecurr); "Using $1 should generally have parentheses around the comparison\n" . $herecurr);
} }
# nested likely/unlikely calls
if ($line =~ /\b(?:(?:un)?likely)\s*\(\s*!?\s*(IS_ERR(?:_OR_NULL|_VALUE)?|WARN)/) {
WARN("LIKELY_MISUSE",
"nested (un)?likely() calls, $1 already uses unlikely() internally\n" . $herecurr);
}
# whine mightly about in_atomic # whine mightly about in_atomic
if ($line =~ /\bin_atomic\s*\(/) { if ($line =~ /\bin_atomic\s*\(/) {
if ($realfile =~ m@^drivers/@) { if ($realfile =~ m@^drivers/@) {
@ -6674,12 +6578,6 @@ sub process {
"unknown module license " . $extracted_string . "\n" . $herecurr); "unknown module license " . $extracted_string . "\n" . $herecurr);
} }
} }
# check for sysctl duplicate constants
if ($line =~ /\.extra[12]\s*=\s*&(zero|one|int_max)\b/) {
WARN("DUPLICATED_SYSCTL_CONST",
"duplicated sysctl range checking value '$1', consider using the shared one in include/linux/sysctl.h\n" . $herecurr);
}
} }
# If we have no input at all, then there is nothing to report on # If we have no input at all, then there is nothing to report on