checksrc: complain on == NULL or != 0 checks in conditions

... to make them all consistenly use if(!var) and if(var)

Also added a few missing warnings to the documentation.

Closes #6912
This commit is contained in:
Daniel Stenberg 2021-04-19 10:45:29 +02:00
parent 063d3f3b96
commit 52fab72397
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2
2 changed files with 36 additions and 4 deletions

View File

@ -33,8 +33,9 @@ warnings are:
- `ASSIGNWITHINCONDITION`: Assignment within a conditional expression. The
code style mandates the assignment to be done outside of it.
- `ASTERISKNOSPACE`: A pointer was declared like `char* name` instead of the more
appropriate `char *name` style. The asterisk should sit next to the name.
- `ASTERISKNOSPACE`: A pointer was declared like `char* name` instead of the
more appropriate `char *name` style. The asterisk should sit next to the
name.
- `ASTERISKSPACE`: A pointer was declared like `char * name` instead of the
more appropriate `char *name` style. The asterisk should sit right next to
@ -47,16 +48,28 @@ warnings are:
strcat, strncat, gets are **never** allowed in curl source code.
- `BRACEELSE`: '} else' on the same line. The else is supposed to be on the
following line.
following line.
- `BRACEPOS`: wrong position for an open brace (`{`).
- `BRACEWHILE`: more than once space between end brace and while keyword
- `COMMANOSPACE`: a comma without following space
- `COPYRIGHT`: the file is missing a copyright statement!
- `CPPCOMMENTS`: `//` comment detected, that's not C89 compliant
- `DOBRACE`: only use one space after do before open brace
- `EMPTYLINEBRACE`: found empty line before open brace
- `EQUALSNOSPACE`: no space after `=` sign
- `EQUALSNULL`: comparison with `== NULL` used in if/while. We use `!var`.
- `EXCLAMATIONSPACE`: space found after exclamations mark
- `FOPENMODE`: `fopen()` needs a macro for the mode string, use it
- `INDENTATION`: detected a wrong start column for code. Note that this
@ -70,6 +83,8 @@ warnings are:
- `NOSPACEEQUALS`: An equals sign was found without preceding space. We prefer
`a = 2` and *not* `a=2`.
- `NOTEQUALSZERO`: check found using `!= 0`. We use plain `if(var)`.
- `ONELINECONDITION`: do not put the conditional block on the same line as `if()`
- `OPENCOMMENT`: File ended with a comment (`/*`) still "open".

View File

@ -6,7 +6,7 @@
# | (__| |_| | _ <| |___
# \___|\___/|_| \_\_____|
#
# Copyright (C) 2011 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
# Copyright (C) 2011 - 2021, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
@ -86,6 +86,8 @@ my %warnings = (
'BRACEWHILE' => 'A single space between open brace and while',
'EXCLAMATIONSPACE' => 'Whitespace after exclamation mark in expression',
'EMPTYLINEBRACE' => 'Empty line before the open brace',
'EQUALSNULL' => 'if/while comparison with == NULL',
'NOTEQUALSZERO' => 'if/while comparison with != 0'
);
sub readskiplist {
@ -471,6 +473,21 @@ sub scanfile {
"$2 with space");
}
}
# check for '== NULL' in if/while conditions but not if the thing on
# the left of it is a function call
if($nostr =~ /^(.*)(if|while)(\(.*[^)]) == NULL/) {
checkwarn("EQUALSNULL", $line,
length($1) + length($2) + length($3),
$file, $l, "we prefer !variable instead of \"== NULL\" comparisons");
}
# check for '!= 0' in if/while conditions but not if the thing on
# the left of it is a function call
if($nostr =~ /^(.*)(if|while)(\(.*[^)]) != 0[^x]/) {
checkwarn("NOTEQUALSZERO", $line,
length($1) + length($2) + length($3),
$file, $l, "we prefer if(rc) instead of \"rc != 0\" comparisons");
}
# check spaces in 'do {'
if($nostr =~ /^( *)do( *)\{/ && length($2) != 1) {