History

checkpatch: add constant comparison on left side test

"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)"

Joe Perches committed 11 years ago

Commit c5595fa1 parent 54507b51 file · +29 −0Browse files

Showing the changes to scripts/checkpatch.pl (1 of 1 file). Show all

Unified · Split

scripts/checkpatch.pl+29−0
@@ -4231,6 +4231,35 @@ sub process { · 4230 unmodified lines
42314231 }
42324232 }
42334233
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+
42344263 # Return of what appears to be an errno should normally be negative
42354264 if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
42364265 my $name = $1;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t