Skip to content

Commit

Permalink
compiler: Remove uninitialized_var() macro
Browse files Browse the repository at this point in the history
Using uninitialized_var() is dangerous as it papers over real bugs[1]
(or can in the future), and suppresses unrelated compiler warnings
(e.g. "unused variable"). If the compiler thinks it is uninitialized,
either simply initialize the variable or make compiler changes.

As recommended[2] by[3] Linus[4], remove the macro. With the recent
change to disable -Wmaybe-uninitialized in v5.7 in commit 78a5255
("Stop the ad-hoc games with -Wno-maybe-initialized"), this is likely
the best time to make this treewide change.

[1] https://lore.kernel.org/lkml/[email protected]/
[2] https://lore.kernel.org/lkml/CA+55aFw+Vbj0i=1TGqCR5vQkCzWJ0QxK6CernOU6eedsudAixw@mail.gmail.com/
[3] https://lore.kernel.org/lkml/CA+55aFwgbgqhbp1fkxvRKEpzyR5J8n1vKT1VZdz9knmPuXhOeg@mail.gmail.com/
[4] https://lore.kernel.org/lkml/CA+55aFz2500WfbKXAx8s67wrm9=yVJu65TpLgN_ybYNv0VEOKA@mail.gmail.com/

Suggested-by: Linus Torvalds <[email protected]>
Reviewed-by: Bart van Assche <[email protected]>
Reviewed-by: Miguel Ojeda <[email protected]>
Tested-by: Nathan Chancellor <[email protected]>
Tested-by: Sedat Dilek <[email protected]>
Signed-off-by: Kees Cook <[email protected]>
  • Loading branch information
kees committed Jul 16, 2020
1 parent 3f649ab commit 63a0895
Show file tree
Hide file tree
Showing 4 changed files with 0 additions and 12 deletions.
2 changes: 0 additions & 2 deletions include/linux/compiler-clang.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@

/* Compiler specific definitions for Clang compiler */

#define uninitialized_var(x) x = *(&(x))

/* same as gcc, this was present in clang-2.6 so we can assume it works
* with any version that can compile the kernel
*/
Expand Down
6 changes: 0 additions & 6 deletions include/linux/compiler-gcc.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,6 @@
(typeof(ptr)) (__ptr + (off)); \
})

/*
* A trick to suppress uninitialized variable warning without generating any
* code
*/
#define uninitialized_var(x) x = x

#ifdef CONFIG_RETPOLINE
#define __noretpoline __attribute__((__indirect_branch__("keep")))
#endif
Expand Down
2 changes: 0 additions & 2 deletions tools/include/linux/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,6 @@
# define noinline
#endif

#define uninitialized_var(x) x = *(&(x))

#include <linux/types.h>

/*
Expand Down
2 changes: 0 additions & 2 deletions tools/virtio/linux/kernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,6 @@ static inline void free_page(unsigned long addr)
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})

#define uninitialized_var(x) x = x

# ifndef likely
# define likely(x) (__builtin_expect(!!(x), 1))
# endif
Expand Down

0 comments on commit 63a0895

Please sign in to comment.