BUILD_BUG_ON(): fix it and a couple of bogus uses of it
gcc permitting variable length arrays makes the current construct used for BUILD_BUG_ON() useless, as that doesn't produce any diagnostic if the controlling expression isn't really constant. Instead, this patch makes it so that a bit field gets used here. Consequently, those uses where the condition isn't really constant now also need fixing. Note that in the gfp.h, kmemcheck.h, and virtio_config.h cases MAYBE_BUILD_BUG_ON() really just serves documentation purposes - even if the expression is compile time constant (__builtin_constant_p() yields true), the array is still deemed of variable length by gcc, and hence the whole expression doesn't have the intended effect. [akpm@linux-foundation.org: make arch/sparc/include/asm/vio.h compile] [akpm@linux-foundation.org: more nonsensical assertions in tpm.c..] Signed-off-by: Jan Beulich <jbeulich@novell.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: Rusty Russell <rusty@rustcorp.com.au> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: Rajiv Andrade <srajiv@linux.vnet.ibm.com> Cc: Mimi Zohar <zohar@us.ibm.com> Cc: James Morris <jmorris@namei.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
1fe72eaa0f
commit
8c87df457c
@@ -258,7 +258,7 @@ static inline void *vio_dring_entry(struct vio_dring_state *dr,
|
|||||||
static inline u32 vio_dring_avail(struct vio_dring_state *dr,
|
static inline u32 vio_dring_avail(struct vio_dring_state *dr,
|
||||||
unsigned int ring_size)
|
unsigned int ring_size)
|
||||||
{
|
{
|
||||||
BUILD_BUG_ON(!is_power_of_2(ring_size));
|
MAYBE_BUILD_BUG_ON(!is_power_of_2(ring_size));
|
||||||
|
|
||||||
return (dr->pending -
|
return (dr->pending -
|
||||||
((dr->prod - dr->cons) & (ring_size - 1)));
|
((dr->prod - dr->cons) & (ring_size - 1)));
|
||||||
|
@@ -696,7 +696,7 @@ int __tpm_pcr_read(struct tpm_chip *chip, int pcr_idx, u8 *res_buf)
|
|||||||
|
|
||||||
cmd.header.in = pcrread_header;
|
cmd.header.in = pcrread_header;
|
||||||
cmd.params.pcrread_in.pcr_idx = cpu_to_be32(pcr_idx);
|
cmd.params.pcrread_in.pcr_idx = cpu_to_be32(pcr_idx);
|
||||||
BUILD_BUG_ON(cmd.header.in.length > READ_PCR_RESULT_SIZE);
|
BUG_ON(cmd.header.in.length > READ_PCR_RESULT_SIZE);
|
||||||
rc = transmit_cmd(chip, &cmd, cmd.header.in.length,
|
rc = transmit_cmd(chip, &cmd, cmd.header.in.length,
|
||||||
"attempting to read a pcr value");
|
"attempting to read a pcr value");
|
||||||
|
|
||||||
@@ -760,7 +760,7 @@ int tpm_pcr_extend(u32 chip_num, int pcr_idx, const u8 *hash)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
cmd.header.in = pcrextend_header;
|
cmd.header.in = pcrextend_header;
|
||||||
BUILD_BUG_ON(be32_to_cpu(cmd.header.in.length) > EXTEND_PCR_SIZE);
|
BUG_ON(be32_to_cpu(cmd.header.in.length) > EXTEND_PCR_SIZE);
|
||||||
cmd.params.pcrextend_in.pcr_idx = cpu_to_be32(pcr_idx);
|
cmd.params.pcrextend_in.pcr_idx = cpu_to_be32(pcr_idx);
|
||||||
memcpy(cmd.params.pcrextend_in.hash, hash, TPM_DIGEST_SIZE);
|
memcpy(cmd.params.pcrextend_in.hash, hash, TPM_DIGEST_SIZE);
|
||||||
rc = transmit_cmd(chip, &cmd, cmd.header.in.length,
|
rc = transmit_cmd(chip, &cmd, cmd.header.in.length,
|
||||||
|
@@ -5615,7 +5615,7 @@ static void niu_init_tx_mac(struct niu *np)
|
|||||||
/* The XMAC_MIN register only accepts values for TX min which
|
/* The XMAC_MIN register only accepts values for TX min which
|
||||||
* have the low 3 bits cleared.
|
* have the low 3 bits cleared.
|
||||||
*/
|
*/
|
||||||
BUILD_BUG_ON(min & 0x7);
|
BUG_ON(min & 0x7);
|
||||||
|
|
||||||
if (np->flags & NIU_FLAGS_XMAC)
|
if (np->flags & NIU_FLAGS_XMAC)
|
||||||
niu_init_tx_xmac(np, min, max);
|
niu_init_tx_xmac(np, min, max);
|
||||||
|
@@ -220,7 +220,7 @@ static inline enum zone_type gfp_zone(gfp_t flags)
|
|||||||
((1 << ZONES_SHIFT) - 1);
|
((1 << ZONES_SHIFT) - 1);
|
||||||
|
|
||||||
if (__builtin_constant_p(bit))
|
if (__builtin_constant_p(bit))
|
||||||
BUILD_BUG_ON((GFP_ZONE_BAD >> bit) & 1);
|
MAYBE_BUILD_BUG_ON((GFP_ZONE_BAD >> bit) & 1);
|
||||||
else {
|
else {
|
||||||
#ifdef CONFIG_DEBUG_VM
|
#ifdef CONFIG_DEBUG_VM
|
||||||
BUG_ON((GFP_ZONE_BAD >> bit) & 1);
|
BUG_ON((GFP_ZONE_BAD >> bit) & 1);
|
||||||
|
@@ -678,13 +678,17 @@ struct sysinfo {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Force a compilation error if condition is true */
|
/* Force a compilation error if condition is true */
|
||||||
#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
|
#define BUILD_BUG_ON(condition) ((void)BUILD_BUG_ON_ZERO(condition))
|
||||||
|
|
||||||
|
/* Force a compilation error if condition is constant and true */
|
||||||
|
#define MAYBE_BUILD_BUG_ON(cond) ((void)sizeof(char[1 - 2 * !!(cond)]))
|
||||||
|
|
||||||
/* Force a compilation error if condition is true, but also produce a
|
/* Force a compilation error if condition is true, but also produce a
|
||||||
result (of value 0 and type size_t), so the expression can be used
|
result (of value 0 and type size_t), so the expression can be used
|
||||||
e.g. in a structure initializer (or where-ever else comma expressions
|
e.g. in a structure initializer (or where-ever else comma expressions
|
||||||
aren't permitted). */
|
aren't permitted). */
|
||||||
#define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1)
|
#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
|
||||||
|
#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
|
||||||
|
|
||||||
/* Trap pasters of __FUNCTION__ at compile-time */
|
/* Trap pasters of __FUNCTION__ at compile-time */
|
||||||
#define __FUNCTION__ (__func__)
|
#define __FUNCTION__ (__func__)
|
||||||
|
@@ -152,7 +152,7 @@ static inline bool kmemcheck_is_obj_initialized(unsigned long addr, size_t size)
|
|||||||
\
|
\
|
||||||
_n = (long) &((ptr)->name##_end) \
|
_n = (long) &((ptr)->name##_end) \
|
||||||
- (long) &((ptr)->name##_begin); \
|
- (long) &((ptr)->name##_begin); \
|
||||||
BUILD_BUG_ON(_n < 0); \
|
MAYBE_BUILD_BUG_ON(_n < 0); \
|
||||||
\
|
\
|
||||||
kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \
|
kmemcheck_mark_initialized(&((ptr)->name##_begin), _n); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@@ -109,8 +109,7 @@ static inline bool virtio_has_feature(const struct virtio_device *vdev,
|
|||||||
unsigned int fbit)
|
unsigned int fbit)
|
||||||
{
|
{
|
||||||
/* Did you forget to fix assumptions on max features? */
|
/* Did you forget to fix assumptions on max features? */
|
||||||
if (__builtin_constant_p(fbit))
|
MAYBE_BUILD_BUG_ON(fbit >= 32);
|
||||||
BUILD_BUG_ON(fbit >= 32);
|
|
||||||
|
|
||||||
if (fbit < VIRTIO_TRANSPORT_F_START)
|
if (fbit < VIRTIO_TRANSPORT_F_START)
|
||||||
virtio_check_driver_offered_feature(vdev, fbit);
|
virtio_check_driver_offered_feature(vdev, fbit);
|
||||||
|
Reference in New Issue
Block a user