On 02/23/10 12:59, Josh Triplett wrote: > On Tue, Feb 23, 2010 at 11:49:06AM -0800, Randy Dunlap wrote: >> Hi, >> >> You probably know that sparse produces a ton of errors & warnings when >> run on the Linux kernel tree (a little over 1 MB in my latest 'make C=1' >> on x86_64 arch.). >> >> I'm wondering if all of these are valid. >> >> Examples: >> >> >> 1. Use of the BUILD_BUG_ON() macro causes this error from sparse: >> >> arch/x86/kernel/paravirt.c:101:9: error: invalid bitfield width, -1. >> >> include/linux/kernel.h: >> >> /* Force a compilation error if condition is true */ >> #define BUILD_BUG_ON(condition) ((void)BUILD_BUG_ON_ZERO(condition)) >> >> /* 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 >> e.g. in a structure initializer (or where-ever else comma expressions >> aren't permitted). */ >> #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) > > In theory that should only happen if the BUILD_BUG_ON_ZERO actually > triggers, and thus sparse fails to build just as GCC would. If sparse > has this problem and GCC doesn't, could you please provide a minimal > test case? Sure, attached. >> 2. drivers/block/drbd/drbd_int.h uses __protected_by(var); >> this seems to be unknown to sparse. >> >> #ifdef __CHECKER__ >> # define __protected_by(x) __attribute__((require_context(x,1,999,"rdwr"))) >> >> sparse says many times: >> >> drivers/block/drbd/drbd_int.h:887:39: error: attribute 'require_context': unknown attribute > > That looks broken. A few patches went around for new Sparse > context-tracking features, one of which got reverted before the 0.4.2 > release, but I don't think any of them would have allowed *that*. Yeah, I recall seeing some of the context patches. Thanks. -- ~Randy
/* Force a compilation error if condition is true */ #define BUILD_BUG_ON(condition) ((void)BUILD_BUG_ON_ZERO(condition)) /* 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 e.g. in a structure initializer (or where-ever else comma expressions aren't permitted). */ #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); })) struct branch { unsigned char opcode; int delta; } __attribute__((packed)); unsigned paravirt_patch_call(void *insnbuf) { struct branch *b = insnbuf; b->opcode = 0xe8; /* call */ b->delta = 0x1234; BUILD_BUG_ON(sizeof(*b) != 5); return 5; } int main(int argc, char *argv[]) { }