The trace_printk() macro uses a local variable _______STR to detect
whether variadic arguments are present. This name can shadow outer
variables.

Replace the local variable with sizeof applied directly to the
stringified arguments:

  if (sizeof __stringify((__VA_ARGS__)) > 3)

This eliminates the shadowing risk entirely without introducing
any additional includes or local variables.

Verified with objdump on samples/trace_printk that all four cases
branch correctly: __trace_bputs, __trace_puts, __trace_bprintk,
and __trace_printk.

Suggested-by: David Laight <[email protected]>
Signed-off-by: Qian-Yu Lin <[email protected]>
---
 include/linux/trace_printk.h | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/include/linux/trace_printk.h b/include/linux/trace_printk.h
index 2670ec7f4262..3d54f440dccf 100644
--- a/include/linux/trace_printk.h
+++ b/include/linux/trace_printk.h
@@ -86,8 +86,7 @@ do {                                                          
        \
 
 #define trace_printk(fmt, ...)                         \
 do {                                                   \
-       char _______STR[] = __stringify((__VA_ARGS__)); \
-       if (sizeof(_______STR) > 3)                     \
+       if (sizeof __stringify((__VA_ARGS__)) > 3)              \
                do_trace_printk(fmt, ##__VA_ARGS__);    \
        else                                            \
                trace_puts(fmt);                        \
-- 
2.43.0


Reply via email to