linux
An uninitialized string may be displayed if !CONFIG_RCU_FAST_NO_HZ.
Bug fixed by commit 1c17e4d4437
| Type | UninitializedVariable |
| Config | "TREE_RCU && RCU_CPU_STALL_INFO && !RCU_FAST_NO_HZ" (3rd degree) |
| Fix-in | code |
| Location | kernel/ |
extern int printf (const char *__restrict __format, ...);
extern int sprintf (char *__restrict __s,
const char *__restrict __format, ...) __attribute__ ((__nothrow__));
#ifdef CONFIG_RCU_CPU_STALL_INFO
#ifdef CONFIG_RCU_FAST_NO_HZ
void print_cpu_stall_fast_no_hz(char *cp, int cpu)
{
sprintf(cp, "foobar");
}
#else /* #ifdef CONFIG_RCU_FAST_NO_HZ */
void print_cpu_stall_fast_no_hz(char *cp, int cpu)
{ // (3)
}
#endif /* #else #ifdef CONFIG_RCU_FAST_NO_HZ */
void print_cpu_stall_info(int cpu)
{
char fast_no_hz[72];
print_cpu_stall_fast_no_hz(fast_no_hz, cpu); // (2)
printf("\t%d: %s\n", cpu, fast_no_hz); // ERROR (4)
}
#else /* #ifdef CONFIG_RCU_CPU_STALL_INFO */
void print_cpu_stall_info(int cpu)
{
printf(" %d", cpu);
}
#endif /* #else #ifdef CONFIG_RCU_CPU_STALL_INFO */
int main(void)
{
#ifdef CONFIG_RCU_CPU_STALL_INFO
print_cpu_stall_info(0); // (1)
#endif
return 0;
}
diff --git a/simple/1c17e4d.c b/simple/1c17e4d.c
--- a/simple/1c17e4d.c
+++ b/simple/1c17e4d.c
@@ -14,6 +14,7 @@
#else /* #ifdef CONFIG_RCU_FAST_NO_HZ */
void print_cpu_stall_fast_no_hz(char *cp, int cpu)
{ // (3)
+ *cp = '\0';
}
#endif /* #else #ifdef CONFIG_RCU_FAST_NO_HZ */
#include <stdio.h>
int main(int argc, char** argv) {
#ifdef CONFIG_RCU_CPU_STALL_INFO
// print_cpu_stall_info(0);
char fast_no_hz[72];
int cpu = 0;
#ifdef CONFIG_RCU_FAST_NO_HZ
sprintf(fast_no_hz, "foobar");
#else
#endif
printf("\t%d: %s\n", cpu, fast_no_hz); // ERROR
#else
printf(" %d", cpu);
#endif
return 0;
}
. call kernel/rcutree_plugin.h:2249: print_cpu_stall_info() . 2264: print_cpu_stall_fast_no_hz(fast_no_hz, cpu); .. call kernel/rcutree_plugin.h:2225:print_cpu_stall_fast_no_hz() .. 2227: } // fast_no_hz is left uninitialized . ERROR 2265: printk(KERN_ERR "\t%d: (%lu %s) idle=%03x/%llx/%d %s\n",