tool: use our own stderr variable

Earlier this year we changed our own stderr variable to use the standard
name `stderr` (to avoid bugs where someone is using `stderr` instead of
the curl-tool specific variable). This solution needed to override the
standard `stderr` symbol via the preprocessor. This in turn didn't play
well with unity builds and caused curl tool to crash or stay silent due
to an uninitialized stderr. This was a hard to find issue, fixed by
manually breaking out one file from the unity sources.

To avoid two these two tricks, this patch implements a different
solution: Restore using our own local variable for our stderr output and
leave `stderr` as-is. To avoid using `stderr` by mistake, add a
`checksrc` rule (based on logic we already used in lib for `strerror`)
that detects any `stderr` use in `src` and points to using our own
variable instead: `tool_stderr`.

Follow-up to 06133d3e9b
Follow-up to 2f17a9b654

Closes #11958
This commit is contained in:
Viktor Szakats 2023-09-28 10:50:07 +00:00
parent b5bb84cbef
commit e5bb88b8f8
No known key found for this signature in database
GPG key ID: B5ABD165E2AEF201
19 changed files with 58 additions and 53 deletions

View file

@ -50,6 +50,7 @@ my @ignore_line;
my %warnings_extended = (
'COPYRIGHTYEAR' => 'copyright year incorrect',
'STRERROR', => 'strerror() detected',
'STDERR', => 'stderr detected',
);
my %warnings = (
@ -729,6 +730,18 @@ sub scanfile {
}
}
}
if($warnings{"STDERR"}) {
# scan for use of banned stderr. This is not a BANNEDFUNC to
# allow for individual enable/disable of this warning.
if($l =~ /^([^\"-]*\W)(stderr)[^\"_]/x) {
if($1 !~ /^ *\#/) {
# skip preprocessor lines
checkwarn("STDERR",
$line, length($1), $file, $ol,
"use of $2 is banned (use tool_stderr instead)");
}
}
}
# scan for use of snprintf for curl-internals reasons
if($l =~ /^(.*\W)(v?snprintf)\s*\(/x) {
checkwarn("SNPRINTF",