From: Daniel Santos <danielfsantos@att.net>
To: LKML <linux-kernel@vger.kernel.org>, Borislav Petkov <bp@alien8.de>
Subject: Re: [PATCH v5 7/9] bug.h: Make BUILD_BUG_ON generate compile-time error
Date: Tue, 13 Nov 2012 16:24:15 -0600 [thread overview]
Message-ID: <50A2C88F.5010902@att.net> (raw)
In-Reply-To: <1352844821-18952-7-git-send-email-daniel.santos@pobox.com>
Borislav,
Please note that this patch has changed slightly since you Acked it. I
have moved the location of the negative-size array code to the end of
the macro. I don't think this really matters honestly, but I figured
this was the best place to put that change.
Daniel
On 11/13/2012 04:13 PM, danielfsantos@att.net wrote:
> Negative sized arrays wont create a compile-time error in some cases
> starting with gcc 4.4 (e.g., inlined functions), but gcc 4.3 introduced
> the error function attribute that will. This patch modifies
> BUILD_BUG_ON to behave like BUILD_BUG already does, using the error
> function attribute so that you don't have to build the entire kernel to
> discover that you have a problem, and then enjoy trying to track it down
> from a link-time error.
>
> Also, we are only including asm/bug.h and then expecting that
> linux/compiler.h will eventually be included to define __linktime_error
> (used in BUILD_BUG_ON). This patch includes it directly for clarity and
> to avoid the possibility of changes in <arch>/*/include/asm/bug.h being
> changed or not including linux/compiler.h for some reason.
>
> Signed-off-by: Daniel Santos <daniel.santos@pobox.com>
> Acked-by: Borislav Petkov <bp@alien8.de>
> ---
> include/linux/bug.h | 32 +++++++++++++++++++-------------
> 1 files changed, 19 insertions(+), 13 deletions(-)
>
> diff --git a/include/linux/bug.h b/include/linux/bug.h
> index ccd44ce..dd4f506 100644
> --- a/include/linux/bug.h
> +++ b/include/linux/bug.h
> @@ -2,6 +2,7 @@
> #define _LINUX_BUG_H
>
> #include <asm/bug.h>
> +#include <linux/compiler.h>
>
> enum bug_trap_type {
> BUG_TRAP_TYPE_NONE = 0,
> @@ -42,25 +43,30 @@ struct pt_regs;
> * @condition: the condition which the compiler should know is false.
> *
> * If you have some code which relies on certain constants being equal, or
> - * other compile-time-evaluated condition, you should use BUILD_BUG_ON to
> + * some other compile-time-evaluated condition, you should use BUILD_BUG_ON to
> * detect if someone changes it.
> *
> - * The implementation uses gcc's reluctance to create a negative array, but
> - * gcc (as of 4.4) only emits that error for obvious cases (eg. not arguments
> - * to inline functions). So as a fallback we use the optimizer; if it can't
> - * prove the condition is false, it will cause a link error on the undefined
> - * "__build_bug_on_failed". This error message can be harder to track down
> - * though, hence the two different methods.
> + * The implementation uses gcc's reluctance to create a negative array, but gcc
> + * (as of 4.4) only emits that error for obvious cases (e.g. not arguments to
> + * inline functions). Luckily, in 4.3 they added the "error" function
> + * attribute just for this type of case. Thus, we use a negative sized array
> + * (should always create an error on gcc versions older than 4.4) and then call
> + * an undefined function with the error attribute (should always create an
> + * error on gcc 4.3 and later). If for some reason, neither creates a
> + * compile-time error, we'll still have a link-time error, which is harder to
> + * track down.
> */
> #ifndef __OPTIMIZE__
> #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
> #else
> -extern int __build_bug_on_failed;
> -#define BUILD_BUG_ON(condition) \
> - do { \
> - bool __cond = !!(condition); \
> - ((void)sizeof(char[1 - 2*!!(__cond)])); \
> - if (__cond) __build_bug_on_failed = 1; \
> +#define BUILD_BUG_ON(condition) \
> + do { \
> + bool __cond = !!(condition); \
> + extern void __build_bug_on_failed(void) \
> + __compiletime_error("BUILD_BUG_ON failed"); \
> + if (__cond) \
> + __build_bug_on_failed(); \
> + ((void)sizeof(char[1 - 2*!!(__cond)])); \
> } while(0)
> #endif
>
next prev parent reply other threads:[~2012-11-13 22:24 UTC|newest]
Thread overview: 215+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-28 23:20 [PATCH 0/10] Cleanup & new features for compiler*.h and bug.h Daniel Santos
2012-09-28 23:20 ` [PATCH 1/10] compiler-gcc4.h: correct verion check for __compiletime_error Daniel Santos
2012-10-03 6:25 ` David Rientjes
2012-10-11 20:54 ` Michal Marek
2012-09-28 23:20 ` [PATCH 2/10] compiler-gcc4.h: Reorder macros based upon gcc ver Daniel Santos
2012-10-03 6:28 ` David Rientjes
2012-09-28 23:20 ` [PATCH 3/10] compiler-gcc.h: Add gcc-recommended GCC_VERSION macro Daniel Santos
2012-09-30 13:20 ` Borislav Petkov
2012-09-30 23:11 ` Daniel Santos
2012-10-01 0:22 ` Josh Triplett
2012-10-03 6:32 ` David Rientjes
2012-09-28 23:20 ` [PATCH 4/10] compiler-gcc{3,4}.h: Use " Daniel Santos
2012-09-29 0:20 ` Josh Triplett
2012-09-29 0:31 ` [Bulk] " Daniel Santos
2012-09-29 0:42 ` Josh Triplett
2012-10-03 6:40 ` David Rientjes
2012-09-28 23:20 ` [PATCH 5/10] compiler{,-gcc4}.h: Remove duplicate macros Daniel Santos
2012-09-28 23:20 ` Daniel Santos
2012-09-29 0:23 ` Josh Triplett
2012-09-29 0:34 ` [Bulk] " Daniel Santos
2012-09-29 0:48 ` Josh Triplett
2012-09-28 23:20 ` [PATCH 6/10] bug.h: Replace __linktime_error with __compiletime_error Daniel Santos
2012-09-29 0:23 ` Josh Triplett
2012-09-29 1:04 ` Steven Rostedt
2012-09-30 13:22 ` Borislav Petkov
2012-09-30 21:13 ` Daniel Santos
2012-10-03 6:44 ` David Rientjes
2012-10-03 11:49 ` Daniel Santos
2012-10-03 15:35 ` Josh Triplett
2012-10-03 18:26 ` David Rientjes
2012-10-04 0:26 ` Daniel Santos
2012-10-04 21:51 ` David Rientjes
2012-09-28 23:20 ` [PATCH 7/10] compiler{,-gcc4}.h: Introduce __flatten function attribute Daniel Santos
2012-09-29 0:26 ` Josh Triplett
2012-09-29 0:38 ` Daniel Santos
2012-09-29 0:50 ` Josh Triplett
2012-10-03 6:49 ` David Rientjes
2012-10-03 6:59 ` Josh Triplett
2012-10-03 7:53 ` David Rientjes
2012-10-03 11:20 ` Daniel Santos
2012-10-03 14:01 ` Steven Rostedt
2012-10-03 14:46 ` Daniel Santos
2012-10-03 15:14 ` Steven Rostedt
2012-10-03 15:23 ` Peter Zijlstra
2012-10-03 15:38 ` Joe Perches
2012-10-04 0:32 ` Steven Rostedt
2012-10-04 0:54 ` Daniel Santos
2012-10-04 2:33 ` Joe Perches
2012-10-04 0:55 ` Michel Lespinasse
2012-09-28 23:20 ` [PATCH 8/10] bug.h: Make BUILD_BUG_ON generate compile-time error Daniel Santos
2012-09-29 0:32 ` Josh Triplett
2012-09-29 0:51 ` Daniel Santos
2012-09-29 1:26 ` Daniel Santos
2012-09-29 2:55 ` Josh Triplett
2012-09-29 2:55 ` Josh Triplett
2012-09-30 23:29 ` Daniel Santos
2012-09-30 23:29 ` Daniel Santos
2012-10-01 0:26 ` Josh Triplett
2012-10-01 0:26 ` Josh Triplett
2012-10-02 0:48 ` Michel Lespinasse
2012-10-02 14:57 ` Daniel Santos
2012-09-28 23:20 ` [PATCH 9/10] bug.h: Add BUILD_BUG_ON_NON_CONST macro Daniel Santos
2012-09-28 23:20 ` [PATCH 10/10] bug.h: Add gcc 4.2+ versions of BUILD_BUG_ON_* macros Daniel Santos
2012-10-02 0:55 ` Michel Lespinasse
2012-10-02 16:04 ` Daniel Santos
2012-10-05 19:35 ` [PATCH v2 0/10] Cleanup & new features for compiler*.h and bug.h danielfsantos
2012-10-05 19:42 ` [PATCH v2 01/10] compiler-gcc4.h: Reorder macros based upon gcc ver danielfsantos
2012-10-06 17:42 ` Borislav Petkov
2012-10-06 17:54 ` Daniel Santos
2012-10-18 2:26 ` David Rientjes
2012-10-05 19:42 ` [PATCH v2 02/10] compiler-gcc.h: Add gcc-recommended GCC_VERSION macro danielfsantos
2012-10-05 19:42 ` [PATCH v2 03/10] compiler-gcc{3,4}.h: Use " danielfsantos
2012-10-06 23:05 ` Borislav Petkov
2012-10-06 23:10 ` Borislav Petkov
2012-10-06 23:10 ` Borislav Petkov
2012-10-07 18:27 ` Daniel Santos
2012-10-07 19:42 ` Borislav Petkov
2012-10-07 20:21 ` Daniel Santos
2012-10-09 18:41 ` Andrew Morton
2012-10-09 19:45 ` Josh Triplett
2012-10-05 19:42 ` [PATCH v2 04/10] bug.h: directly include linux/compiler.h danielfsantos
2012-10-05 19:42 ` [PATCH v2 05/10] compiler{,-gcc4}.h, bug.h: Remove duplicate macros danielfsantos
2012-10-05 19:42 ` danielfsantos
2012-10-05 19:42 ` [PATCH v2 06/10] bug.h: Make BUILD_BUG_ON generate compile-time error danielfsantos
2012-10-05 19:42 ` [PATCH v2 07/10] compiler.h, bug.h: Prevent double error messages with BUILD_BUG{,_ON} danielfsantos
2012-10-05 20:59 ` Josh Triplett
2012-10-06 4:28 ` Daniel Santos
2012-10-05 19:42 ` [PATCH v2 08/10] bug.h: Fix BUILD_BUG_ON macro in __CHECKER__ danielfsantos
2012-10-05 19:42 ` [PATCH v2 09/10] bug.h: Add BUILD_BUG_ON_MSG & BUILD_BUG_INTERNAL{,2} danielfsantos
2012-10-05 20:58 ` Borislav Petkov
2012-10-05 20:58 ` Borislav Petkov
2012-10-05 21:02 ` Josh Triplett
2012-10-05 21:02 ` Josh Triplett
2012-10-06 4:41 ` Daniel Santos
2012-10-06 4:41 ` Daniel Santos
2012-10-05 21:04 ` Steven Rostedt
2012-10-05 21:04 ` Steven Rostedt
2012-10-05 19:42 ` [PATCH v2 10/10] bug.h: Convert BUILD_BUG{,_ON} to use BUILD_BUG_ON_MSG danielfsantos
2012-10-05 20:27 ` [PATCH v2 0/10] Cleanup & new features for compiler*.h and bug.h Steven Rostedt
2012-10-07 18:36 ` Daniel Santos
2012-10-24 16:28 ` [PATCH v3 " danielfsantos
2012-10-24 16:33 ` [PATCH v3 01/10] compiler-gcc4.h: Reorder macros based upon gcc ver danielfsantos
2012-10-24 16:33 ` [PATCH v3 02/10] compiler-gcc.h: Add gcc-recommended GCC_VERSION macro danielfsantos
2012-10-24 16:33 ` [PATCH v3 03/10] compiler-gcc{3,4}.h: Use " danielfsantos
2012-10-24 19:05 ` Borislav Petkov
2012-10-24 21:49 ` Josh Triplett
2012-10-24 22:34 ` Borislav Petkov
2012-10-24 16:33 ` [PATCH v3 04/10] bug.h: directly include linux/compiler.h danielfsantos
2012-10-24 19:55 ` Borislav Petkov
2012-10-28 19:23 ` Daniel Santos
2012-10-24 16:33 ` [PATCH v3 05/10] compiler{,-gcc4}.h, bug.h: Remove duplicate macros danielfsantos
2012-10-25 9:26 ` Borislav Petkov
2012-10-24 16:33 ` [PATCH v3 06/10] bug.h: Make BUILD_BUG_ON generate compile-time error danielfsantos
2012-10-25 9:33 ` Borislav Petkov
2012-10-24 16:33 ` [PATCH v3 07/10] compiler.h, bug.h: Prevent double error messages with BUILD_BUG{,_ON} danielfsantos
2012-10-24 16:33 ` [PATCH v3 08/10] bug.h: Fix BUILD_BUG_ON macro in __CHECKER__ danielfsantos
2012-10-24 16:34 ` [PATCH v3 09/10] bug.h: Add BUILD_BUG_ON_MSG & _BUILD_BUG_INTERNAL danielfsantos
2012-10-24 16:34 ` [PATCH v3 10/10] bug.h: Convert BUILD_BUG{,_ON} to use BUILD_BUG_ON_MSG danielfsantos
2012-10-28 20:53 ` [PATCH v4 0/10] Cleanup & new features for compiler*.h and bug.h danielfsantos
2012-10-28 20:57 ` [PATCH v4 1/9] compiler-gcc4.h: Reorder macros based upon gcc ver danielfsantos
2012-10-30 12:02 ` Borislav Petkov
2012-10-30 12:02 ` Borislav Petkov
2012-10-28 20:57 ` [PATCH v4 2/9] compiler-gcc.h: Add gcc-recommended GCC_VERSION macro danielfsantos
2012-10-28 20:57 ` [PATCH v4 3/9] compiler-gcc{3,4}.h: Use " danielfsantos
2012-10-28 20:57 ` [PATCH v4 4/9] compiler{,-gcc4}.h, bug.h: Remove duplicate macros danielfsantos
2012-10-28 20:57 ` [PATCH v4 5/9] bug.h: Make BUILD_BUG_ON generate compile-time error danielfsantos
2012-10-28 20:57 ` [PATCH v4 6/9] compiler.h, bug.h: Prevent double error messages with BUILD_BUG{,_ON} danielfsantos
2012-10-30 16:19 ` Borislav Petkov
2012-10-30 16:19 ` Borislav Petkov
2012-10-31 5:34 ` Daniel Santos
2012-10-31 5:34 ` Daniel Santos
2012-10-31 11:06 ` Borislav Petkov
2012-10-31 11:06 ` Borislav Petkov
2012-10-31 16:38 ` Daniel Santos
2012-10-31 16:38 ` Daniel Santos
2012-11-03 18:10 ` Daniel Santos
2012-10-28 20:57 ` [PATCH v4 7/9] bug.h: Fix BUILD_BUG_ON macro in __CHECKER__ danielfsantos
2012-10-30 16:44 ` Borislav Petkov
2012-10-30 16:44 ` Borislav Petkov
2012-10-28 20:57 ` [PATCH v4 8/9] bug.h: Add BUILD_BUG_ON_MSG & _BUILD_BUG_INTERNAL danielfsantos
2012-10-30 17:17 ` Borislav Petkov
2012-10-30 17:17 ` Borislav Petkov
2012-10-30 21:57 ` Borislav Petkov
2012-10-28 20:57 ` [PATCH v4 9/9] bug.h: Convert BUILD_BUG{,_ON} to use BUILD_BUG_ON_MSG danielfsantos
2012-10-30 19:19 ` Borislav Petkov
2012-10-30 19:19 ` Borislav Petkov
2012-10-31 1:02 ` Josh Triplett
2012-10-31 5:48 ` Daniel Santos
2012-11-13 22:09 ` [PATCH v5 0/9] Cleanup & new features for compiler*.h and bug.h danielfsantos
2012-11-13 22:13 ` [PATCH v5 1/9] compiler-gcc4.h: Reorder macros based upon gcc ver danielfsantos
2012-11-13 22:13 ` [PATCH v5 2/9] compiler-gcc.h: Add gcc-recommended GCC_VERSION macro danielfsantos
2012-11-13 22:13 ` [PATCH v5 3/9] compiler-gcc{3,4}.h: Use " danielfsantos
2012-11-13 22:13 ` [PATCH v5 4/9] compiler{,-gcc4}.h, bug.h: Remove duplicate macros danielfsantos
2012-11-13 22:13 ` danielfsantos
2012-11-13 22:13 ` [PATCH v5 5/9] bug.h: Fix BUILD_BUG_ON macro in __CHECKER__ danielfsantos
2012-11-15 15:07 ` Borislav Petkov
2012-11-15 15:07 ` Borislav Petkov
2012-11-13 22:13 ` [PATCH v5 6/9] bug.h: Prevent double evaulation of in BUILD_BUG_ON danielfsantos
2012-11-15 15:07 ` Borislav Petkov
2012-11-15 19:11 ` Daniel Santos
2012-11-17 14:38 ` Borislav Petkov
2012-11-20 19:10 ` Daniel Santos
2012-11-13 22:13 ` [PATCH v5 7/9] bug.h: Make BUILD_BUG_ON generate compile-time error danielfsantos
2012-11-13 22:24 ` Daniel Santos [this message]
2012-11-15 15:07 ` Borislav Petkov
2012-11-13 22:13 ` [PATCH v5 8/9] compiler.h, bug.h: Prevent double error messages with BUILD_BUG{,_ON} danielfsantos
2012-11-15 15:08 ` Borislav Petkov
2012-11-15 15:08 ` Borislav Petkov
2012-11-15 19:44 ` Daniel Santos
2012-11-17 14:39 ` Borislav Petkov
2012-11-17 14:39 ` Borislav Petkov
2012-11-13 22:13 ` [PATCH v5 9/9] bug.h, compiler.h: Introduce compiletime_assert & BUILD_BUG_ON_MSG danielfsantos
2012-11-15 15:08 ` Borislav Petkov
2012-11-15 15:08 ` Borislav Petkov
2012-11-16 23:25 ` Daniel Santos
2012-11-20 20:42 ` [PATCH v6 0/9] Cleanup & new features for compiler*.h and bug.h danielfsantos
2012-11-20 21:04 ` [PATCH v6 1/9] compiler-gcc4.h: Reorder macros based upon gcc ver danielfsantos
2012-11-20 21:05 ` [PATCH v6 2/9] compiler-gcc.h: Add gcc-recommended GCC_VERSION macro danielfsantos
2012-11-20 21:05 ` [PATCH v6 3/9] compiler-gcc{3,4}.h: Use " danielfsantos
2012-11-20 21:05 ` [PATCH v6 4/9] compiler{,-gcc4}.h, bug.h: Remove duplicate macros danielfsantos
2012-11-20 21:05 ` danielfsantos
2012-11-20 21:05 ` [PATCH v6 5/9] bug.h: Fix BUILD_BUG_ON macro in __CHECKER__ danielfsantos
2012-11-20 21:05 ` [PATCH v6 6/9] bug.h: Prevent double evaulation of in BUILD_BUG_ON danielfsantos
2012-11-22 13:42 ` Borislav Petkov
2012-11-22 13:42 ` Borislav Petkov
2012-11-20 21:05 ` [PATCH v6 7/9] bug.h: Make BUILD_BUG_ON generate compile-time error danielfsantos
2012-11-20 21:05 ` [PATCH v6 8/9] compiler.h, bug.h: Prevent double error messages with BUILD_BUG{,_ON} danielfsantos
2012-11-22 13:43 ` Borislav Petkov
2012-11-22 13:43 ` Borislav Petkov
2012-11-20 21:05 ` [PATCH v6 9/9] bug.h, compiler.h: Introduce compiletime_assert & BUILD_BUG_ON_MSG danielfsantos
2012-11-21 2:35 ` [PATCH v6 0/9] Cleanup & new features for compiler*.h and bug.h Michel Lespinasse
2012-11-22 13:44 ` Borislav Petkov
2013-01-01 21:08 ` [PATCH v7 " danielfsantos
2013-01-01 21:09 ` [PATCH v7 1/9] compiler-gcc4.h: Reorder macros based upon gcc ver danielfsantos
2013-01-01 21:09 ` [PATCH v7 2/9] compiler-gcc.h: Add gcc-recommended GCC_VERSION macro danielfsantos
2013-01-01 21:09 ` [PATCH v7 3/9] compiler-gcc{3,4}.h: Use " danielfsantos
2013-01-01 21:09 ` [PATCH v7 4/9] compiler{,-gcc4}.h, bug.h: Remove duplicate macros danielfsantos
2013-01-01 21:09 ` danielfsantos
2013-01-01 21:09 ` [PATCH v7 5/9] bug.h: Fix BUILD_BUG_ON macro in __CHECKER__ danielfsantos
2013-01-01 21:09 ` [PATCH v7 6/9] bug.h: Prevent double evaulation of in BUILD_BUG_ON danielfsantos
2013-01-01 21:09 ` [PATCH v7 7/9] bug.h: Make BUILD_BUG_ON generate compile-time error danielfsantos
2013-01-01 21:09 ` [PATCH v7 8/9] compiler.h, bug.h: Prevent double error messages with BUILD_BUG{,_ON} danielfsantos
2013-01-01 21:09 ` [PATCH v7 9/9] bug.h, compiler.h: Introduce compiletime_assert & BUILD_BUG_ON_MSG danielfsantos
2013-01-01 21:27 ` [PATCH v7 1/9] compiler-gcc4.h: Reorder macros based upon gcc ver Daniel Santos
2013-01-01 22:54 ` [PATCH v8 0/9] Cleanup & new features for compiler*.h and bug.h danielfsantos
2013-01-01 22:54 ` [PATCH v8 1/9] compiler-gcc4.h: Reorder macros based upon gcc ver danielfsantos
2013-01-01 22:54 ` [PATCH v8 2/9] compiler-gcc.h: Add gcc-recommended GCC_VERSION macro danielfsantos
2013-01-01 22:54 ` [PATCH v8 3/9] compiler-gcc{3,4}.h: Use " danielfsantos
2013-01-01 22:54 ` [PATCH v8 4/9] compiler{,-gcc4}.h, bug.h: Remove duplicate macros danielfsantos
2013-01-01 22:54 ` danielfsantos
2013-01-01 22:54 ` [PATCH v8 5/9] bug.h: Fix BUILD_BUG_ON macro in __CHECKER__ danielfsantos
2013-01-01 22:54 ` [PATCH v8 6/9] bug.h: Prevent double evaulation of in BUILD_BUG_ON danielfsantos
2013-01-01 22:54 ` [PATCH v8 7/9] bug.h: Make BUILD_BUG_ON generate compile-time error danielfsantos
2013-01-01 22:54 ` [PATCH v8 8/9] compiler.h, bug.h: Prevent double error messages with BUILD_BUG{,_ON} danielfsantos
2013-01-01 22:54 ` [PATCH v8 9/9] bug.h, compiler.h: Introduce compiletime_assert & BUILD_BUG_ON_MSG danielfsantos
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=50A2C88F.5010902@att.net \
--to=danielfsantos@att.net \
--cc=bp@alien8.de \
--cc=daniel.santos@pobox.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.