From: Willy Tarreau Date: Fri, 5 Sep 2025 07:15:05 +0000 (+0200) Subject: BUILD: trace: silence a bogus build warning at -Og X-Git-Tag: v3.0.12~28 X-Git-Url: http://git.haproxy.org/?a=commitdiff_plain;h=251cf06748fb0d8366ac6bba8125e633dac96678;p=haproxy-3.0.git BUILD: trace: silence a bogus build warning at -Og gcc-13.3 at -Og emits an incorrect build warning in trace.c about a possibly initialized variable: In file included from include/haproxy/api.h:35, from src/trace.c:22: src/trace.c: In function 'trace_parse_cmd': include/haproxy/bug.h:431:17: warning: 'arg' may be used uninitialized [-Wmaybe-uninitialized] 431 | free(*__x); \ | ^~~~~~~~~~ src/trace.c:1136:9: note: in expansion of macro 'ha_free' 1136 | ha_free(&oarg); | ^~~~~~~ src/trace.c:1008:15: note: 'arg' was declared here 1008 | char *arg, *oarg; | ^~~ The warning is obviously wrong since the field is initialized in one of the two branches of an "if" whose complementary one returns. But the compiler doesn't seem to see this because the if is in fact two ifs each with an opposite condition: "if (arg_src)" then "if (!arg_src)". Let's just move upwards the default one that returns and eliminate the other one. Reading the diff with "git diff -b" better shows the tiny change. It could be backported to 3.0. (cherry picked from commit abfd6f3b93db72f65015cb3278fe5182bf174493) Signed-off-by: Christopher Faulet (cherry picked from commit 77fda88fd1147d1a7d7daa6618809cb0df454791) [cf: Remove help message] Signed-off-by: Christopher Faulet (cherry picked from commit 95fbc12290969eee8b65a29aa4bb070de4039c7c) Signed-off-by: Christopher Faulet --- diff --git a/src/trace.c b/src/trace.c index 8f8d072..3d5516e 100644 --- a/src/trace.c +++ b/src/trace.c @@ -819,15 +819,6 @@ int trace_parse_cmd(const char *arg_src, char **errmsg) char *arg, *oarg; char *saveptr; - if (arg_src) { - /* keep a copy of the ptr for strtok */ - oarg = arg = strdup(arg_src); - if (!arg) { - memprintf(errmsg, "Can't allocate !"); - return 1; - } - } - if (!arg_src) { /* No trace specification, activate all sources on error level. */ struct trace_source *src = NULL; @@ -837,6 +828,13 @@ int trace_parse_cmd(const char *arg_src, char **errmsg) return 0; } + /* keep a copy of the ptr for strtok */ + oarg = arg = strdup(arg_src); + if (!arg) { + memprintf(errmsg, "Can't allocate trace source!"); + return -2; + } + while ((str = strtok_r(arg, ",", &saveptr))) { struct trace_source *src = NULL; char *field, *name;