diff options
Diffstat (limited to 'scripts/checkpatch.pl')
| -rwxr-xr-x | scripts/checkpatch.pl | 150 |
1 files changed, 107 insertions, 43 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 64ec4b8a51b5..b6bbbcdc557e 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl | |||
| @@ -9,7 +9,7 @@ use strict; | |||
| 9 | my $P = $0; | 9 | my $P = $0; |
| 10 | $P =~ s@.*/@@g; | 10 | $P =~ s@.*/@@g; |
| 11 | 11 | ||
| 12 | my $V = '0.16'; | 12 | my $V = '0.18'; |
| 13 | 13 | ||
| 14 | use Getopt::Long qw(:config no_auto_abbrev); | 14 | use Getopt::Long qw(:config no_auto_abbrev); |
| 15 | 15 | ||
| @@ -131,6 +131,17 @@ our $NonptrType; | |||
| 131 | our $Type; | 131 | our $Type; |
| 132 | our $Declare; | 132 | our $Declare; |
| 133 | 133 | ||
| 134 | our $UTF8 = qr { | ||
| 135 | [\x09\x0A\x0D\x20-\x7E] # ASCII | ||
| 136 | | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | ||
| 137 | | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | ||
| 138 | | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | ||
| 139 | | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | ||
| 140 | | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | ||
| 141 | | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | ||
| 142 | | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 | ||
| 143 | }x; | ||
| 144 | |||
| 134 | our @typeList = ( | 145 | our @typeList = ( |
| 135 | qr{void}, | 146 | qr{void}, |
| 136 | qr{char}, | 147 | qr{char}, |
| @@ -692,7 +703,7 @@ sub annotate_values { | |||
| 692 | while (length($cur)) { | 703 | while (length($cur)) { |
| 693 | @av_paren_type = ('E') if ($#av_paren_type < 0); | 704 | @av_paren_type = ('E') if ($#av_paren_type < 0); |
| 694 | print " <" . join('', @av_paren_type) . | 705 | print " <" . join('', @av_paren_type) . |
| 695 | "> <$type> " if ($dbg_values > 1); | 706 | "> <$type> <$av_pending>" if ($dbg_values > 1); |
| 696 | if ($cur =~ /^(\s+)/o) { | 707 | if ($cur =~ /^(\s+)/o) { |
| 697 | print "WS($1)\n" if ($dbg_values > 1); | 708 | print "WS($1)\n" if ($dbg_values > 1); |
| 698 | if ($1 =~ /\n/ && $av_preprocessor) { | 709 | if ($1 =~ /\n/ && $av_preprocessor) { |
| @@ -705,9 +716,18 @@ sub annotate_values { | |||
| 705 | $type = 'T'; | 716 | $type = 'T'; |
| 706 | 717 | ||
| 707 | } elsif ($cur =~ /^(#\s*define\s*$Ident)(\(?)/o) { | 718 | } elsif ($cur =~ /^(#\s*define\s*$Ident)(\(?)/o) { |
| 708 | print "DEFINE($1)\n" if ($dbg_values > 1); | 719 | print "DEFINE($1,$2)\n" if ($dbg_values > 1); |
| 709 | $av_preprocessor = 1; | 720 | $av_preprocessor = 1; |
| 710 | $av_pending = 'N'; | 721 | push(@av_paren_type, $type); |
| 722 | if ($2 ne '') { | ||
| 723 | $av_pending = 'N'; | ||
| 724 | } | ||
| 725 | $type = 'E'; | ||
| 726 | |||
| 727 | } elsif ($cur =~ /^(#\s*undef\s*$Ident)/o) { | ||
| 728 | print "UNDEF($1)\n" if ($dbg_values > 1); | ||
| 729 | $av_preprocessor = 1; | ||
| 730 | push(@av_paren_type, $type); | ||
| 711 | 731 | ||
| 712 | } elsif ($cur =~ /^(#\s*(?:ifdef|ifndef|if))/o) { | 732 | } elsif ($cur =~ /^(#\s*(?:ifdef|ifndef|if))/o) { |
| 713 | print "PRE_START($1)\n" if ($dbg_values > 1); | 733 | print "PRE_START($1)\n" if ($dbg_values > 1); |
| @@ -715,7 +735,7 @@ sub annotate_values { | |||
| 715 | 735 | ||
| 716 | push(@av_paren_type, $type); | 736 | push(@av_paren_type, $type); |
| 717 | push(@av_paren_type, $type); | 737 | push(@av_paren_type, $type); |
| 718 | $type = 'N'; | 738 | $type = 'E'; |
| 719 | 739 | ||
| 720 | } elsif ($cur =~ /^(#\s*(?:else|elif))/o) { | 740 | } elsif ($cur =~ /^(#\s*(?:else|elif))/o) { |
| 721 | print "PRE_RESTART($1)\n" if ($dbg_values > 1); | 741 | print "PRE_RESTART($1)\n" if ($dbg_values > 1); |
| @@ -723,7 +743,7 @@ sub annotate_values { | |||
| 723 | 743 | ||
| 724 | push(@av_paren_type, $av_paren_type[$#av_paren_type]); | 744 | push(@av_paren_type, $av_paren_type[$#av_paren_type]); |
| 725 | 745 | ||
| 726 | $type = 'N'; | 746 | $type = 'E'; |
| 727 | 747 | ||
| 728 | } elsif ($cur =~ /^(#\s*(?:endif))/o) { | 748 | } elsif ($cur =~ /^(#\s*(?:endif))/o) { |
| 729 | print "PRE_END($1)\n" if ($dbg_values > 1); | 749 | print "PRE_END($1)\n" if ($dbg_values > 1); |
| @@ -734,11 +754,16 @@ sub annotate_values { | |||
| 734 | # one does, and continue as if the #endif was not here. | 754 | # one does, and continue as if the #endif was not here. |
| 735 | pop(@av_paren_type); | 755 | pop(@av_paren_type); |
| 736 | push(@av_paren_type, $type); | 756 | push(@av_paren_type, $type); |
| 737 | $type = 'N'; | 757 | $type = 'E'; |
| 738 | 758 | ||
| 739 | } elsif ($cur =~ /^(\\\n)/o) { | 759 | } elsif ($cur =~ /^(\\\n)/o) { |
| 740 | print "PRECONT($1)\n" if ($dbg_values > 1); | 760 | print "PRECONT($1)\n" if ($dbg_values > 1); |
| 741 | 761 | ||
| 762 | } elsif ($cur =~ /^(__attribute__)\s*\(?/o) { | ||
| 763 | print "ATTR($1)\n" if ($dbg_values > 1); | ||
| 764 | $av_pending = $type; | ||
| 765 | $type = 'N'; | ||
| 766 | |||
| 742 | } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { | 767 | } elsif ($cur =~ /^(sizeof)\s*(\()?/o) { |
| 743 | print "SIZEOF($1)\n" if ($dbg_values > 1); | 768 | print "SIZEOF($1)\n" if ($dbg_values > 1); |
| 744 | if (defined $2) { | 769 | if (defined $2) { |
| @@ -930,7 +955,7 @@ sub process { | |||
| 930 | # edge is a close comment then we must be in a comment | 955 | # edge is a close comment then we must be in a comment |
| 931 | # at context start. | 956 | # at context start. |
| 932 | my $edge; | 957 | my $edge; |
| 933 | for (my $ln = $linenr; $ln < ($linenr + $realcnt); $ln++) { | 958 | for (my $ln = $linenr + 1; $ln < ($linenr + $realcnt); $ln++) { |
| 934 | next if ($line =~ /^-/); | 959 | next if ($line =~ /^-/); |
| 935 | ($edge) = ($rawlines[$ln - 1] =~ m@(/\*|\*/)@); | 960 | ($edge) = ($rawlines[$ln - 1] =~ m@(/\*|\*/)@); |
| 936 | last if (defined $edge); | 961 | last if (defined $edge); |
| @@ -951,9 +976,9 @@ sub process { | |||
| 951 | ##print "COMMENT:$in_comment edge<$edge> $rawline\n"; | 976 | ##print "COMMENT:$in_comment edge<$edge> $rawline\n"; |
| 952 | sanitise_line_reset($in_comment); | 977 | sanitise_line_reset($in_comment); |
| 953 | 978 | ||
| 954 | } elsif ($realcnt) { | 979 | } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) { |
| 955 | # Standardise the strings and chars within the input to | 980 | # Standardise the strings and chars within the input to |
| 956 | # simplify matching. | 981 | # simplify matching -- only bother with positive lines. |
| 957 | $line = sanitise_line($rawline); | 982 | $line = sanitise_line($rawline); |
| 958 | } | 983 | } |
| 959 | push(@lines, $line); | 984 | push(@lines, $line); |
| @@ -1066,17 +1091,14 @@ sub process { | |||
| 1066 | 1091 | ||
| 1067 | # UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php | 1092 | # UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php |
| 1068 | if (($realfile =~ /^$/ || $line =~ /^\+/) && | 1093 | if (($realfile =~ /^$/ || $line =~ /^\+/) && |
| 1069 | !($rawline =~ m/^( | 1094 | $rawline !~ m/^$UTF8*$/) { |
| 1070 | [\x09\x0A\x0D\x20-\x7E] # ASCII | 1095 | my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/); |
| 1071 | | [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte | 1096 | |
| 1072 | | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs | 1097 | my $blank = copy_spacing($rawline); |
| 1073 | | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte | 1098 | my $ptr = substr($blank, 0, length($utf8_prefix)) . "^"; |
| 1074 | | \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates | 1099 | my $hereptr = "$hereline$ptr\n"; |
| 1075 | | \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 | 1100 | |
| 1076 | | [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 | 1101 | ERROR("Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr); |
| 1077 | | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 | ||
| 1078 | )*$/x )) { | ||
| 1079 | ERROR("Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $herecurr); | ||
| 1080 | } | 1102 | } |
| 1081 | 1103 | ||
| 1082 | #ignore lines being removed | 1104 | #ignore lines being removed |
| @@ -1112,7 +1134,7 @@ sub process { | |||
| 1112 | if ($rawline =~ /^\+\s* \t\s*\S/ || | 1134 | if ($rawline =~ /^\+\s* \t\s*\S/ || |
| 1113 | $rawline =~ /^\+\s* \s*/) { | 1135 | $rawline =~ /^\+\s* \s*/) { |
| 1114 | my $herevet = "$here\n" . cat_vet($rawline) . "\n"; | 1136 | my $herevet = "$here\n" . cat_vet($rawline) . "\n"; |
| 1115 | ERROR("use tabs not spaces\n" . $herevet); | 1137 | ERROR("code indent should use tabs where possible\n" . $herevet); |
| 1116 | } | 1138 | } |
| 1117 | 1139 | ||
| 1118 | # check for RCS/CVS revision markers | 1140 | # check for RCS/CVS revision markers |
| @@ -1121,35 +1143,40 @@ sub process { | |||
| 1121 | } | 1143 | } |
| 1122 | 1144 | ||
| 1123 | # Check for potential 'bare' types | 1145 | # Check for potential 'bare' types |
| 1124 | if ($realcnt) { | 1146 | my ($stat, $cond); |
| 1125 | my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); | 1147 | if ($realcnt && $line =~ /.\s*\S/) { |
| 1126 | $s =~ s/\n./ /g; | 1148 | ($stat, $cond) = ctx_statement_block($linenr, |
| 1127 | $s =~ s/{.*$//; | 1149 | $realcnt, 0); |
| 1150 | $stat =~ s/\n./\n /g; | ||
| 1151 | $cond =~ s/\n./\n /g; | ||
| 1152 | |||
| 1153 | my $s = $stat; | ||
| 1154 | $s =~ s/{.*$//s; | ||
| 1128 | 1155 | ||
| 1129 | # Ignore goto labels. | 1156 | # Ignore goto labels. |
| 1130 | if ($s =~ /$Ident:\*$/) { | 1157 | if ($s =~ /$Ident:\*$/s) { |
| 1131 | 1158 | ||
| 1132 | # Ignore functions being called | 1159 | # Ignore functions being called |
| 1133 | } elsif ($s =~ /^.\s*$Ident\s*\(/) { | 1160 | } elsif ($s =~ /^.\s*$Ident\s*\(/s) { |
| 1134 | 1161 | ||
| 1135 | # definitions in global scope can only start with types | 1162 | # definitions in global scope can only start with types |
| 1136 | } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b/) { | 1163 | } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b/s) { |
| 1137 | possible($1, $s); | 1164 | possible($1, $s); |
| 1138 | 1165 | ||
| 1139 | # declarations always start with types | 1166 | # declarations always start with types |
| 1140 | } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:const\s+)?($Ident)\b(:?\s+$Sparse)?\s*\**\s*$Ident\s*(?:;|=|,)/) { | 1167 | } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:const\s+)?($Ident)\b(:?\s+$Sparse)?\s*\**\s*$Ident\s*(?:;|=|,)/s) { |
| 1141 | possible($1, $s); | 1168 | possible($1, $s); |
| 1142 | } | 1169 | } |
| 1143 | 1170 | ||
| 1144 | # any (foo ... *) is a pointer cast, and foo is a type | 1171 | # any (foo ... *) is a pointer cast, and foo is a type |
| 1145 | while ($s =~ /\(($Ident)(?:\s+$Sparse)*\s*\*+\s*\)/g) { | 1172 | while ($s =~ /\(($Ident)(?:\s+$Sparse)*\s*\*+\s*\)/sg) { |
| 1146 | possible($1, $s); | 1173 | possible($1, $s); |
| 1147 | } | 1174 | } |
| 1148 | 1175 | ||
| 1149 | # Check for any sort of function declaration. | 1176 | # Check for any sort of function declaration. |
| 1150 | # int foo(something bar, other baz); | 1177 | # int foo(something bar, other baz); |
| 1151 | # void (*store_gdt)(x86_descr_ptr *); | 1178 | # void (*store_gdt)(x86_descr_ptr *); |
| 1152 | if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/) { | 1179 | if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) { |
| 1153 | my ($name_len) = length($1); | 1180 | my ($name_len) = length($1); |
| 1154 | 1181 | ||
| 1155 | my $ctx = $s; | 1182 | my $ctx = $s; |
| @@ -1282,18 +1309,19 @@ sub process { | |||
| 1282 | ($prevline !~ /^ }/) && | 1309 | ($prevline !~ /^ }/) && |
| 1283 | ($prevline !~ /^.DECLARE_$Ident\(\Q$name\E\)/) && | 1310 | ($prevline !~ /^.DECLARE_$Ident\(\Q$name\E\)/) && |
| 1284 | ($prevline !~ /^.LIST_HEAD\(\Q$name\E\)/) && | 1311 | ($prevline !~ /^.LIST_HEAD\(\Q$name\E\)/) && |
| 1312 | ($prevline !~ /^.$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(/) && | ||
| 1285 | ($prevline !~ /\b\Q$name\E(?:\s+$Attribute)?\s*(?:;|=|\[)/)) { | 1313 | ($prevline !~ /\b\Q$name\E(?:\s+$Attribute)?\s*(?:;|=|\[)/)) { |
| 1286 | WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); | 1314 | WARN("EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr); |
| 1287 | } | 1315 | } |
| 1288 | } | 1316 | } |
| 1289 | 1317 | ||
| 1290 | # check for external initialisers. | 1318 | # check for external initialisers. |
| 1291 | if ($line =~ /^.$Type\s*$Ident\s*=\s*(0|NULL);/) { | 1319 | if ($line =~ /^.$Type\s*$Ident\s*=\s*(0|NULL|false)\s*;/) { |
| 1292 | ERROR("do not initialise externals to 0 or NULL\n" . | 1320 | ERROR("do not initialise externals to 0 or NULL\n" . |
| 1293 | $herecurr); | 1321 | $herecurr); |
| 1294 | } | 1322 | } |
| 1295 | # check for static initialisers. | 1323 | # check for static initialisers. |
| 1296 | if ($line =~ /\s*static\s.*=\s*(0|NULL);/) { | 1324 | if ($line =~ /\s*static\s.*=\s*(0|NULL|false)\s*;/) { |
| 1297 | ERROR("do not initialise statics to 0 or NULL\n" . | 1325 | ERROR("do not initialise statics to 0 or NULL\n" . |
| 1298 | $herecurr); | 1326 | $herecurr); |
| 1299 | } | 1327 | } |
| @@ -1512,7 +1540,10 @@ sub process { | |||
| 1512 | if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { | 1540 | if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) { |
| 1513 | ERROR("space required before that '$op' $at\n" . $hereptr); | 1541 | ERROR("space required before that '$op' $at\n" . $hereptr); |
| 1514 | } | 1542 | } |
| 1515 | if ($ctx =~ /.xW/) { | 1543 | if ($op eq '*' && $cc =~/\s*const\b/) { |
| 1544 | # A unary '*' may be const | ||
| 1545 | |||
| 1546 | } elsif ($ctx =~ /.xW/) { | ||
| 1516 | ERROR("space prohibited after that '$op' $at\n" . $hereptr); | 1547 | ERROR("space prohibited after that '$op' $at\n" . $hereptr); |
| 1517 | } | 1548 | } |
| 1518 | 1549 | ||
| @@ -1617,7 +1648,7 @@ sub process { | |||
| 1617 | 1648 | ||
| 1618 | # Check for illegal assignment in if conditional. | 1649 | # Check for illegal assignment in if conditional. |
| 1619 | if ($line =~ /\bif\s*\(/) { | 1650 | if ($line =~ /\bif\s*\(/) { |
| 1620 | my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0); | 1651 | my ($s, $c) = ($stat, $cond); |
| 1621 | 1652 | ||
| 1622 | if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/) { | 1653 | if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/) { |
| 1623 | ERROR("do not use assignment in if condition\n" . $herecurr); | 1654 | ERROR("do not use assignment in if condition\n" . $herecurr); |
| @@ -1695,7 +1726,7 @@ sub process { | |||
| 1695 | #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line) | 1726 | #warn if <asm/foo.h> is #included and <linux/foo.h> is available (uses RAW line) |
| 1696 | if ($tree && $rawline =~ m{^.\#\s*include\s*\<asm\/(.*)\.h\>}) { | 1727 | if ($tree && $rawline =~ m{^.\#\s*include\s*\<asm\/(.*)\.h\>}) { |
| 1697 | my $checkfile = "$root/include/linux/$1.h"; | 1728 | my $checkfile = "$root/include/linux/$1.h"; |
| 1698 | if (-f $checkfile && $1 ne 'irq.h') { | 1729 | if (-f $checkfile && $1 ne 'irq') { |
| 1699 | WARN("Use #include <linux/$1.h> instead of <asm/$1.h>\n" . | 1730 | WARN("Use #include <linux/$1.h> instead of <asm/$1.h>\n" . |
| 1700 | $herecurr); | 1731 | $herecurr); |
| 1701 | } | 1732 | } |
| @@ -1910,7 +1941,8 @@ sub process { | |||
| 1910 | } | 1941 | } |
| 1911 | 1942 | ||
| 1912 | # check for spinlock_t definitions without a comment. | 1943 | # check for spinlock_t definitions without a comment. |
| 1913 | if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/) { | 1944 | if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ || |
| 1945 | $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) { | ||
| 1914 | my $which = $1; | 1946 | my $which = $1; |
| 1915 | if (!ctx_has_comment($first_line, $linenr)) { | 1947 | if (!ctx_has_comment($first_line, $linenr)) { |
| 1916 | CHK("$1 definition without comment\n" . $herecurr); | 1948 | CHK("$1 definition without comment\n" . $herecurr); |
| @@ -1940,7 +1972,26 @@ sub process { | |||
| 1940 | } | 1972 | } |
| 1941 | 1973 | ||
| 1942 | # check for new externs in .c files. | 1974 | # check for new externs in .c files. |
| 1943 | if ($line =~ /^.\s*extern\s/ && ($realfile =~ /\.c$/)) { | 1975 | if ($realfile =~ /\.c$/ && defined $stat && |
| 1976 | $stat =~ /^.\s*(?:extern\s+)?$Type\s+$Ident(\s*)\(/s) | ||
| 1977 | { | ||
| 1978 | my $paren_space = $1; | ||
| 1979 | |||
| 1980 | my $s = $stat; | ||
| 1981 | if (defined $cond) { | ||
| 1982 | substr($s, 0, length($cond), ''); | ||
| 1983 | } | ||
| 1984 | if ($s =~ /^\s*;/) { | ||
| 1985 | WARN("externs should be avoided in .c files\n" . $herecurr); | ||
| 1986 | } | ||
| 1987 | |||
| 1988 | if ($paren_space =~ /\n/) { | ||
| 1989 | WARN("arguments for function declarations should follow identifier\n" . $herecurr); | ||
| 1990 | } | ||
| 1991 | |||
| 1992 | } elsif ($realfile =~ /\.c$/ && defined $stat && | ||
| 1993 | $stat =~ /^.\s*extern\s+/) | ||
| 1994 | { | ||
| 1944 | WARN("externs should be avoided in .c files\n" . $herecurr); | 1995 | WARN("externs should be avoided in .c files\n" . $herecurr); |
| 1945 | } | 1996 | } |
| 1946 | 1997 | ||
| @@ -1964,11 +2015,11 @@ sub process { | |||
| 1964 | } | 2015 | } |
| 1965 | 2016 | ||
| 1966 | # check for semaphores used as mutexes | 2017 | # check for semaphores used as mutexes |
| 1967 | if ($line =~ /\b(DECLARE_MUTEX|init_MUTEX)\s*\(/) { | 2018 | if ($line =~ /^.\s*(DECLARE_MUTEX|init_MUTEX)\s*\(/) { |
| 1968 | WARN("mutexes are preferred for single holder semaphores\n" . $herecurr); | 2019 | WARN("mutexes are preferred for single holder semaphores\n" . $herecurr); |
| 1969 | } | 2020 | } |
| 1970 | # check for semaphores used as mutexes | 2021 | # check for semaphores used as mutexes |
| 1971 | if ($line =~ /\binit_MUTEX_LOCKED\s*\(/) { | 2022 | if ($line =~ /^.\s*init_MUTEX_LOCKED\s*\(/) { |
| 1972 | WARN("consider using a completion\n" . $herecurr); | 2023 | WARN("consider using a completion\n" . $herecurr); |
| 1973 | } | 2024 | } |
| 1974 | # recommend strict_strto* over simple_strto* | 2025 | # recommend strict_strto* over simple_strto* |
| @@ -1979,11 +2030,24 @@ sub process { | |||
| 1979 | # use of NR_CPUS is usually wrong | 2030 | # use of NR_CPUS is usually wrong |
| 1980 | # ignore definitions of NR_CPUS and usage to define arrays as likely right | 2031 | # ignore definitions of NR_CPUS and usage to define arrays as likely right |
| 1981 | if ($line =~ /\bNR_CPUS\b/ && | 2032 | if ($line =~ /\bNR_CPUS\b/ && |
| 1982 | $line !~ /^.#\s*define\s+NR_CPUS\s+/ && | 2033 | $line !~ /^.#\s*if\b.*\bNR_CPUS\b/ && |
| 1983 | $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/) | 2034 | $line !~ /^.#\s*define\b.*\bNR_CPUS\b/ && |
| 2035 | $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ && | ||
| 2036 | $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ && | ||
| 2037 | $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/) | ||
| 1984 | { | 2038 | { |
| 1985 | WARN("usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr); | 2039 | WARN("usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr); |
| 1986 | } | 2040 | } |
| 2041 | |||
| 2042 | # check for %L{u,d,i} in strings | ||
| 2043 | my $string; | ||
| 2044 | while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) { | ||
| 2045 | $string = substr($rawline, $-[1], $+[1] - $-[1]); | ||
| 2046 | if ($string =~ /(?<!%)%L[udi]/) { | ||
| 2047 | WARN("\%Ld/%Lu are not-standard C, use %lld/%llu\n" . $herecurr); | ||
| 2048 | last; | ||
| 2049 | } | ||
| 2050 | } | ||
| 1987 | } | 2051 | } |
| 1988 | 2052 | ||
| 1989 | # If we have no input at all, then there is nothing to report on | 2053 | # If we have no input at all, then there is nothing to report on |
