"CONST <comparison> variable" checks like: if (NULL != foo) and while (0 < bar(...)) where a constant (or what appears to be a constant like an upper case identifier) is on the left of a comparison are generally preferred to be written using the constant on the right side like: if (foo != NULL) and while (bar(...) > 0) Add a test for this. Add a --fix option too, but only do it when the code is immediately surrounded by parentheses to avoid misfixing things like "(0 < bar() + constant)"
Showing the changes to scripts/checkpatch.pl (1 of 1 file). Show all
Unified · Split
| @@ -4231,6 +4231,35 @@ sub process { · 4230 unmodified lines | ||
| 4231 | 4231 | } |
| 4232 | 4232 | } |
| 4233 | 4233 | |
| 4234 | +# comparisons with a constant or upper case identifier on the left | |
| 4235 | +# avoid cases like "foo + BAR < baz" | |
| 4236 | +# only fix matches surrounded by parentheses to avoid incorrect | |
| 4237 | +# conversions like "FOO < baz() + 5" being "misfixed" to "baz() > FOO + 5" | |
| 4238 | + if ($^V && $^V ge 5.10.0 && | |
| 4239 | + $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) { | |
| 4240 | + my $lead = $1; | |
| 4241 | + my $const = $2; | |
| 4242 | + my $comp = $3; | |
| 4243 | + my $to = $4; | |
| 4244 | + my $newcomp = $comp; | |
| 4245 | + if ($lead !~ /$Operators\s*$/ && | |
| 4246 | + $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ && | |
| 4247 | + WARN("CONSTANT_COMPARISON", | |
| 4248 | + "Comparisons should place the constant on the right side of the test\n" . $herecurr) && | |
| 4249 | + $fix) { | |
| 4250 | + if ($comp eq "<") { | |
| 4251 | + $newcomp = ">"; | |
| 4252 | + } elsif ($comp eq "<=") { | |
| 4253 | + $newcomp = ">="; | |
| 4254 | + } elsif ($comp eq ">") { | |
| 4255 | + $newcomp = "<"; | |
| 4256 | + } elsif ($comp eq ">=") { | |
| 4257 | + $newcomp = "<="; | |
| 4258 | + } | |
| 4259 | + $fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/; | |
| 4260 | + } | |
| 4261 | + } | |
| 4262 | + | |
| 4234 | 4263 | # Return of what appears to be an errno should normally be negative |
| 4235 | 4264 | if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) { |
| 4236 | 4265 | my $name = $1; |