Hi. For a reason I cannot determine (nor, probably, deal with directly) gcc I have to use started to issue warnings (errors in fact due tu -Werror) about an argument for '%s'[1] being null.
--8<---------------cut here---------------start------------->8---
In file included from ../src/core/dbus-job.h:7,
from ../src/core/job.c:11:
../src/core/job.c: In function 'job_finish_and_invalidate':
../src/core/job.c:976:27: error: '%s' directive argument is null
[-Werror=format-overflow=]
976 | log_unit_debug(u, "Job %" PRIu32 " %s/%s finished, result=%s",
j->id, u->id, job_type_to_string(t), job_result_to_string(result));
| ^~~~~~~
../src/core/unit.h:878:190: note: in definition of macro 'log_unit_full'
878 | u->manager->unit_log_field, _u->id, _u->manager->invocation_log_field,
_u->invocation_id_string, ##__VA_ARGS__) : \
|
^~~~~~~~~~~
../src/core/job.c:976:9: note: in expansion of macro 'log_unit_debug'
976 | log_unit_debug(u, "Job %" PRIu32 " %s/%s finished, result=%s",
j->id, u->id, job_type_to_string(t), job_result_to_string(result));
| ^~~~~~~~~~~~~~
cc1: some warnings being treated as errors
--8<---------------cut here---------------end--------------->8---
I've fixed it by adding strna() around the two *_to_string() helpers.
Funnily enough this doesn't happen anywhere else in the code and is
associated with -O2 switch. Even more so, adding strna() only around
job_result_to_string() is enough to silence the warnings.
I grepped for other calls to *_to_string() helpers and unsurprisingly
there is a ton of them. I didn't mange to figure out if returning
something different than NULL would be safe in all possible contexts. I
assume it wouldn't. Thus the invocations need to be inspected one by one
and wrapped in str*() widgets.
Because I'd like to send you my fix to be kept upstream but I can't fix
all _to_strings() in every module. However, reviewing two dozen of them
in src/core/job.c and fixing those that are arguments to format strings
isn't a problem at all. The question is:
Which str*() in which context should I use?
There are only three different helpers used in job.c
- job_type_to_string() (18 occurences)
- job_result_to_string() (6)
- job_state_to_string() (2)
Most of them as an argument of a format string for
log_unit_{debug,warning}() and for four invocations of
log_unit_struct(). I guess, the latter with format strings like
"JOB_TYPE=%s"
should use something different than human readable messages in the
former. Any hints, suggestions?
[1]
https://github.com/systemd/systemd/blob/1c53c3bab168c03874f328d62719a2e1f3a703e8/src/core/job.c#L996
the line numbers are off because I build an older version, but as
far as I can tell nothing has changed in the *_to_string generator
macro.
Kind regards,
--
Ćukasz Stelmach
Samsung R&D Institute Poland
Samsung Electronics
signature.asc
Description: PGP signature
