2022-03-03 12:03:20

by Vincent MAILHOL

[permalink] [raw]
Subject: [PATCH] x86/bug: __WARN_FLAGS: prevent shadowing by renaming local variable f to __flags

The macro __WARN_FLAGS() uses a local variable named "f". This being a
common name, there is a risk of shadowing other variables.

For example:

| In file included from ./include/linux/bug.h:5,
| from ./include/linux/cpumask.h:14,
| from ./arch/x86/include/asm/cpumask.h:5,
| from ./arch/x86/include/asm/msr.h:11,
| from ./arch/x86/include/asm/processor.h:22,
| from ./arch/x86/include/asm/timex.h:5,
| from ./include/linux/timex.h:65,
| from ./include/linux/time32.h:13,
| from ./include/linux/time.h:60,
| from ./include/linux/stat.h:19,
| from ./include/linux/module.h:13,
| from virt/lib/irqbypass.mod.c:1:
| ./include/linux/rcupdate.h: In function 'rcu_head_after_call_rcu':
| ./arch/x86/include/asm/bug.h:80:21: warning: declaration of 'f' shadows a parameter [-Wshadow]
| 80 | __auto_type f = BUGFLAG_WARNING|(flags); \
| | ^
| ./include/asm-generic/bug.h:106:17: note: in expansion of macro '__WARN_FLAGS'
| 106 | __WARN_FLAGS(BUGFLAG_ONCE | \
| | ^~~~~~~~~~~~
| ./include/linux/rcupdate.h:1007:9: note: in expansion of macro 'WARN_ON_ONCE'
| 1007 | WARN_ON_ONCE(func != (rcu_callback_t)~0L);
| | ^~~~~~~~~~~~
| In file included from ./include/linux/rbtree.h:24,
| from ./include/linux/mm_types.h:11,
| from ./include/linux/buildid.h:5,
| from ./include/linux/module.h:14,
| from virt/lib/irqbypass.mod.c:1:
| ./include/linux/rcupdate.h:1001:62: note: shadowed declaration is here
| 1001 | rcu_head_after_call_rcu(struct rcu_head *rhp, rcu_callback_t f)
| | ~~~~~~~~~~~~~~~^

This patch renames the variable from f to __flags (with two underscore
prefixes as suggested in the Linux kernel coding style [1]) in order
to prevent collisions.

[1] Linux kernel coding style, section 12) Macros, Enums and RTL,
paragraph 5) namespace collisions when defining local variables in
macros resembling functions
https://www.kernel.org/doc/html/v4.10/process/coding-style.html#macros-enums-and-rtl

fixes: bfb1a7c91fb7 ("x86/bug: Merge annotate_reachable() into
_BUG_FLAGS() asm")
Signed-off-by: Vincent Mailhol <[email protected]>
---
arch/x86/include/asm/bug.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h
index bab883c0b6fe..66570e95af39 100644
--- a/arch/x86/include/asm/bug.h
+++ b/arch/x86/include/asm/bug.h
@@ -77,9 +77,9 @@ do { \
*/
#define __WARN_FLAGS(flags) \
do { \
- __auto_type f = BUGFLAG_WARNING|(flags); \
+ __auto_type __flags = BUGFLAG_WARNING|(flags); \
instrumentation_begin(); \
- _BUG_FLAGS(ASM_UD2, f, ASM_REACHABLE); \
+ _BUG_FLAGS(ASM_UD2, __flags, ASM_REACHABLE); \
instrumentation_end(); \
} while (0)

--
2.34.1


2022-03-04 20:11:44

by Nick Desaulniers

[permalink] [raw]
Subject: Re: [PATCH] x86/bug: __WARN_FLAGS: prevent shadowing by renaming local variable f to __flags

On Thu, Mar 3, 2022 at 3:08 AM Vincent Mailhol
<[email protected]> wrote:
>
> The macro __WARN_FLAGS() uses a local variable named "f". This being a
> common name, there is a risk of shadowing other variables.
>
> For example:
>
> | In file included from ./include/linux/bug.h:5,
> | from ./include/linux/cpumask.h:14,
> | from ./arch/x86/include/asm/cpumask.h:5,
> | from ./arch/x86/include/asm/msr.h:11,
> | from ./arch/x86/include/asm/processor.h:22,
> | from ./arch/x86/include/asm/timex.h:5,
> | from ./include/linux/timex.h:65,
> | from ./include/linux/time32.h:13,
> | from ./include/linux/time.h:60,
> | from ./include/linux/stat.h:19,
> | from ./include/linux/module.h:13,
> | from virt/lib/irqbypass.mod.c:1:
> | ./include/linux/rcupdate.h: In function 'rcu_head_after_call_rcu':
> | ./arch/x86/include/asm/bug.h:80:21: warning: declaration of 'f' shadows a parameter [-Wshadow]
> | 80 | __auto_type f = BUGFLAG_WARNING|(flags); \
> | | ^
> | ./include/asm-generic/bug.h:106:17: note: in expansion of macro '__WARN_FLAGS'
> | 106 | __WARN_FLAGS(BUGFLAG_ONCE | \
> | | ^~~~~~~~~~~~
> | ./include/linux/rcupdate.h:1007:9: note: in expansion of macro 'WARN_ON_ONCE'
> | 1007 | WARN_ON_ONCE(func != (rcu_callback_t)~0L);
> | | ^~~~~~~~~~~~
> | In file included from ./include/linux/rbtree.h:24,
> | from ./include/linux/mm_types.h:11,
> | from ./include/linux/buildid.h:5,
> | from ./include/linux/module.h:14,
> | from virt/lib/irqbypass.mod.c:1:
> | ./include/linux/rcupdate.h:1001:62: note: shadowed declaration is here
> | 1001 | rcu_head_after_call_rcu(struct rcu_head *rhp, rcu_callback_t f)
> | | ~~~~~~~~~~~~~~~^
>
> This patch renames the variable from f to __flags (with two underscore
> prefixes as suggested in the Linux kernel coding style [1]) in order
> to prevent collisions.
>
> [1] Linux kernel coding style, section 12) Macros, Enums and RTL,
> paragraph 5) namespace collisions when defining local variables in
> macros resembling functions
> https://www.kernel.org/doc/html/v4.10/process/coding-style.html#macros-enums-and-rtl

Ah, thanks for the patch. I missed that coding style recommendation.
Might want to link to a newer (or evergreen) version of the docs
though:
https://www.kernel.org/doc/html/latest/process/coding-style.html#macros-enums-and-rtl
Not sure what happens when we start shadowing variables named __flags,
but maybe we cross that bridge if/when we get there.

Thanks for the fix!
Reviewed-by: Nick Desaulniers <[email protected]>
--
Thanks,
~Nick Desaulniers

2022-03-04 20:48:41

by Josh Poimboeuf

[permalink] [raw]
Subject: Re: [PATCH] x86/bug: __WARN_FLAGS: prevent shadowing by renaming local variable f to __flags

On Thu, Mar 03, 2022 at 08:07:55PM +0900, Vincent Mailhol wrote:
> This patch renames the variable from f to __flags (with two underscore
> prefixes as suggested in the Linux kernel coding style [1]) in order
> to prevent collisions.
>
> [1] Linux kernel coding style, section 12) Macros, Enums and RTL,
> paragraph 5) namespace collisions when defining local variables in
> macros resembling functions
> https://www.kernel.org/doc/html/v4.10/process/coding-style.html#macros-enums-and-rtl

Looks good to me.

>
> fixes: bfb1a7c91fb7 ("x86/bug: Merge annotate_reachable() into
> _BUG_FLAGS() asm")
> Signed-off-by: Vincent Mailhol <[email protected]>

Fixes tag should be capitalized and in a single line, like:

Fixes: bfb1a7c91fb7 ("x86/bug: Merge annotate_reachable() into _BUG_FLAGS() asm")

Otherwise:

Acked-by: Josh Poimboeuf <[email protected]>

--
Josh

2022-03-05 05:25:14

by Vincent MAILHOL

[permalink] [raw]
Subject: Re: [PATCH] x86/bug: __WARN_FLAGS: prevent shadowing by renaming local variable f to __flags

On Tue. 5 Mar 2022 à 04:26, Nick Desaulniers <[email protected]> wrote:
> On Thu, Mar 3, 2022 at 3:08 AM Vincent Mailhol
> <[email protected]> wrote:
> > The macro __WARN_FLAGS() uses a local variable named "f". This being a
> > common name, there is a risk of shadowing other variables.
> >
> > For example:
> >
> > | In file included from ./include/linux/bug.h:5,
> > | from ./include/linux/cpumask.h:14,
> > | from ./arch/x86/include/asm/cpumask.h:5,
> > | from ./arch/x86/include/asm/msr.h:11,
> > | from ./arch/x86/include/asm/processor.h:22,
> > | from ./arch/x86/include/asm/timex.h:5,
> > | from ./include/linux/timex.h:65,
> > | from ./include/linux/time32.h:13,
> > | from ./include/linux/time.h:60,
> > | from ./include/linux/stat.h:19,
> > | from ./include/linux/module.h:13,
> > | from virt/lib/irqbypass.mod.c:1:
> > | ./include/linux/rcupdate.h: In function 'rcu_head_after_call_rcu':
> > | ./arch/x86/include/asm/bug.h:80:21: warning: declaration of 'f' shadows a parameter [-Wshadow]
> > | 80 | __auto_type f = BUGFLAG_WARNING|(flags); \
> > | | ^
> > | ./include/asm-generic/bug.h:106:17: note: in expansion of macro '__WARN_FLAGS'
> > | 106 | __WARN_FLAGS(BUGFLAG_ONCE | \
> > | | ^~~~~~~~~~~~
> > | ./include/linux/rcupdate.h:1007:9: note: in expansion of macro 'WARN_ON_ONCE'
> > | 1007 | WARN_ON_ONCE(func != (rcu_callback_t)~0L);
> > | | ^~~~~~~~~~~~
> > | In file included from ./include/linux/rbtree.h:24,
> > | from ./include/linux/mm_types.h:11,
> > | from ./include/linux/buildid.h:5,
> > | from ./include/linux/module.h:14,
> > | from virt/lib/irqbypass.mod.c:1:
> > | ./include/linux/rcupdate.h:1001:62: note: shadowed declaration is here
> > | 1001 | rcu_head_after_call_rcu(struct rcu_head *rhp, rcu_callback_t f)
> > | | ~~~~~~~~~~~~~~~^
> >
> > This patch renames the variable from f to __flags (with two underscore
> > prefixes as suggested in the Linux kernel coding style [1]) in order
> > to prevent collisions.
> >
> > [1] Linux kernel coding style, section 12) Macros, Enums and RTL,
> > paragraph 5) namespace collisions when defining local variables in
> > macros resembling functions
> > https://www.kernel.org/doc/html/v4.10/process/coding-style.html#macros-enums-and-rtl

Indeed! Will update this in v2 (and will also fix the Fixes: tag as
pointed by Josh).

> Ah, thanks for the patch. I missed that coding style recommendation.
> Might want to link to a newer (or evergreen) version of the docs
> though:
> https://www.kernel.org/doc/html/latest/process/coding-style.html#macros-enums-and-rtl
> Not sure what happens when we start shadowing variables named __flags,
> but maybe we cross that bridge if/when we get there.

Ack.

> Thanks for the fix!
> Reviewed-by: Nick Desaulniers <[email protected]>

2022-03-17 08:11:50

by Vincent MAILHOL

[permalink] [raw]
Subject: [RESEND PATCH v2] x86/bug: __WARN_FLAGS: prevent shadowing by renaming local variable f to __flags

The macro __WARN_FLAGS() uses a local variable named "f". This being a
common name, there is a risk of shadowing other variables.

For example:

| In file included from ./include/linux/bug.h:5,
| from ./include/linux/cpumask.h:14,
| from ./arch/x86/include/asm/cpumask.h:5,
| from ./arch/x86/include/asm/msr.h:11,
| from ./arch/x86/include/asm/processor.h:22,
| from ./arch/x86/include/asm/timex.h:5,
| from ./include/linux/timex.h:65,
| from ./include/linux/time32.h:13,
| from ./include/linux/time.h:60,
| from ./include/linux/stat.h:19,
| from ./include/linux/module.h:13,
| from virt/lib/irqbypass.mod.c:1:
| ./include/linux/rcupdate.h: In function 'rcu_head_after_call_rcu':
| ./arch/x86/include/asm/bug.h:80:21: warning: declaration of 'f' shadows a parameter [-Wshadow]
| 80 | __auto_type f = BUGFLAG_WARNING|(flags); \
| | ^
| ./include/asm-generic/bug.h:106:17: note: in expansion of macro '__WARN_FLAGS'
| 106 | __WARN_FLAGS(BUGFLAG_ONCE | \
| | ^~~~~~~~~~~~
| ./include/linux/rcupdate.h:1007:9: note: in expansion of macro 'WARN_ON_ONCE'
| 1007 | WARN_ON_ONCE(func != (rcu_callback_t)~0L);
| | ^~~~~~~~~~~~
| In file included from ./include/linux/rbtree.h:24,
| from ./include/linux/mm_types.h:11,
| from ./include/linux/buildid.h:5,
| from ./include/linux/module.h:14,
| from virt/lib/irqbypass.mod.c:1:
| ./include/linux/rcupdate.h:1001:62: note: shadowed declaration is here
| 1001 | rcu_head_after_call_rcu(struct rcu_head *rhp, rcu_callback_t f)
| | ~~~~~~~~~~~~~~~^

This patch renames the variable from f to __flags (with two underscore
prefixes as suggested in the Linux kernel coding style [1]) in order
to prevent collisions.

[1] Linux kernel coding style, section 12) Macros, Enums and RTL,
paragraph 5) namespace collisions when defining local variables in
macros resembling functions
https://www.kernel.org/doc/html/latest/process/coding-style.html#macros-enums-and-rtl

Fixes: bfb1a7c91fb7 ("x86/bug: Merge annotate_reachable() into_BUG_FLAGS() asm")
Acked-by: Josh Poimboeuf <[email protected]>
Reviewed-by: Nick Desaulniers <[email protected]>
Signed-off-by: Vincent Mailhol <[email protected]>
---
Changelog:

v1 -> v2:

* Update the reference link to the kernel documentation to latest version.
* Do not break the Fixes: tag to a new line.
* Added the Acked-by and Reviewed-by tags.
---
arch/x86/include/asm/bug.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h
index bab883c0b6fe..66570e95af39 100644
--- a/arch/x86/include/asm/bug.h
+++ b/arch/x86/include/asm/bug.h
@@ -77,9 +77,9 @@ do { \
*/
#define __WARN_FLAGS(flags) \
do { \
- __auto_type f = BUGFLAG_WARNING|(flags); \
+ __auto_type __flags = BUGFLAG_WARNING|(flags); \
instrumentation_begin(); \
- _BUG_FLAGS(ASM_UD2, f, ASM_REACHABLE); \
+ _BUG_FLAGS(ASM_UD2, __flags, ASM_REACHABLE); \
instrumentation_end(); \
} while (0)

--
2.34.1

2022-03-24 09:17:06

by Vincent MAILHOL

[permalink] [raw]
Subject: [PATCH v3] x86/bug: __WARN_FLAGS: prevent shadowing by renaming local variable f to __flags

The macro __WARN_FLAGS() uses a local variable named "f". This being a
common name, there is a risk of shadowing other variables.

For example, GCC would yield:

| In file included from ./include/linux/bug.h:5,
| from ./include/linux/cpumask.h:14,
| from ./arch/x86/include/asm/cpumask.h:5,
| from ./arch/x86/include/asm/msr.h:11,
| from ./arch/x86/include/asm/processor.h:22,
| from ./arch/x86/include/asm/timex.h:5,
| from ./include/linux/timex.h:65,
| from ./include/linux/time32.h:13,
| from ./include/linux/time.h:60,
| from ./include/linux/stat.h:19,
| from ./include/linux/module.h:13,
| from virt/lib/irqbypass.mod.c:1:
| ./include/linux/rcupdate.h: In function 'rcu_head_after_call_rcu':
| ./arch/x86/include/asm/bug.h:80:21: warning: declaration of 'f' shadows a parameter [-Wshadow]
| 80 | __auto_type f = BUGFLAG_WARNING|(flags); \
| | ^
| ./include/asm-generic/bug.h:106:17: note: in expansion of macro '__WARN_FLAGS'
| 106 | __WARN_FLAGS(BUGFLAG_ONCE | \
| | ^~~~~~~~~~~~
| ./include/linux/rcupdate.h:1007:9: note: in expansion of macro 'WARN_ON_ONCE'
| 1007 | WARN_ON_ONCE(func != (rcu_callback_t)~0L);
| | ^~~~~~~~~~~~
| In file included from ./include/linux/rbtree.h:24,
| from ./include/linux/mm_types.h:11,
| from ./include/linux/buildid.h:5,
| from ./include/linux/module.h:14,
| from virt/lib/irqbypass.mod.c:1:
| ./include/linux/rcupdate.h:1001:62: note: shadowed declaration is here
| 1001 | rcu_head_after_call_rcu(struct rcu_head *rhp, rcu_callback_t f)
| | ~~~~~~~~~~~~~~~^

For reference, sparse also warns about it, c.f. [1].

This patch renames the variable from f to __flags (with two underscore
prefixes as suggested in the Linux kernel coding style [2]) in order
to prevent collisions.

[1] https://lore.kernel.org/all/CAFGhKbyifH1a+nAMCvWM88TK6fpNPdzFtUXPmRGnnQeePV+1sw@mail.gmail.com/

[2] Linux kernel coding style, section 12) Macros, Enums and RTL,
paragraph 5) namespace collisions when defining local variables in
macros resembling functions
https://www.kernel.org/doc/html/latest/process/coding-style.html#macros-enums-and-rtl

CC: Charlemagne Lasse <[email protected]>
Fixes: bfb1a7c91fb7 ("x86/bug: Merge annotate_reachable() into_BUG_FLAGS() asm")
Acked-by: Josh Poimboeuf <[email protected]>
Reviewed-by: Nick Desaulniers <[email protected]>
Signed-off-by: Vincent Mailhol <[email protected]>
---
Changelog:

v2 -> v3:

* add a mention that sparse is warning about this too.
c.f. https://lore.kernel.org/all/CAKwvOdmSV3Nse+tGMBXvN=QvnOs6-ODZRJB0OF5Pd6BVb-scFw@mail.gmail.com/

v1 -> v2:

* Update the reference link to the kernel documentation to latest version.
* Do not break the Fixes: tag to a new line.
* Added the Acked-by and Reviewed-by tags.
---
arch/x86/include/asm/bug.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h
index bab883c0b6fe..66570e95af39 100644
--- a/arch/x86/include/asm/bug.h
+++ b/arch/x86/include/asm/bug.h
@@ -77,9 +77,9 @@ do { \
*/
#define __WARN_FLAGS(flags) \
do { \
- __auto_type f = BUGFLAG_WARNING|(flags); \
+ __auto_type __flags = BUGFLAG_WARNING|(flags); \
instrumentation_begin(); \
- _BUG_FLAGS(ASM_UD2, f, ASM_REACHABLE); \
+ _BUG_FLAGS(ASM_UD2, __flags, ASM_REACHABLE); \
instrumentation_end(); \
} while (0)

--
2.34.1

Subject: [tip: x86/urgent] x86/bug: Prevent shadowing in __WARN_FLAGS

The following commit has been merged into the x86/urgent branch of tip:

Commit-ID: 9ce02f0fc68326dd1f87a0a3a4c6ae7fdd39e6f6
Gitweb: https://git.kernel.org/tip/9ce02f0fc68326dd1f87a0a3a4c6ae7fdd39e6f6
Author: Vincent Mailhol <[email protected]>
AuthorDate: Thu, 24 Mar 2022 11:37:42 +09:00
Committer: Peter Zijlstra <[email protected]>
CommitterDate: Tue, 05 Apr 2022 10:24:40 +02:00

x86/bug: Prevent shadowing in __WARN_FLAGS

The macro __WARN_FLAGS() uses a local variable named "f". This being a
common name, there is a risk of shadowing other variables.

For example, GCC would yield:

| In file included from ./include/linux/bug.h:5,
| from ./include/linux/cpumask.h:14,
| from ./arch/x86/include/asm/cpumask.h:5,
| from ./arch/x86/include/asm/msr.h:11,
| from ./arch/x86/include/asm/processor.h:22,
| from ./arch/x86/include/asm/timex.h:5,
| from ./include/linux/timex.h:65,
| from ./include/linux/time32.h:13,
| from ./include/linux/time.h:60,
| from ./include/linux/stat.h:19,
| from ./include/linux/module.h:13,
| from virt/lib/irqbypass.mod.c:1:
| ./include/linux/rcupdate.h: In function 'rcu_head_after_call_rcu':
| ./arch/x86/include/asm/bug.h:80:21: warning: declaration of 'f' shadows a parameter [-Wshadow]
| 80 | __auto_type f = BUGFLAG_WARNING|(flags); \
| | ^
| ./include/asm-generic/bug.h:106:17: note: in expansion of macro '__WARN_FLAGS'
| 106 | __WARN_FLAGS(BUGFLAG_ONCE | \
| | ^~~~~~~~~~~~
| ./include/linux/rcupdate.h:1007:9: note: in expansion of macro 'WARN_ON_ONCE'
| 1007 | WARN_ON_ONCE(func != (rcu_callback_t)~0L);
| | ^~~~~~~~~~~~
| In file included from ./include/linux/rbtree.h:24,
| from ./include/linux/mm_types.h:11,
| from ./include/linux/buildid.h:5,
| from ./include/linux/module.h:14,
| from virt/lib/irqbypass.mod.c:1:
| ./include/linux/rcupdate.h:1001:62: note: shadowed declaration is here
| 1001 | rcu_head_after_call_rcu(struct rcu_head *rhp, rcu_callback_t f)
| | ~~~~~~~~~~~~~~~^

For reference, sparse also warns about it, c.f. [1].

This patch renames the variable from f to __flags (with two underscore
prefixes as suggested in the Linux kernel coding style [2]) in order
to prevent collisions.

[1] https://lore.kernel.org/all/CAFGhKbyifH1a+nAMCvWM88TK6fpNPdzFtUXPmRGnnQeePV+1sw@mail.gmail.com/

[2] Linux kernel coding style, section 12) Macros, Enums and RTL,
paragraph 5) namespace collisions when defining local variables in
macros resembling functions
https://www.kernel.org/doc/html/latest/process/coding-style.html#macros-enums-and-rtl

Fixes: bfb1a7c91fb7 ("x86/bug: Merge annotate_reachable() into_BUG_FLAGS() asm")
Signed-off-by: Vincent Mailhol <[email protected]>
Signed-off-by: Peter Zijlstra (Intel) <[email protected]>
Reviewed-by: Nick Desaulniers <[email protected]>
Acked-by: Josh Poimboeuf <[email protected]>
Link: https://lkml.kernel.org/r/[email protected]
---
arch/x86/include/asm/bug.h | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/bug.h b/arch/x86/include/asm/bug.h
index 4d20a29..aaf0cb0 100644
--- a/arch/x86/include/asm/bug.h
+++ b/arch/x86/include/asm/bug.h
@@ -78,9 +78,9 @@ do { \
*/
#define __WARN_FLAGS(flags) \
do { \
- __auto_type f = BUGFLAG_WARNING|(flags); \
+ __auto_type __flags = BUGFLAG_WARNING|(flags); \
instrumentation_begin(); \
- _BUG_FLAGS(ASM_UD2, f, ASM_REACHABLE); \
+ _BUG_FLAGS(ASM_UD2, __flags, ASM_REACHABLE); \
instrumentation_end(); \
} while (0)