← Commit list

419b1c0b75

Viktor Szakats
Viktor Szakats
2026-05-21
SUCCESS Duration: 293s

Subject

checksrc: detect `curlx_safefree()` opportunities

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

docs/internals/CHECKSRC.md+4 -0
@@ -129,6 +129,10 @@ warnings are:
- `UNUSEDIGNORE`: a `checksrc` inlined warning ignore was asked for but not
used, that is an ignore that should be removed or changed to get used.
+- `USESAFEFREE`: there was a `curlx_free(var)` call made right before assigning
+ NULL to `var`. We prefer replacing that with `curlx_safefree()`, which is
+ doing these two operations in a single call.
+
### Extended warnings
Some warnings are computationally expensive to perform, so they are turned off
scripts/checksrc.pl+21 -0
@@ -201,6 +201,7 @@ my %warnings = (
'TRAILINGSPACE' => 'Trailing whitespace on the line',
'TYPEDEFSTRUCT' => 'typedefed struct',
'UNUSEDIGNORE' => 'a warning ignore was not used',
+ 'USESAFEFREE' => 'replace curlx_free() + NULL assignment with curlx_safefree()',
);
sub readskiplist {
@@ -532,6 +533,8 @@ sub scanfile {
my $l = "";
my $prep = 0;
my $prevp = 0;
+ my $prevfreeindent = "";
+ my $prevfreevar = "";
if($verbose) {
printf "Checking file: $file\n";
@@ -973,6 +976,24 @@ sub scanfile {
$line, length($1), $file, $ol, "no space before label");
}
+ if($prevfreevar ne "") {
+ if(rindex($l, "$prevfreeindent$prevfreevar = NULL;", 0) == 0) {
+ checkwarn("USESAFEFREE",
+ $line, length($prevfreeindent), $file, $ol,
+ "replace curlx_free() + NULL assignment with curlx_safefree()");
+ }
+ }
+ if($l) {
+ if($l =~ /^( *)curlx_free\(([^)]+)\);/) {
+ $prevfreeindent = $1;
+ $prevfreevar = $2;
+ }
+ else {
+ $prevfreeindent = "";
+ $prevfreevar = "";
+ }
+ }
+
# scan for use of banned functions
my $bl = $l;
again:
tests/data/test1185+8 -1
@@ -91,6 +91,10 @@ void startfunc(int a, int b) {
int d = impl->magicbad(1); /* member function always allowed */
int e = impl.magicbad(); /* member function always allowed */
+ curlx_free(ptr); /* two line
+ comment */
+ ptr = NULL; /* comment more */
+
/* comment does not end
</file>
@@ -227,13 +231,16 @@ void startfunc(int a, int b) {
./%LOGDIR/code1185.c:71:2: warning: // comment (CPPCOMMENTS)
// CPP comment ?
^
+./%LOGDIR/code1185.c:78:2: warning: replace curlx_free() + NULL assignment with curlx_safefree() (USESAFEFREE)
+ ptr = NULL; /* more comment */
+ ^
./%LOGDIR/code1185.c:1:1: error: Missing copyright statement (COPYRIGHT)
%SP
^
./%LOGDIR/code1185.c:1:1: error: Missing closing comment (OPENCOMMENT)
%SP
^
-checksrc: 3 errors and 42 warnings
+checksrc: 3 errors and 43 warnings
</stdout>
<errorcode>
5