From: Markus Armbruster <armbru@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: qemu-devel@nongnu.org, kwolf@redhat.com, hreitz@redhat.com,
vsementsov@yandex-team.ru, jsnow@redhat.com,
idryomov@gmail.com, pl@kamp.de, sw@weilnetz.de,
sstabellini@kernel.org, anthony.perard@citrix.com,
paul@xen.org, pbonzini@redhat.com, marcandre.lureau@redhat.com,
berrange@redhat.com, thuth@redhat.com, philmd@linaro.org,
stefanha@redhat.com, fam@euphon.net, quintela@redhat.com,
peterx@redhat.com, leobras@redhat.com, kraxel@redhat.com,
qemu-block@nongnu.org, xen-devel@lists.xenproject.org,
alex.bennee@linaro.org, peter.maydell@linaro.org
Subject: Re: [PATCH v2 7/7] qobject atomics osdep: Make a few macros more hygienic
Date: Thu, 21 Sep 2023 07:14:48 +0200 [thread overview]
Message-ID: <87zg1g9kfr.fsf@pond.sub.org> (raw)
In-Reply-To: <3gjitlytxqobntg4fluip365s5ijwt3h2zvf3tjbmtiifikv53@xxrl7slw5tjt> (Eric Blake's message of "Wed, 20 Sep 2023 15:10:58 -0500")
Eric Blake <eblake@redhat.com> writes:
> On Wed, Sep 20, 2023 at 08:31:49PM +0200, Markus Armbruster wrote:
> ...
>> The only reliable way to prevent unintended variable name capture is
>> -Wshadow.
>>
>> One blocker for enabling it is shadowing hiding in function-like
>> macros like
>>
>> qdict_put(dict, "name", qobject_ref(...))
>>
>> qdict_put() wraps its last argument in QOBJECT(), and the last
>> argument here contains another QOBJECT().
>>
>> Use dark preprocessor sorcery to make the macros that give us this
>> problem use different variable names on every call.
>>
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>
>> Reviewed-by: Eric Blake <eblake@redhat.com>
>
> It's changed (for the better) since v1, so I'm re-reviewing.
>
>> ---
>> include/qapi/qmp/qobject.h | 11 +++++++++--
>> include/qemu/atomic.h | 17 ++++++++++++-----
>> include/qemu/compiler.h | 3 +++
>> include/qemu/osdep.h | 31 +++++++++++++++++++++++--------
>> 4 files changed, 47 insertions(+), 15 deletions(-)
>>
>> diff --git a/include/qapi/qmp/qobject.h b/include/qapi/qmp/qobject.h
>> index 9003b71fd3..d36cc97805 100644
>> --- a/include/qapi/qmp/qobject.h
>> +++ b/include/qapi/qmp/qobject.h
>> @@ -45,10 +45,17 @@ struct QObject {
>> struct QObjectBase_ base;
>> };
>>
>> -#define QOBJECT(obj) ({ \
>> +/*
>> + * Preprocessory sorcery ahead: use a different identifier for the
>
> s/Preprocessory/Preprocessor/ (multiple times in the patch)
Dang! Will fix.
>> + * local variable in each expansion, so we can nest macro calls
>> + * without shadowing variables.
>> + */
>> +#define QOBJECT_INTERNAL(obj, _obj) ({ \
>> typeof(obj) _obj = (obj); \
>> - _obj ? container_of(&(_obj)->base, QObject, base) : NULL; \
>> + _obj \
>> + ? container_of(&(_obj)->base, QObject, base) : NULL; \
>
> As pointed out before, you can write &_obj->base instead of
> &(_obj)->base, now that we know _obj is a single identifier rather
> than an arbitrary expression. Not strictly necessary since the extra
> () doesn't change semantics...
Makes sense, I just forgot here.
>> })
>> +#define QOBJECT(obj) QOBJECT_INTERNAL((obj), MAKE_IDENTFIER(_obj))
>>
>> /* Required for qobject_to() */
>> #define QTYPE_CAST_TO_QNull QTYPE_QNULL
>> diff --git a/include/qemu/atomic.h b/include/qemu/atomic.h
>> index d95612f7a0..d4cbd01909 100644
>> --- a/include/qemu/atomic.h
>> +++ b/include/qemu/atomic.h
>> @@ -157,13 +157,20 @@
>> smp_read_barrier_depends();
>> #endif
>>
>> -#define qatomic_rcu_read(ptr) \
>> - ({ \
>> +/*
>> + * Preprocessory sorcery ahead: use a different identifier for the
>> + * local variable in each expansion, so we can nest macro calls
>> + * without shadowing variables.
>> + */
>> +#define qatomic_rcu_read_internal(ptr, _val) \
>> + ({ \
>> qemu_build_assert(sizeof(*ptr) <= ATOMIC_REG_SIZE); \
>> - typeof_strip_qual(*ptr) _val; \
>> - qatomic_rcu_read__nocheck(ptr, &_val); \
>> - _val; \
>> + typeof_strip_qual(*ptr) _val; \
>> + qatomic_rcu_read__nocheck(ptr, &_val); \
>
> ...but it looks odd for the patch to not be consistent on that front.
>
>> + _val; \
>> })
>> +#define qatomic_rcu_read(ptr) \
>> + qatomic_rcu_read_internal((ptr), MAKE_IDENTFIER(_val))
>>
>> #define qatomic_rcu_set(ptr, i) do { \
>> qemu_build_assert(sizeof(*ptr) <= ATOMIC_REG_SIZE); \
>> diff --git a/include/qemu/compiler.h b/include/qemu/compiler.h
>> index a309f90c76..03236d830c 100644
>> --- a/include/qemu/compiler.h
>> +++ b/include/qemu/compiler.h
>> @@ -37,6 +37,9 @@
>> #define tostring(s) #s
>> #endif
>>
>> +/* Expands into an identifier stemN, where N is another number each time */
>> +#define MAKE_IDENTFIER(stem) glue(stem, __COUNTER__)
>
> I like how this turned out.
>
> With the spelling fix, and optionally with the redundant () dropped,
> you can keep my R-b.
Thanks!
next prev parent reply other threads:[~2023-09-21 5:15 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-20 18:31 [PATCH v2 0/7] Steps towards enabling -Wshadow=local Markus Armbruster
2023-09-20 18:31 ` [PATCH v2 1/7] migration/rdma: Fix save_page method to fail on polling error Markus Armbruster
2023-09-20 18:31 ` [PATCH v2 2/7] migration: Clean up local variable shadowing Markus Armbruster
2023-09-21 6:06 ` Zhijian Li (Fujitsu)
2023-09-20 18:31 ` [PATCH v2 3/7] ui: " Markus Armbruster
2023-09-20 18:31 ` [PATCH v2 4/7] block/dirty-bitmap: " Markus Armbruster
2023-09-21 8:37 ` Kevin Wolf
2023-09-20 18:31 ` [PATCH v2 5/7] block/vdi: " Markus Armbruster
2023-09-21 8:29 ` Kevin Wolf
2023-09-20 18:31 ` [PATCH v2 6/7] block: " Markus Armbruster
2023-09-21 8:33 ` Kevin Wolf
2023-09-20 18:31 ` [PATCH v2 7/7] qobject atomics osdep: Make a few macros more hygienic Markus Armbruster
2023-09-20 20:10 ` Eric Blake
2023-09-21 5:14 ` Markus Armbruster [this message]
2023-09-21 8:42 ` Kevin Wolf
2023-09-21 11:23 ` Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87zg1g9kfr.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=alex.bennee@linaro.org \
--cc=anthony.perard@citrix.com \
--cc=berrange@redhat.com \
--cc=eblake@redhat.com \
--cc=fam@euphon.net \
--cc=hreitz@redhat.com \
--cc=idryomov@gmail.com \
--cc=jsnow@redhat.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=leobras@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=paul@xen.org \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=peterx@redhat.com \
--cc=philmd@linaro.org \
--cc=pl@kamp.de \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=sstabellini@kernel.org \
--cc=stefanha@redhat.com \
--cc=sw@weilnetz.de \
--cc=thuth@redhat.com \
--cc=vsementsov@yandex-team.ru \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.