diff options
Diffstat (limited to 'scripts/checkpatch.pl')
-rwxr-xr-x | scripts/checkpatch.pl | 107 |
1 files changed, 97 insertions, 10 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 4d08b398411f..374abf443636 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
@@ -9,7 +9,8 @@ use strict; | |||
9 | use POSIX; | 9 | use POSIX; |
10 | 10 | ||
11 | my $P = $0; | 11 | my $P = $0; |
12 | $P =~ s@.*/@@g; | 12 | $P =~ s@(.*)/@@g; |
13 | my $D = $1; | ||
13 | 14 | ||
14 | my $V = '0.32'; | 15 | my $V = '0.32'; |
15 | 16 | ||
@@ -43,6 +44,8 @@ my $configuration_file = ".checkpatch.conf"; | |||
43 | my $max_line_length = 80; | 44 | my $max_line_length = 80; |
44 | my $ignore_perl_version = 0; | 45 | my $ignore_perl_version = 0; |
45 | my $minimum_perl_version = 5.10.0; | 46 | my $minimum_perl_version = 5.10.0; |
47 | my $min_conf_desc_length = 4; | ||
48 | my $spelling_file = "$D/spelling.txt"; | ||
46 | 49 | ||
47 | sub help { | 50 | sub help { |
48 | my ($exitcode) = @_; | 51 | my ($exitcode) = @_; |
@@ -63,6 +66,7 @@ Options: | |||
63 | --types TYPE(,TYPE2...) show only these comma separated message types | 66 | --types TYPE(,TYPE2...) show only these comma separated message types |
64 | --ignore TYPE(,TYPE2...) ignore various comma separated message types | 67 | --ignore TYPE(,TYPE2...) ignore various comma separated message types |
65 | --max-line-length=n set the maximum line length, if exceeded, warn | 68 | --max-line-length=n set the maximum line length, if exceeded, warn |
69 | --min-conf-desc-length=n set the min description length, if shorter, warn | ||
66 | --show-types show the message "types" in the output | 70 | --show-types show the message "types" in the output |
67 | --root=PATH PATH to the kernel tree root | 71 | --root=PATH PATH to the kernel tree root |
68 | --no-summary suppress the per-file summary | 72 | --no-summary suppress the per-file summary |
@@ -131,6 +135,7 @@ GetOptions( | |||
131 | 'types=s' => \@use, | 135 | 'types=s' => \@use, |
132 | 'show-types!' => \$show_types, | 136 | 'show-types!' => \$show_types, |
133 | 'max-line-length=i' => \$max_line_length, | 137 | 'max-line-length=i' => \$max_line_length, |
138 | 'min-conf-desc-length=i' => \$min_conf_desc_length, | ||
134 | 'root=s' => \$root, | 139 | 'root=s' => \$root, |
135 | 'summary!' => \$summary, | 140 | 'summary!' => \$summary, |
136 | 'mailback!' => \$mailback, | 141 | 'mailback!' => \$mailback, |
@@ -425,10 +430,35 @@ foreach my $entry (@mode_permission_funcs) { | |||
425 | 430 | ||
426 | our $allowed_asm_includes = qr{(?x: | 431 | our $allowed_asm_includes = qr{(?x: |
427 | irq| | 432 | irq| |
428 | memory | 433 | memory| |
434 | time| | ||
435 | reboot | ||
429 | )}; | 436 | )}; |
430 | # memory.h: ARM has a custom one | 437 | # memory.h: ARM has a custom one |
431 | 438 | ||
439 | # Load common spelling mistakes and build regular expression list. | ||
440 | my $misspellings; | ||
441 | my @spelling_list; | ||
442 | my %spelling_fix; | ||
443 | open(my $spelling, '<', $spelling_file) | ||
444 | or die "$P: Can't open $spelling_file for reading: $!\n"; | ||
445 | while (<$spelling>) { | ||
446 | my $line = $_; | ||
447 | |||
448 | $line =~ s/\s*\n?$//g; | ||
449 | $line =~ s/^\s*//g; | ||
450 | |||
451 | next if ($line =~ m/^\s*#/); | ||
452 | next if ($line =~ m/^\s*$/); | ||
453 | |||
454 | my ($suspect, $fix) = split(/\|\|/, $line); | ||
455 | |||
456 | push(@spelling_list, $suspect); | ||
457 | $spelling_fix{$suspect} = $fix; | ||
458 | } | ||
459 | close($spelling); | ||
460 | $misspellings = join("|", @spelling_list); | ||
461 | |||
432 | sub build_types { | 462 | sub build_types { |
433 | my $mods = "(?x: \n" . join("|\n ", @modifierList) . "\n)"; | 463 | my $mods = "(?x: \n" . join("|\n ", @modifierList) . "\n)"; |
434 | my $all = "(?x: \n" . join("|\n ", @typeList) . "\n)"; | 464 | my $all = "(?x: \n" . join("|\n ", @typeList) . "\n)"; |
@@ -2215,6 +2245,23 @@ sub process { | |||
2215 | "8-bit UTF-8 used in possible commit log\n" . $herecurr); | 2245 | "8-bit UTF-8 used in possible commit log\n" . $herecurr); |
2216 | } | 2246 | } |
2217 | 2247 | ||
2248 | # Check for various typo / spelling mistakes | ||
2249 | if ($in_commit_log || $line =~ /^\+/) { | ||
2250 | while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:$|[^a-z@])/gi) { | ||
2251 | my $typo = $1; | ||
2252 | my $typo_fix = $spelling_fix{lc($typo)}; | ||
2253 | $typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/); | ||
2254 | $typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/); | ||
2255 | my $msg_type = \&WARN; | ||
2256 | $msg_type = \&CHK if ($file); | ||
2257 | if (&{$msg_type}("TYPO_SPELLING", | ||
2258 | "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) && | ||
2259 | $fix) { | ||
2260 | $fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/; | ||
2261 | } | ||
2262 | } | ||
2263 | } | ||
2264 | |||
2218 | # ignore non-hunk lines and lines being removed | 2265 | # ignore non-hunk lines and lines being removed |
2219 | next if (!$hunk_line || $line =~ /^-/); | 2266 | next if (!$hunk_line || $line =~ /^-/); |
2220 | 2267 | ||
@@ -2283,8 +2330,10 @@ sub process { | |||
2283 | } | 2330 | } |
2284 | $length++; | 2331 | $length++; |
2285 | } | 2332 | } |
2286 | WARN("CONFIG_DESCRIPTION", | 2333 | if ($is_start && $is_end && $length < $min_conf_desc_length) { |
2287 | "please write a paragraph that describes the config symbol fully\n" . $herecurr) if ($is_start && $is_end && $length < 4); | 2334 | WARN("CONFIG_DESCRIPTION", |
2335 | "please write a paragraph that describes the config symbol fully\n" . $herecurr); | ||
2336 | } | ||
2288 | #print "is_start<$is_start> is_end<$is_end> length<$length>\n"; | 2337 | #print "is_start<$is_start> is_end<$is_end> length<$length>\n"; |
2289 | } | 2338 | } |
2290 | 2339 | ||
@@ -2341,7 +2390,7 @@ sub process { | |||
2341 | } | 2390 | } |
2342 | 2391 | ||
2343 | # check we are in a valid source file if not then ignore this hunk | 2392 | # check we are in a valid source file if not then ignore this hunk |
2344 | next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/); | 2393 | next if ($realfile !~ /\.(h|c|s|S|pl|sh|dtsi|dts)$/); |
2345 | 2394 | ||
2346 | #line length limit | 2395 | #line length limit |
2347 | if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ && | 2396 | if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ && |
@@ -2402,7 +2451,7 @@ sub process { | |||
2402 | } | 2451 | } |
2403 | 2452 | ||
2404 | # check we are in a valid source file C or perl if not then ignore this hunk | 2453 | # check we are in a valid source file C or perl if not then ignore this hunk |
2405 | next if ($realfile !~ /\.(h|c|pl)$/); | 2454 | next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/); |
2406 | 2455 | ||
2407 | # at the beginning of a line any tabs must come first and anything | 2456 | # at the beginning of a line any tabs must come first and anything |
2408 | # more than 8 must use tabs. | 2457 | # more than 8 must use tabs. |
@@ -2424,7 +2473,7 @@ sub process { | |||
2424 | "please, no space before tabs\n" . $herevet) && | 2473 | "please, no space before tabs\n" . $herevet) && |
2425 | $fix) { | 2474 | $fix) { |
2426 | while ($fixed[$fixlinenr] =~ | 2475 | while ($fixed[$fixlinenr] =~ |
2427 | s/(^\+.*) {8,8}+\t/$1\t\t/) {} | 2476 | s/(^\+.*) {8,8}\t/$1\t\t/) {} |
2428 | while ($fixed[$fixlinenr] =~ | 2477 | while ($fixed[$fixlinenr] =~ |
2429 | s/(^\+.*) +\t/$1\t/) {} | 2478 | s/(^\+.*) +\t/$1\t/) {} |
2430 | } | 2479 | } |
@@ -2592,10 +2641,14 @@ sub process { | |||
2592 | next if ($realfile !~ /\.(h|c)$/); | 2641 | next if ($realfile !~ /\.(h|c)$/); |
2593 | 2642 | ||
2594 | # check indentation of any line with a bare else | 2643 | # check indentation of any line with a bare else |
2644 | # (but not if it is a multiple line "if (foo) return bar; else return baz;") | ||
2595 | # if the previous line is a break or return and is indented 1 tab more... | 2645 | # if the previous line is a break or return and is indented 1 tab more... |
2596 | if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) { | 2646 | if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) { |
2597 | my $tabs = length($1) + 1; | 2647 | my $tabs = length($1) + 1; |
2598 | if ($prevline =~ /^\+\t{$tabs,$tabs}(?:break|return)\b/) { | 2648 | if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ || |
2649 | ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ && | ||
2650 | defined $lines[$linenr] && | ||
2651 | $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) { | ||
2599 | WARN("UNNECESSARY_ELSE", | 2652 | WARN("UNNECESSARY_ELSE", |
2600 | "else is not generally useful after a break or return\n" . $hereprev); | 2653 | "else is not generally useful after a break or return\n" . $hereprev); |
2601 | } | 2654 | } |
@@ -3752,7 +3805,6 @@ sub process { | |||
3752 | if (ERROR("SPACING", | 3805 | if (ERROR("SPACING", |
3753 | "space prohibited before that close parenthesis ')'\n" . $herecurr) && | 3806 | "space prohibited before that close parenthesis ')'\n" . $herecurr) && |
3754 | $fix) { | 3807 | $fix) { |
3755 | print("fixlinenr: <$fixlinenr> fixed[fixlinenr]: <$fixed[$fixlinenr]>\n"); | ||
3756 | $fixed[$fixlinenr] =~ | 3808 | $fixed[$fixlinenr] =~ |
3757 | s/\s+\)/\)/; | 3809 | s/\s+\)/\)/; |
3758 | } | 3810 | } |
@@ -4060,12 +4112,17 @@ sub process { | |||
4060 | my $cnt = $realcnt; | 4112 | my $cnt = $realcnt; |
4061 | my ($off, $dstat, $dcond, $rest); | 4113 | my ($off, $dstat, $dcond, $rest); |
4062 | my $ctx = ''; | 4114 | my $ctx = ''; |
4115 | my $has_flow_statement = 0; | ||
4116 | my $has_arg_concat = 0; | ||
4063 | ($dstat, $dcond, $ln, $cnt, $off) = | 4117 | ($dstat, $dcond, $ln, $cnt, $off) = |
4064 | ctx_statement_block($linenr, $realcnt, 0); | 4118 | ctx_statement_block($linenr, $realcnt, 0); |
4065 | $ctx = $dstat; | 4119 | $ctx = $dstat; |
4066 | #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n"; | 4120 | #print "dstat<$dstat> dcond<$dcond> cnt<$cnt> off<$off>\n"; |
4067 | #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n"; | 4121 | #print "LINE<$lines[$ln-1]> len<" . length($lines[$ln-1]) . "\n"; |
4068 | 4122 | ||
4123 | $has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/); | ||
4124 | $has_arg_concat = 1 if ($ctx =~ /\#\#/); | ||
4125 | |||
4069 | $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//; | 4126 | $dstat =~ s/^.\s*\#\s*define\s+$Ident(?:\([^\)]*\))?\s*//; |
4070 | $dstat =~ s/$;//g; | 4127 | $dstat =~ s/$;//g; |
4071 | $dstat =~ s/\\\n.//g; | 4128 | $dstat =~ s/\\\n.//g; |
@@ -4126,10 +4183,23 @@ sub process { | |||
4126 | "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx"); | 4183 | "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx"); |
4127 | } else { | 4184 | } else { |
4128 | ERROR("COMPLEX_MACRO", | 4185 | ERROR("COMPLEX_MACRO", |
4129 | "Macros with complex values should be enclosed in parenthesis\n" . "$herectx"); | 4186 | "Macros with complex values should be enclosed in parentheses\n" . "$herectx"); |
4130 | } | 4187 | } |
4131 | } | 4188 | } |
4132 | 4189 | ||
4190 | # check for macros with flow control, but without ## concatenation | ||
4191 | # ## concatenation is commonly a macro that defines a function so ignore those | ||
4192 | if ($has_flow_statement && !$has_arg_concat) { | ||
4193 | my $herectx = $here . "\n"; | ||
4194 | my $cnt = statement_rawlines($ctx); | ||
4195 | |||
4196 | for (my $n = 0; $n < $cnt; $n++) { | ||
4197 | $herectx .= raw_line($linenr, $n) . "\n"; | ||
4198 | } | ||
4199 | WARN("MACRO_WITH_FLOW_CONTROL", | ||
4200 | "Macros with flow control statements should be avoided\n" . "$herectx"); | ||
4201 | } | ||
4202 | |||
4133 | # check for line continuations outside of #defines, preprocessor #, and asm | 4203 | # check for line continuations outside of #defines, preprocessor #, and asm |
4134 | 4204 | ||
4135 | } else { | 4205 | } else { |
@@ -4338,6 +4408,12 @@ sub process { | |||
4338 | "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr); | 4408 | "Use of volatile is usually wrong: see Documentation/volatile-considered-harmful.txt\n" . $herecurr); |
4339 | } | 4409 | } |
4340 | 4410 | ||
4411 | # concatenated string without spaces between elements | ||
4412 | if ($line =~ /"X+"[A-Z_]+/ || $line =~ /[A-Z_]+"X+"/) { | ||
4413 | CHK("CONCATENATED_STRING", | ||
4414 | "Concatenated strings should use spaces between elements\n" . $herecurr); | ||
4415 | } | ||
4416 | |||
4341 | # warn about #if 0 | 4417 | # warn about #if 0 |
4342 | if ($line =~ /^.\s*\#\s*if\s+0\b/) { | 4418 | if ($line =~ /^.\s*\#\s*if\s+0\b/) { |
4343 | CHK("REDUNDANT_CODE", | 4419 | CHK("REDUNDANT_CODE", |
@@ -4371,6 +4447,17 @@ sub process { | |||
4371 | } | 4447 | } |
4372 | } | 4448 | } |
4373 | 4449 | ||
4450 | # check for logging functions with KERN_<LEVEL> | ||
4451 | if ($line !~ /printk\s*\(/ && | ||
4452 | $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) { | ||
4453 | my $level = $1; | ||
4454 | if (WARN("UNNECESSARY_KERN_LEVEL", | ||
4455 | "Possible unnecessary $level\n" . $herecurr) && | ||
4456 | $fix) { | ||
4457 | $fixed[$fixlinenr] =~ s/\s*$level\s*//; | ||
4458 | } | ||
4459 | } | ||
4460 | |||
4374 | # check for bad placement of section $InitAttribute (e.g.: __initdata) | 4461 | # check for bad placement of section $InitAttribute (e.g.: __initdata) |
4375 | if ($line =~ /(\b$InitAttribute\b)/) { | 4462 | if ($line =~ /(\b$InitAttribute\b)/) { |
4376 | my $attr = $1; | 4463 | my $attr = $1; |