aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/compiler.h
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2018-08-25 14:16:29 -0400
committerKees Cook <keescook@chromium.org>2018-10-11 11:17:50 -0400
commit81b45683487a51b0f4d3b29d37f20d6d078544e4 (patch)
tree96bb8fc0be10e5436b7c16a518a70dcfcf6a82ce /include/linux/compiler.h
parent57361846b52bc686112da6ca5368d11210796804 (diff)
compiler.h: give up __compiletime_assert_fallback()
__compiletime_assert_fallback() is supposed to stop building earlier by using the negative-array-size method in case the compiler does not support "error" attribute, but has never worked like that. You can simply try: BUILD_BUG_ON(1); GCC immediately terminates the build, but Clang does not report anything because Clang does not support the "error" attribute now. It will later fail at link time, but __compiletime_assert_fallback() is not working at least. The root cause is commit 1d6a0d19c855 ("bug.h: prevent double evaluation of `condition' in BUILD_BUG_ON"). Prior to that commit, BUILD_BUG_ON() was checked by the negative-array-size method *and* the link-time trick. Since that commit, the negative-array-size is not effective because '__cond' is no longer constant. As the comment in <linux/build_bug.h> says, GCC (and Clang as well) only emits the error for obvious cases. When '__cond' is a variable, ((void)sizeof(char[1 - 2 * __cond])) ... is not obvious for the compiler to know the array size is negative. Reverting that commit would break BUILD_BUG() because negative-size-array is evaluated before the code is optimized out. Let's give up __compiletime_assert_fallback(). This commit does not change the current behavior since it just rips off the useless code. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Kees Cook <keescook@chromium.org> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Kees Cook <keescook@chromium.org>
Diffstat (limited to 'include/linux/compiler.h')
-rw-r--r--include/linux/compiler.h17
1 files changed, 1 insertions, 16 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h
index 681d866efb1e..87c776c3ce73 100644
--- a/include/linux/compiler.h
+++ b/include/linux/compiler.h
@@ -314,29 +314,14 @@ static inline void *offset_to_ptr(const int *off)
314#endif 314#endif
315#ifndef __compiletime_error 315#ifndef __compiletime_error
316# define __compiletime_error(message) 316# define __compiletime_error(message)
317/*
318 * Sparse complains of variable sized arrays due to the temporary variable in
319 * __compiletime_assert. Unfortunately we can't just expand it out to make
320 * sparse see a constant array size without breaking compiletime_assert on old
321 * versions of GCC (e.g. 4.2.4), so hide the array from sparse altogether.
322 */
323# ifndef __CHECKER__
324# define __compiletime_error_fallback(condition) \
325 do { ((void)sizeof(char[1 - 2 * condition])); } while (0)
326# endif
327#endif
328#ifndef __compiletime_error_fallback
329# define __compiletime_error_fallback(condition) do { } while (0)
330#endif 317#endif
331 318
332#ifdef __OPTIMIZE__ 319#ifdef __OPTIMIZE__
333# define __compiletime_assert(condition, msg, prefix, suffix) \ 320# define __compiletime_assert(condition, msg, prefix, suffix) \
334 do { \ 321 do { \
335 int __cond = !(condition); \
336 extern void prefix ## suffix(void) __compiletime_error(msg); \ 322 extern void prefix ## suffix(void) __compiletime_error(msg); \
337 if (__cond) \ 323 if (!(condition)) \
338 prefix ## suffix(); \ 324 prefix ## suffix(); \
339 __compiletime_error_fallback(__cond); \
340 } while (0) 325 } while (0)
341#else 326#else
342# define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0) 327# define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0)