aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/checkpatch.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/checkpatch.pl')
-rwxr-xr-xscripts/checkpatch.pl144
1 files changed, 115 insertions, 29 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index e954df2b2077..3d4040322ae1 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -566,6 +566,7 @@ foreach my $entry (@mode_permission_funcs) {
566 $mode_perms_search .= '|' if ($mode_perms_search ne ""); 566 $mode_perms_search .= '|' if ($mode_perms_search ne "");
567 $mode_perms_search .= $entry->[0]; 567 $mode_perms_search .= $entry->[0];
568} 568}
569$mode_perms_search = "(?:${mode_perms_search})";
569 570
570our $mode_perms_world_writable = qr{ 571our $mode_perms_world_writable = qr{
571 S_IWUGO | 572 S_IWUGO |
@@ -600,6 +601,37 @@ foreach my $entry (keys %mode_permission_string_types) {
600 $mode_perms_string_search .= '|' if ($mode_perms_string_search ne ""); 601 $mode_perms_string_search .= '|' if ($mode_perms_string_search ne "");
601 $mode_perms_string_search .= $entry; 602 $mode_perms_string_search .= $entry;
602} 603}
604our $single_mode_perms_string_search = "(?:${mode_perms_string_search})";
605our $multi_mode_perms_string_search = qr{
606 ${single_mode_perms_string_search}
607 (?:\s*\|\s*${single_mode_perms_string_search})*
608}x;
609
610sub perms_to_octal {
611 my ($string) = @_;
612
613 return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/);
614
615 my $val = "";
616 my $oval = "";
617 my $to = 0;
618 my $curpos = 0;
619 my $lastpos = 0;
620 while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
621 $curpos = pos($string);
622 my $match = $2;
623 my $omatch = $1;
624 last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
625 $lastpos = $curpos;
626 $to |= $mode_permission_string_types{$match};
627 $val .= '\s*\|\s*' if ($val ne "");
628 $val .= $match;
629 $oval .= $omatch;
630 }
631 $oval =~ s/^\s*\|\s*//;
632 $oval =~ s/\s*\|\s*$//;
633 return sprintf("%04o", $to);
634}
603 635
604our $allowed_asm_includes = qr{(?x: 636our $allowed_asm_includes = qr{(?x:
605 irq| 637 irq|
@@ -2875,6 +2907,7 @@ sub process {
2875# logging functions like pr_info that end in a string 2907# logging functions like pr_info that end in a string
2876# lines with a single string 2908# lines with a single string
2877# #defines that are a single string 2909# #defines that are a single string
2910# lines with an RFC3986 like URL
2878# 2911#
2879# There are 3 different line length message types: 2912# There are 3 different line length message types:
2880# LONG_LINE_COMMENT a comment starts before but extends beyond $max_line_length 2913# LONG_LINE_COMMENT a comment starts before but extends beyond $max_line_length
@@ -2906,6 +2939,10 @@ sub process {
2906 $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) { 2939 $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {
2907 $msg_type = ""; 2940 $msg_type = "";
2908 2941
2942 # URL ($rawline is used in case the URL is in a comment)
2943 } elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) {
2944 $msg_type = "";
2945
2909 # Otherwise set the alternate message types 2946 # Otherwise set the alternate message types
2910 2947
2911 # a comment starts before $max_line_length 2948 # a comment starts before $max_line_length
@@ -2983,7 +3020,7 @@ sub process {
2983 3020
2984# check indentation starts on a tab stop 3021# check indentation starts on a tab stop
2985 if ($^V && $^V ge 5.10.0 && 3022 if ($^V && $^V ge 5.10.0 &&
2986 $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$))/) { 3023 $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
2987 my $indent = length($1); 3024 my $indent = length($1);
2988 if ($indent % 8) { 3025 if ($indent % 8) {
2989 if (WARN("TABSTOP", 3026 if (WARN("TABSTOP",
@@ -3882,10 +3919,12 @@ sub process {
3882 3919
3883# function brace can't be on same line, except for #defines of do while, 3920# function brace can't be on same line, except for #defines of do while,
3884# or if closed on same line 3921# or if closed on same line
3885 if (($line=~/$Type\s*$Ident\(.*\).*\s*{/) and 3922 if ($^V && $^V ge 5.10.0 &&
3886 !($line=~/\#\s*define.*do\s\{/) and !($line=~/}/)) { 3923 $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&
3924 $sline !~ /\#\s*define\b.*do\s*\{/ &&
3925 $sline !~ /}/) {
3887 if (ERROR("OPEN_BRACE", 3926 if (ERROR("OPEN_BRACE",
3888 "open brace '{' following function declarations go on the next line\n" . $herecurr) && 3927 "open brace '{' following function definitions go on the next line\n" . $herecurr) &&
3889 $fix) { 3928 $fix) {
3890 fix_delete_line($fixlinenr, $rawline); 3929 fix_delete_line($fixlinenr, $rawline);
3891 my $fixed_line = $rawline; 3930 my $fixed_line = $rawline;
@@ -4489,7 +4528,9 @@ sub process {
4489 } 4528 }
4490 4529
4491# check for unnecessary parentheses around comparisons in if uses 4530# check for unnecessary parentheses around comparisons in if uses
4492 if ($^V && $^V ge 5.10.0 && defined($stat) && 4531# when !drivers/staging or command-line uses --strict
4532 if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&
4533 $^V && $^V ge 5.10.0 && defined($stat) &&
4493 $stat =~ /(^.\s*if\s*($balanced_parens))/) { 4534 $stat =~ /(^.\s*if\s*($balanced_parens))/) {
4494 my $if_stat = $1; 4535 my $if_stat = $1;
4495 my $test = substr($2, 1, -1); 4536 my $test = substr($2, 1, -1);
@@ -5307,7 +5348,7 @@ sub process {
5307 } 5348 }
5308 5349
5309# check for line continuations in quoted strings with odd counts of " 5350# check for line continuations in quoted strings with odd counts of "
5310 if ($rawline =~ /\\$/ && $rawline =~ tr/"/"/ % 2) { 5351 if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) {
5311 WARN("LINE_CONTINUATIONS", 5352 WARN("LINE_CONTINUATIONS",
5312 "Avoid line continuations in quoted strings\n" . $herecurr); 5353 "Avoid line continuations in quoted strings\n" . $herecurr);
5313 } 5354 }
@@ -6269,8 +6310,69 @@ sub process {
6269 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr); 6310 "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
6270 } 6311 }
6271 6312
6313# check for DEVICE_ATTR uses that could be DEVICE_ATTR_<FOO>
6314# and whether or not function naming is typical and if
6315# DEVICE_ATTR permissions uses are unusual too
6316 if ($^V && $^V ge 5.10.0 &&
6317 defined $stat &&
6318 $stat =~ /\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?\s*(\s*(?:${multi_mode_perms_string_search}|0[0-7]{3,3})\s*)\s*\)?\s*,\s*(\w+)\s*,\s*(\w+)\s*\)/) {
6319 my $var = $1;
6320 my $perms = $2;
6321 my $show = $3;
6322 my $store = $4;
6323 my $octal_perms = perms_to_octal($perms);
6324 if ($show =~ /^${var}_show$/ &&
6325 $store =~ /^${var}_store$/ &&
6326 $octal_perms eq "0644") {
6327 if (WARN("DEVICE_ATTR_RW",
6328 "Use DEVICE_ATTR_RW\n" . $herecurr) &&
6329 $fix) {
6330 $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/;
6331 }
6332 } elsif ($show =~ /^${var}_show$/ &&
6333 $store =~ /^NULL$/ &&
6334 $octal_perms eq "0444") {
6335 if (WARN("DEVICE_ATTR_RO",
6336 "Use DEVICE_ATTR_RO\n" . $herecurr) &&
6337 $fix) {
6338 $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/;
6339 }
6340 } elsif ($show =~ /^NULL$/ &&
6341 $store =~ /^${var}_store$/ &&
6342 $octal_perms eq "0200") {
6343 if (WARN("DEVICE_ATTR_WO",
6344 "Use DEVICE_ATTR_WO\n" . $herecurr) &&
6345 $fix) {
6346 $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/;
6347 }
6348 } elsif ($octal_perms eq "0644" ||
6349 $octal_perms eq "0444" ||
6350 $octal_perms eq "0200") {
6351 my $newshow = "$show";
6352 $newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show");
6353 my $newstore = $store;
6354 $newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store");
6355 my $rename = "";
6356 if ($show ne $newshow) {
6357 $rename .= " '$show' to '$newshow'";
6358 }
6359 if ($store ne $newstore) {
6360 $rename .= " '$store' to '$newstore'";
6361 }
6362 WARN("DEVICE_ATTR_FUNCTIONS",
6363 "Consider renaming function(s)$rename\n" . $herecurr);
6364 } else {
6365 WARN("DEVICE_ATTR_PERMS",
6366 "DEVICE_ATTR unusual permissions '$perms' used\n" . $herecurr);
6367 }
6368 }
6369
6272# Mode permission misuses where it seems decimal should be octal 6370# Mode permission misuses where it seems decimal should be octal
6273# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop 6371# This uses a shortcut match to avoid unnecessary uses of a slow foreach loop
6372# o Ignore module_param*(...) uses with a decimal 0 permission as that has a
6373# specific definition of not visible in sysfs.
6374# o Ignore proc_create*(...) uses with a decimal 0 permission as that means
6375# use the default permissions
6274 if ($^V && $^V ge 5.10.0 && 6376 if ($^V && $^V ge 5.10.0 &&
6275 defined $stat && 6377 defined $stat &&
6276 $line =~ /$mode_perms_search/) { 6378 $line =~ /$mode_perms_search/) {
@@ -6294,8 +6396,9 @@ sub process {
6294 if ($stat =~ /$test/) { 6396 if ($stat =~ /$test/) {
6295 my $val = $1; 6397 my $val = $1;
6296 $val = $6 if ($skip_args ne ""); 6398 $val = $6 if ($skip_args ne "");
6297 if (($val =~ /^$Int$/ && $val !~ /^$Octal$/) || 6399 if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") &&
6298 ($val =~ /^$Octal$/ && length($val) ne 4)) { 6400 (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
6401 ($val =~ /^$Octal$/ && length($val) ne 4))) {
6299 ERROR("NON_OCTAL_PERMISSIONS", 6402 ERROR("NON_OCTAL_PERMISSIONS",
6300 "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real); 6403 "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real);
6301 } 6404 }
@@ -6308,30 +6411,13 @@ sub process {
6308 } 6411 }
6309 6412
6310# check for uses of S_<PERMS> that could be octal for readability 6413# check for uses of S_<PERMS> that could be octal for readability
6311 if ($line =~ /\b$mode_perms_string_search\b/) { 6414 if ($line =~ /\b($multi_mode_perms_string_search)\b/) {
6312 my $val = ""; 6415 my $oval = $1;
6313 my $oval = ""; 6416 my $octal = perms_to_octal($oval);
6314 my $to = 0;
6315 my $curpos = 0;
6316 my $lastpos = 0;
6317 while ($line =~ /\b(($mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
6318 $curpos = pos($line);
6319 my $match = $2;
6320 my $omatch = $1;
6321 last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
6322 $lastpos = $curpos;
6323 $to |= $mode_permission_string_types{$match};
6324 $val .= '\s*\|\s*' if ($val ne "");
6325 $val .= $match;
6326 $oval .= $omatch;
6327 }
6328 $oval =~ s/^\s*\|\s*//;
6329 $oval =~ s/\s*\|\s*$//;
6330 my $octal = sprintf("%04o", $to);
6331 if (WARN("SYMBOLIC_PERMS", 6417 if (WARN("SYMBOLIC_PERMS",
6332 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) && 6418 "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) &&
6333 $fix) { 6419 $fix) {
6334 $fixed[$fixlinenr] =~ s/$val/$octal/; 6420 $fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/;
6335 } 6421 }
6336 } 6422 }
6337 6423