mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-21 06:31:31 +00:00
checkpatch.pl: Fully re-sync with v5.7
While commit048a648298
("checkpatch.pl: Update to v5.7") largely re-syncs us with checkpatch.pl from v5.7 there are a number of things missing still. Re-copy the script and again take care to keep our allowed debug prints and now localized checks intact. Fixes:048a648298
("checkpatch.pl: Update to v5.7") Signed-off-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
parent
61139e2a43
commit
c57383b0c2
1 changed files with 302 additions and 106 deletions
|
@ -62,7 +62,10 @@ my $conststructsfile = "$D/const_structs.checkpatch";
|
||||||
my $typedefsfile = "";
|
my $typedefsfile = "";
|
||||||
my $u_boot = 0;
|
my $u_boot = 0;
|
||||||
my $color = "auto";
|
my $color = "auto";
|
||||||
my $allow_c99_comments = 1;
|
my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE
|
||||||
|
# git output parsing needs US English output, so first set backtick child process LANGUAGE
|
||||||
|
my $git_command ='export LANGUAGE=en_US.UTF-8; git';
|
||||||
|
my $tabsize = 8;
|
||||||
|
|
||||||
sub help {
|
sub help {
|
||||||
my ($exitcode) = @_;
|
my ($exitcode) = @_;
|
||||||
|
@ -99,6 +102,7 @@ Options:
|
||||||
if exceeded, warn on patches
|
if exceeded, warn on patches
|
||||||
requires --strict for use with --file
|
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
|
||||||
|
--tab-size=n set the number of spaces for tab (default $tabsize)
|
||||||
--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
|
||||||
--mailback only produce a report in case of warnings/errors
|
--mailback only produce a report in case of warnings/errors
|
||||||
|
@ -217,6 +221,7 @@ GetOptions(
|
||||||
'list-types!' => \$list_types,
|
'list-types!' => \$list_types,
|
||||||
'max-line-length=i' => \$max_line_length,
|
'max-line-length=i' => \$max_line_length,
|
||||||
'min-conf-desc-length=i' => \$min_conf_desc_length,
|
'min-conf-desc-length=i' => \$min_conf_desc_length,
|
||||||
|
'tab-size=i' => \$tabsize,
|
||||||
'root=s' => \$root,
|
'root=s' => \$root,
|
||||||
'summary!' => \$summary,
|
'summary!' => \$summary,
|
||||||
'mailback!' => \$mailback,
|
'mailback!' => \$mailback,
|
||||||
|
@ -270,6 +275,9 @@ if ($color =~ /^[01]$/) {
|
||||||
die "Invalid color mode: $color\n";
|
die "Invalid color mode: $color\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# skip TAB size 1 to avoid additional checks on $tabsize - 1
|
||||||
|
die "Invalid TAB size: $tabsize\n" if ($tabsize < 2);
|
||||||
|
|
||||||
sub hash_save_array_words {
|
sub hash_save_array_words {
|
||||||
my ($hashRef, $arrayRef) = @_;
|
my ($hashRef, $arrayRef) = @_;
|
||||||
|
|
||||||
|
@ -473,8 +481,19 @@ 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:|
|
||||||
|
@ -580,6 +599,27 @@ 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 |
|
||||||
|
@ -777,12 +817,12 @@ sub build_types {
|
||||||
}x;
|
}x;
|
||||||
$Type = qr{
|
$Type = qr{
|
||||||
$NonptrType
|
$NonptrType
|
||||||
(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
|
(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
|
||||||
(?:\s+$Inline|\s+$Modifier)*
|
(?:\s+$Inline|\s+$Modifier)*
|
||||||
}x;
|
}x;
|
||||||
$TypeMisordered = qr{
|
$TypeMisordered = qr{
|
||||||
$NonptrTypeMisordered
|
$NonptrTypeMisordered
|
||||||
(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+)?
|
(?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
|
||||||
(?:\s+$Inline|\s+$Modifier)*
|
(?:\s+$Inline|\s+$Modifier)*
|
||||||
}x;
|
}x;
|
||||||
$Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
|
$Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
|
||||||
|
@ -847,14 +887,18 @@ sub seed_camelcase_file {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
our %maintained_status = ();
|
||||||
|
|
||||||
sub is_maintained_obsolete {
|
sub is_maintained_obsolete {
|
||||||
my ($filename) = @_;
|
my ($filename) = @_;
|
||||||
|
|
||||||
return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
|
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`;
|
if (!exists($maintained_status{$filename})) {
|
||||||
|
$maintained_status{$filename} = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
|
||||||
|
}
|
||||||
|
|
||||||
return $status =~ /obsolete/i;
|
return $maintained_status{$filename} =~ /obsolete/i;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub is_SPDX_License_valid {
|
sub is_SPDX_License_valid {
|
||||||
|
@ -879,7 +923,7 @@ sub seed_camelcase_includes {
|
||||||
$camelcase_seeded = 1;
|
$camelcase_seeded = 1;
|
||||||
|
|
||||||
if (-e ".git") {
|
if (-e ".git") {
|
||||||
my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;
|
my $git_last_include_commit = `${git_command} 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 {
|
||||||
|
@ -907,7 +951,7 @@ sub seed_camelcase_includes {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (-e ".git") {
|
if (-e ".git") {
|
||||||
$files = `git ls-files "include/*.h"`;
|
$files = `${git_command} ls-files "include/*.h"`;
|
||||||
@include_files = split('\n', $files);
|
@include_files = split('\n', $files);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -931,13 +975,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 log --no-color --format='%H %s' -1 $commit 2>&1`;
|
my $output = `${git_command} 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...
|
||||||
#
|
#
|
||||||
|
@ -981,7 +1025,7 @@ if ($git) {
|
||||||
} else {
|
} else {
|
||||||
$git_range = "-1 $commit_expr";
|
$git_range = "-1 $commit_expr";
|
||||||
}
|
}
|
||||||
my $lines = `git log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
|
my $lines = `${git_command} 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));
|
||||||
|
@ -996,6 +1040,7 @@ 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) {
|
||||||
|
@ -1086,6 +1131,7 @@ sub parse_email {
|
||||||
my ($formatted_email) = @_;
|
my ($formatted_email) = @_;
|
||||||
|
|
||||||
my $name = "";
|
my $name = "";
|
||||||
|
my $name_comment = "";
|
||||||
my $address = "";
|
my $address = "";
|
||||||
my $comment = "";
|
my $comment = "";
|
||||||
|
|
||||||
|
@ -1118,6 +1164,10 @@ sub parse_email {
|
||||||
|
|
||||||
$name = trim($name);
|
$name = trim($name);
|
||||||
$name =~ s/^\"|\"$//g;
|
$name =~ s/^\"|\"$//g;
|
||||||
|
$name =~ s/(\s*\([^\)]+\))\s*//;
|
||||||
|
if (defined($1)) {
|
||||||
|
$name_comment = trim($1);
|
||||||
|
}
|
||||||
$address = trim($address);
|
$address = trim($address);
|
||||||
$address =~ s/^\<|\>$//g;
|
$address =~ s/^\<|\>$//g;
|
||||||
|
|
||||||
|
@ -1126,7 +1176,7 @@ sub parse_email {
|
||||||
$name = "\"$name\"";
|
$name = "\"$name\"";
|
||||||
}
|
}
|
||||||
|
|
||||||
return ($name, $address, $comment);
|
return ($name, $name_comment, $address, $comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub format_email {
|
sub format_email {
|
||||||
|
@ -1152,6 +1202,23 @@ sub format_email {
|
||||||
return $formatted_email;
|
return $formatted_email;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub reformat_email {
|
||||||
|
my ($email) = @_;
|
||||||
|
|
||||||
|
my ($email_name, $name_comment, $email_address, $comment) = parse_email($email);
|
||||||
|
return format_email($email_name, $email_address);
|
||||||
|
}
|
||||||
|
|
||||||
|
sub same_email_addresses {
|
||||||
|
my ($email1, $email2) = @_;
|
||||||
|
|
||||||
|
my ($email1_name, $name1_comment, $email1_address, $comment1) = parse_email($email1);
|
||||||
|
my ($email2_name, $name2_comment, $email2_address, $comment2) = parse_email($email2);
|
||||||
|
|
||||||
|
return $email1_name eq $email2_name &&
|
||||||
|
$email1_address eq $email2_address;
|
||||||
|
}
|
||||||
|
|
||||||
sub which {
|
sub which {
|
||||||
my ($bin) = @_;
|
my ($bin) = @_;
|
||||||
|
|
||||||
|
@ -1185,7 +1252,7 @@ sub expand_tabs {
|
||||||
if ($c eq "\t") {
|
if ($c eq "\t") {
|
||||||
$res .= ' ';
|
$res .= ' ';
|
||||||
$n++;
|
$n++;
|
||||||
for (; ($n % 8) != 0; $n++) {
|
for (; ($n % $tabsize) != 0; $n++) {
|
||||||
$res .= ' ';
|
$res .= ' ';
|
||||||
}
|
}
|
||||||
next;
|
next;
|
||||||
|
@ -2198,7 +2265,7 @@ sub string_find_replace {
|
||||||
sub tabify {
|
sub tabify {
|
||||||
my ($leading) = @_;
|
my ($leading) = @_;
|
||||||
|
|
||||||
my $source_indent = 8;
|
my $source_indent = $tabsize;
|
||||||
my $max_spaces_before_tab = $source_indent - 1;
|
my $max_spaces_before_tab = $source_indent - 1;
|
||||||
my $spaces_to_tab = " " x $source_indent;
|
my $spaces_to_tab = " " x $source_indent;
|
||||||
|
|
||||||
|
@ -2240,6 +2307,19 @@ sub pos_last_openparen {
|
||||||
return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
|
return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub get_raw_comment {
|
||||||
|
my ($line, $rawline) = @_;
|
||||||
|
my $comment = '';
|
||||||
|
|
||||||
|
for my $i (0 .. (length($line) - 1)) {
|
||||||
|
if (substr($line, $i, 1) eq "$;") {
|
||||||
|
$comment .= substr($rawline, $i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $comment;
|
||||||
|
}
|
||||||
|
|
||||||
# Checks specific to U-Boot
|
# Checks specific to U-Boot
|
||||||
sub u_boot_line {
|
sub u_boot_line {
|
||||||
my ($realfile, $line, $herecurr) = @_;
|
my ($realfile, $line, $herecurr) = @_;
|
||||||
|
@ -2297,6 +2377,7 @@ sub process {
|
||||||
my $is_binding_patch = -1;
|
my $is_binding_patch = -1;
|
||||||
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_patch_separator = 0; #Found a --- line
|
||||||
my $has_commit_log = 0; #Encountered lines before patch
|
my $has_commit_log = 0; #Encountered lines before patch
|
||||||
my $commit_log_lines = 0; #Number of commit log lines
|
my $commit_log_lines = 0; #Number of commit log lines
|
||||||
my $commit_log_possible_stack_dump = 0;
|
my $commit_log_possible_stack_dump = 0;
|
||||||
|
@ -2436,6 +2517,7 @@ sub process {
|
||||||
$sline =~ s/$;/ /g; #with comments as spaces
|
$sline =~ s/$;/ /g; #with comments as spaces
|
||||||
|
|
||||||
my $rawline = $rawlines[$linenr - 1];
|
my $rawline = $rawlines[$linenr - 1];
|
||||||
|
my $raw_comment = get_raw_comment($line, $rawline);
|
||||||
|
|
||||||
# check if it's a mode change, rename or start of a patch
|
# check if it's a mode change, rename or start of a patch
|
||||||
if (!$in_commit_log &&
|
if (!$in_commit_log &&
|
||||||
|
@ -2607,21 +2689,26 @@ sub process {
|
||||||
$author = $1;
|
$author = $1;
|
||||||
$author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i);
|
$author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i);
|
||||||
$author =~ s/"//g;
|
$author =~ s/"//g;
|
||||||
|
$author = reformat_email($author);
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check the patch for a signoff:
|
# Check the patch for a signoff:
|
||||||
if ($line =~ /^\s*signed-off-by:/i) {
|
if ($line =~ /^\s*signed-off-by:\s*(.*)/i) {
|
||||||
$signoff++;
|
$signoff++;
|
||||||
$in_commit_log = 0;
|
$in_commit_log = 0;
|
||||||
if ($author ne '') {
|
if ($author ne '') {
|
||||||
my $l = $line;
|
if (same_email_addresses($1, $author)) {
|
||||||
$l =~ s/"//g;
|
$authorsignoff = 1;
|
||||||
if ($l =~ /^\s*signed-off-by:\s*\Q$author\E/i) {
|
|
||||||
$authorsignoff = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Check for patch separator
|
||||||
|
if ($line =~ /^---$/) {
|
||||||
|
$has_patch_separator = 1;
|
||||||
|
$in_commit_log = 0;
|
||||||
|
}
|
||||||
|
|
||||||
# Check if MAINTAINERS is being updated. If so, there's probably no need to
|
# Check if MAINTAINERS is being updated. If so, there's probably no need to
|
||||||
# emit the "does MAINTAINERS need updating?" message on file add/move/delete
|
# emit the "does MAINTAINERS need updating?" message on file add/move/delete
|
||||||
if ($line =~ /^\s*MAINTAINERS\s*\|/) {
|
if ($line =~ /^\s*MAINTAINERS\s*\|/) {
|
||||||
|
@ -2667,7 +2754,7 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
my ($email_name, $email_address, $comment) = parse_email($email);
|
my ($email_name, $name_comment, $email_address, $comment) = parse_email($email);
|
||||||
my $suggested_email = format_email(($email_name, $email_address));
|
my $suggested_email = format_email(($email_name, $email_address));
|
||||||
if ($suggested_email eq "") {
|
if ($suggested_email eq "") {
|
||||||
ERROR("BAD_SIGN_OFF",
|
ERROR("BAD_SIGN_OFF",
|
||||||
|
@ -2678,9 +2765,7 @@ sub process {
|
||||||
$dequoted =~ s/" </ </;
|
$dequoted =~ s/" </ </;
|
||||||
# Don't force email to have quotes
|
# Don't force email to have quotes
|
||||||
# Allow just an angle bracketed address
|
# Allow just an angle bracketed address
|
||||||
if ("$dequoted$comment" ne $email &&
|
if (!same_email_addresses($email, $suggested_email)) {
|
||||||
"<$email_address>$comment" ne $email &&
|
|
||||||
"$suggested_email$comment" ne $email) {
|
|
||||||
WARN("BAD_SIGN_OFF",
|
WARN("BAD_SIGN_OFF",
|
||||||
"email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
|
"email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
@ -2696,6 +2781,24 @@ 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
|
||||||
|
@ -2705,10 +2808,10 @@ sub process {
|
||||||
"A patch subject line should describe the change not the tool that found it\n" . $herecurr);
|
"A patch subject line should describe the change not the tool that found it\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check for unwanted Gerrit info
|
# Check for Gerrit Change-Ids not in any patch context
|
||||||
if ($in_commit_log && $line =~ /^\s*change-id:/i) {
|
if ($realfile eq '' && !$has_patch_separator && $line =~ /^\s*change-id:/i) {
|
||||||
ERROR("GERRIT_CHANGE_ID",
|
ERROR("GERRIT_CHANGE_ID",
|
||||||
"Remove Gerrit Change-Id's before submitting upstream.\n" . $herecurr);
|
"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
|
||||||
|
@ -2716,8 +2819,10 @@ 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,}\>\]/) ||
|
||||||
# stack dump address
|
$line =~ /^(?:\s+\w+:\s+[0-9a-fA-F]+){3,3}/ ||
|
||||||
|
$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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2744,7 +2849,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|base-commit):/i &&
|
||||||
$line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
|
$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 &&
|
||||||
|
@ -2813,6 +2918,14 @@ sub process {
|
||||||
"added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
|
"added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Check for adding new DT bindings not in schema format
|
||||||
|
if (!$in_commit_log &&
|
||||||
|
($line =~ /^new file mode\s*\d+\s*$/) &&
|
||||||
|
($realfile =~ m@^Documentation/devicetree/bindings/.*\.txt$@)) {
|
||||||
|
WARN("DT_SCHEMA_BINDING_PATCH",
|
||||||
|
"DT bindings should be in DT schema format. See: Documentation/devicetree/writing-schema.rst\n");
|
||||||
|
}
|
||||||
|
|
||||||
# Check for wrappage within a valid hunk of the file
|
# Check for wrappage within a valid hunk of the file
|
||||||
if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
|
if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
|
||||||
ERROR("CORRUPTED_PATCH",
|
ERROR("CORRUPTED_PATCH",
|
||||||
|
@ -2889,6 +3002,17 @@ 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 =~ /^-/);
|
||||||
|
|
||||||
|
@ -3018,7 +3142,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.txt";
|
my $vp_file = $dt_path . "vendor-prefixes.yaml";
|
||||||
|
|
||||||
foreach my $compat (@compats) {
|
foreach my $compat (@compats) {
|
||||||
my $compat2 = $compat;
|
my $compat2 = $compat;
|
||||||
|
@ -3033,7 +3157,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 "^$vendor\\b" $vp_file`;
|
`grep -Eq "\\"\\^\Q$vendor\E,\\.\\*\\":" $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);
|
||||||
|
@ -3051,22 +3175,41 @@ sub process {
|
||||||
$comment = '/*';
|
$comment = '/*';
|
||||||
} elsif ($realfile =~ /\.(c|dts|dtsi)$/) {
|
} elsif ($realfile =~ /\.(c|dts|dtsi)$/) {
|
||||||
$comment = '//';
|
$comment = '//';
|
||||||
} elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc)$/) {
|
} elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc|yaml)$/) {
|
||||||
$comment = '#';
|
$comment = '#';
|
||||||
} elsif ($realfile =~ /\.rst$/) {
|
} elsif ($realfile =~ /\.rst$/) {
|
||||||
$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 !~ /^\+\Q$comment\E SPDX-License-Identifier: /) {
|
$rawline !~ m@^\+\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);
|
||||||
}
|
}
|
||||||
|
if ($realfile =~ m@^Documentation/devicetree/bindings/@ &&
|
||||||
|
not $spdx_license =~ /GPL-2\.0.*BSD-2-Clause/) {
|
||||||
|
my $msg_level = \&WARN;
|
||||||
|
$msg_level = \&CHK if ($file);
|
||||||
|
if (&{$msg_level}("SPDX_LICENSE_TAG",
|
||||||
|
|
||||||
|
"DT binding documents should be licensed (GPL-2.0-only OR BSD-2-Clause)\n" . $herecurr) &&
|
||||||
|
$fix) {
|
||||||
|
$fixed[$fixlinenr] =~ s/SPDX-License-Identifier: .*/SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)/;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3074,6 +3217,14 @@ 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:
|
||||||
|
@ -3152,7 +3303,7 @@ sub process {
|
||||||
next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
|
next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
|
||||||
|
|
||||||
# at the beginning of a line any tabs must come first and anything
|
# at the beginning of a line any tabs must come first and anything
|
||||||
# more than 8 must use tabs.
|
# more than $tabsize must use tabs.
|
||||||
if ($rawline =~ /^\+\s* \t\s*\S/ ||
|
if ($rawline =~ /^\+\s* \t\s*\S/ ||
|
||||||
$rawline =~ /^\+\s* \s*/) {
|
$rawline =~ /^\+\s* \s*/) {
|
||||||
my $herevet = "$here\n" . cat_vet($rawline) . "\n";
|
my $herevet = "$here\n" . cat_vet($rawline) . "\n";
|
||||||
|
@ -3171,7 +3322,7 @@ sub process {
|
||||||
"please, no space before tabs\n" . $herevet) &&
|
"please, no space before tabs\n" . $herevet) &&
|
||||||
$fix) {
|
$fix) {
|
||||||
while ($fixed[$fixlinenr] =~
|
while ($fixed[$fixlinenr] =~
|
||||||
s/(^\+.*) {8,8}\t/$1\t\t/) {}
|
s/(^\+.*) {$tabsize,$tabsize}\t/$1\t\t/) {}
|
||||||
while ($fixed[$fixlinenr] =~
|
while ($fixed[$fixlinenr] =~
|
||||||
s/(^\+.*) +\t/$1\t/) {}
|
s/(^\+.*) +\t/$1\t/) {}
|
||||||
}
|
}
|
||||||
|
@ -3193,11 +3344,11 @@ sub process {
|
||||||
if ($perl_version_ok &&
|
if ($perl_version_ok &&
|
||||||
$sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
|
$sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
|
||||||
my $indent = length($1);
|
my $indent = length($1);
|
||||||
if ($indent % 8) {
|
if ($indent % $tabsize) {
|
||||||
if (WARN("TABSTOP",
|
if (WARN("TABSTOP",
|
||||||
"Statements should start on a tabstop\n" . $herecurr) &&
|
"Statements should start on a tabstop\n" . $herecurr) &&
|
||||||
$fix) {
|
$fix) {
|
||||||
$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/8)@e;
|
$fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/$tabsize)@e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3215,8 +3366,8 @@ sub process {
|
||||||
my $newindent = $2;
|
my $newindent = $2;
|
||||||
|
|
||||||
my $goodtabindent = $oldindent .
|
my $goodtabindent = $oldindent .
|
||||||
"\t" x ($pos / 8) .
|
"\t" x ($pos / $tabsize) .
|
||||||
" " x ($pos % 8);
|
" " x ($pos % $tabsize);
|
||||||
my $goodspaceindent = $oldindent . " " x $pos;
|
my $goodspaceindent = $oldindent . " " x $pos;
|
||||||
|
|
||||||
if ($newindent ne $goodtabindent &&
|
if ($newindent ne $goodtabindent &&
|
||||||
|
@ -3687,11 +3838,11 @@ sub process {
|
||||||
#print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n";
|
#print "line<$line> prevline<$prevline> indent<$indent> sindent<$sindent> check<$check> continuation<$continuation> s<$s> cond_lines<$cond_lines> stat_real<$stat_real> stat<$stat>\n";
|
||||||
|
|
||||||
if ($check && $s ne '' &&
|
if ($check && $s ne '' &&
|
||||||
(($sindent % 8) != 0 ||
|
(($sindent % $tabsize) != 0 ||
|
||||||
($sindent < $indent) ||
|
($sindent < $indent) ||
|
||||||
($sindent == $indent &&
|
($sindent == $indent &&
|
||||||
($s !~ /^\s*(?:\}|\{|else\b)/)) ||
|
($s !~ /^\s*(?:\}|\{|else\b)/)) ||
|
||||||
($sindent > $indent + 8))) {
|
($sindent > $indent + $tabsize))) {
|
||||||
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");
|
||||||
}
|
}
|
||||||
|
@ -3917,14 +4068,23 @@ 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/) {
|
||||||
|
@ -3959,7 +4119,7 @@ sub process {
|
||||||
}
|
}
|
||||||
|
|
||||||
# check for function declarations without arguments like "int foo()"
|
# check for function declarations without arguments like "int foo()"
|
||||||
if ($line =~ /(\b$Type\s+$Ident)\s*\(\s*\)/) {
|
if ($line =~ /(\b$Type\s*$Ident)\s*\(\s*\)/) {
|
||||||
if (ERROR("FUNCTION_WITHOUT_ARGS",
|
if (ERROR("FUNCTION_WITHOUT_ARGS",
|
||||||
"Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
|
"Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
|
||||||
$fix) {
|
$fix) {
|
||||||
|
@ -4070,15 +4230,6 @@ sub process {
|
||||||
"Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr);
|
"Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($line =~ /\bpr_warning\s*\(/) {
|
|
||||||
if (WARN("PREFER_PR_LEVEL",
|
|
||||||
"Prefer pr_warn(... to pr_warning(...\n" . $herecurr) &&
|
|
||||||
$fix) {
|
|
||||||
$fixed[$fixlinenr] =~
|
|
||||||
s/\bpr_warning\b/pr_warn/;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
|
if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
|
||||||
my $orig = $1;
|
my $orig = $1;
|
||||||
my $level = lc($orig);
|
my $level = lc($orig);
|
||||||
|
@ -4536,7 +4687,7 @@ sub process {
|
||||||
($op eq '>' &&
|
($op eq '>' &&
|
||||||
$ca =~ /<\S+\@\S+$/))
|
$ca =~ /<\S+\@\S+$/))
|
||||||
{
|
{
|
||||||
$ok = 1;
|
$ok = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
# for asm volatile statements
|
# for asm volatile statements
|
||||||
|
@ -4632,7 +4783,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) {
|
||||||
|
@ -4871,7 +5022,7 @@ sub process {
|
||||||
# conditional.
|
# conditional.
|
||||||
substr($s, 0, length($c), '');
|
substr($s, 0, length($c), '');
|
||||||
$s =~ s/\n.*//g;
|
$s =~ s/\n.*//g;
|
||||||
$s =~ s/$;//g; # Remove any comments
|
$s =~ s/$;//g; # Remove any comments
|
||||||
if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
|
if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
|
||||||
$c !~ /}\s*while\s*/)
|
$c !~ /}\s*while\s*/)
|
||||||
{
|
{
|
||||||
|
@ -4910,7 +5061,7 @@ sub process {
|
||||||
# if and else should not have general statements after it
|
# if and else should not have general statements after it
|
||||||
if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
|
if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
|
||||||
my $s = $1;
|
my $s = $1;
|
||||||
$s =~ s/$;//g; # Remove any comments
|
$s =~ s/$;//g; # Remove any comments
|
||||||
if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
|
if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
|
||||||
ERROR("TRAILING_STATEMENTS",
|
ERROR("TRAILING_STATEMENTS",
|
||||||
"trailing statements should be on next line\n" . $herecurr);
|
"trailing statements should be on next line\n" . $herecurr);
|
||||||
|
@ -4982,24 +5133,14 @@ 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]/ &&
|
||||||
#Ignore Page<foo> variants
|
#Ignore Page<foo> variants
|
||||||
$var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
|
$var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
|
||||||
#Ignore SI style variants like nS, mV and dB (ie: max_uV, regulator_min_uA_show)
|
#Ignore SI style variants like nS, mV and dB
|
||||||
$var !~ /^(?:[a-z_]*?)_?[a-z][A-Z](?:_[a-z_]+)?$/ &&
|
#(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_]+)?$/ &&
|
||||||
#Ignore some three character SI units explicitly, like MiB and KHz
|
#Ignore some three character SI units explicitly, like MiB and KHz
|
||||||
$var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
|
$var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
|
||||||
while ($var =~ m{($Ident)}g) {
|
while ($var =~ m{($Ident)}g) {
|
||||||
|
@ -5096,7 +5237,7 @@ sub process {
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
# Flatten any obvious string concatentation.
|
# Flatten any obvious string concatenation.
|
||||||
while ($dstat =~ s/($String)\s*$Ident/$1/ ||
|
while ($dstat =~ s/($String)\s*$Ident/$1/ ||
|
||||||
$dstat =~ s/$Ident\s*($String)/$1/)
|
$dstat =~ s/$Ident\s*($String)/$1/)
|
||||||
{
|
{
|
||||||
|
@ -5174,7 +5315,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(typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
|
$tmp_stmt =~ s/\b(sizeof|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;
|
||||||
|
@ -5573,7 +5714,8 @@ 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*(?:devm_)?(?:[kv][czm]alloc(?:_node|_array)?\b|kstrdup|kmemdup|(?:dev_)?alloc_skb)/) {
|
if ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*$allocFunctions\s*\(/ &&
|
||||||
|
$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);
|
||||||
}
|
}
|
||||||
|
@ -5694,7 +5836,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.txt\n" . $herecurr);
|
"usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst\n" . $herecurr);
|
||||||
}
|
}
|
||||||
if ($delay > 2000) {
|
if ($delay > 2000) {
|
||||||
WARN("LONG_UDELAY",
|
WARN("LONG_UDELAY",
|
||||||
|
@ -5706,7 +5848,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.txt\n" . $herecurr);
|
"msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst\n" . $herecurr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5855,6 +5997,18 @@ 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/) {
|
||||||
|
@ -5970,14 +6124,18 @@ sub process {
|
||||||
for (my $count = $linenr; $count <= $lc; $count++) {
|
for (my $count = $linenr; $count <= $lc; $count++) {
|
||||||
my $specifier;
|
my $specifier;
|
||||||
my $extension;
|
my $extension;
|
||||||
|
my $qualifier;
|
||||||
my $bad_specifier = "";
|
my $bad_specifier = "";
|
||||||
my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
|
my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
|
||||||
$fmt =~ s/%%//g;
|
$fmt =~ s/%%//g;
|
||||||
|
|
||||||
while ($fmt =~ /(\%[\*\d\.]*p(\w))/g) {
|
while ($fmt =~ /(\%[\*\d\.]*p(\w)(\w*))/g) {
|
||||||
$specifier = $1;
|
$specifier = $1;
|
||||||
$extension = $2;
|
$extension = $2;
|
||||||
if ($extension !~ /[SsBKRraEhMmIiUDdgVCbGNOx]/) {
|
$qualifier = $3;
|
||||||
|
if ($extension !~ /[SsBKRraEehMmIiUDdgVCbGNOxtf]/ ||
|
||||||
|
($extension eq "f" &&
|
||||||
|
defined $qualifier && $qualifier !~ /^w/)) {
|
||||||
$bad_specifier = $specifier;
|
$bad_specifier = $specifier;
|
||||||
last;
|
last;
|
||||||
}
|
}
|
||||||
|
@ -5994,7 +6152,6 @@ sub process {
|
||||||
my $ext_type = "Invalid";
|
my $ext_type = "Invalid";
|
||||||
my $use = "";
|
my $use = "";
|
||||||
if ($bad_specifier =~ /p[Ff]/) {
|
if ($bad_specifier =~ /p[Ff]/) {
|
||||||
$ext_type = "Deprecated";
|
|
||||||
$use = " - use %pS instead";
|
$use = " - use %pS instead";
|
||||||
$use =~ s/pS/ps/ if ($bad_specifier =~ /pf/);
|
$use =~ s/pS/ps/ if ($bad_specifier =~ /pf/);
|
||||||
}
|
}
|
||||||
|
@ -6097,11 +6254,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.txt\n" . "$here\n$stat\n");
|
"usleep_range should not use min == max args; see Documentation/timers/timers-howto.rst\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.txt\n" . "$here\n$stat\n");
|
"usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6178,13 +6335,17 @@ sub process {
|
||||||
}
|
}
|
||||||
|
|
||||||
# check for function declarations that have arguments without identifier names
|
# check for function declarations that have arguments without identifier names
|
||||||
|
# while avoiding uninitialized_var(x)
|
||||||
if (defined $stat &&
|
if (defined $stat &&
|
||||||
$stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
|
$stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:($Ident)|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
|
||||||
$1 ne "void") {
|
(!defined($1) ||
|
||||||
my $args = trim($1);
|
(defined($1) && $1 ne "uninitialized_var")) &&
|
||||||
|
$2 ne "void") {
|
||||||
|
my $args = trim($2);
|
||||||
while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
|
while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
|
||||||
my $arg = trim($1);
|
my $arg = trim($1);
|
||||||
if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
|
if ($arg =~ /^$Type$/ &&
|
||||||
|
$arg !~ /enum\s+$Ident$/) {
|
||||||
WARN("FUNCTION_ARGUMENTS",
|
WARN("FUNCTION_ARGUMENTS",
|
||||||
"function definition argument '$arg' should also have an identifier name\n" . $herecurr);
|
"function definition argument '$arg' should also have an identifier name\n" . $herecurr);
|
||||||
}
|
}
|
||||||
|
@ -6224,8 +6385,8 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# check for pointless casting of kmalloc return
|
# check for pointless casting of alloc functions
|
||||||
if ($line =~ /\*\s*\)\s*[kv][czm]alloc(_node){0,1}\b/) {
|
if ($line =~ /\*\s*\)\s*$allocFunctions\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);
|
||||||
}
|
}
|
||||||
|
@ -6233,7 +6394,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][mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
|
$line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k|v)[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);
|
||||||
}
|
}
|
||||||
|
@ -6337,6 +6498,28 @@ sub process {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# check for /* fallthrough */ like comment, prefer fallthrough;
|
||||||
|
my @fallthroughs = (
|
||||||
|
'fallthrough',
|
||||||
|
'@fallthrough@',
|
||||||
|
'lint -fallthrough[ \t]*',
|
||||||
|
'intentional(?:ly)?[ \t]*fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)',
|
||||||
|
'(?:else,?\s*)?FALL(?:S | |-)?THR(?:OUGH|U|EW)[ \t.!]*(?:-[^\n\r]*)?',
|
||||||
|
'Fall(?:(?:s | |-)[Tt]|t)hr(?:ough|u|ew)[ \t.!]*(?:-[^\n\r]*)?',
|
||||||
|
'fall(?:s | |-)?thr(?:ough|u|ew)[ \t.!]*(?:-[^\n\r]*)?',
|
||||||
|
);
|
||||||
|
if ($raw_comment ne '') {
|
||||||
|
foreach my $ft (@fallthroughs) {
|
||||||
|
if ($raw_comment =~ /$ft/) {
|
||||||
|
my $msg_level = \&WARN;
|
||||||
|
$msg_level = \&CHK if ($file);
|
||||||
|
&{$msg_level}("PREFER_FALLTHROUGH",
|
||||||
|
"Prefer 'fallthrough;' over fallthrough comment\n" . $herecurr);
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# check for switch/default statements without a break;
|
# check for switch/default statements without a break;
|
||||||
if ($perl_version_ok &&
|
if ($perl_version_ok &&
|
||||||
defined $stat &&
|
defined $stat &&
|
||||||
|
@ -6396,19 +6579,6 @@ 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",
|
||||||
|
@ -6427,6 +6597,20 @@ 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/ &&
|
||||||
|
@ -6461,6 +6645,12 @@ 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/@) {
|
||||||
|
@ -6620,6 +6810,12 @@ 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
|
||||||
|
|
Loading…
Add table
Reference in a new issue