On Fri, Nov 14, 2008 at 08:50:44AM +0100, Takashi Iwai wrote:
At Fri, 14 Nov 2008 15:47:37 +0800, Wu Fengguang wrote:
On Fri, Nov 14, 2008 at 08:43:59AM +0100, Takashi Iwai wrote:
At Fri, 14 Nov 2008 15:38:56 +0800, Wu Fengguang wrote:
> > --- /dev/null > > +++ sound-2.6/sound/pci/hda/hda_eld.c > > +static inline unsigned char grab_bits(const unsigned char *buf, > > + int byte, int lowbit, int bits) > > +{ > > + BUG_ON(lowbit > 7); > > + BUG_ON(bits > 8); > > + BUG_ON(bits <= 0); > > Can it be rather BUILD_BUG_ON(), BTW? > Or, hmm, doesn't work if it's an inline function?
Yes, converted to BUILD_BUG_ON() and it compiles OK.
The question is whether this really triggers the build error properly. Could you check it, simply by changing the caller of grab_bits() with some invalid values? Then you should get a compile error.
BUILD_BUG_ON() won't emit errors! So use BUG_ON()?
Try to make grab_bits() a macro and check whether BUILD_BUG_ON() works. I think it won't be too bad to use a macro for such a pretty simple case. If the resultant code looks too ugly, we should switch back to BUG_ON().
OK, I'm fine with a macro.
The difference is that BUILD_BUG_ON() would add no real code while BUG_ON() is a pure run-time check.
But the code should be optimize away by gcc when the constant expression is false?
Well, I think BUG_ON() code remains in this case because it's no constant check as it's in a function (although inlined). Otherwise BUILD_BUG_ON() should have worked.
Hehe, not so ugly as a macro:
#define GRAB_BITS(buf, byte, lowbit, bits) \ ({ \ BUILD_BUG_ON(lowbit > 7); \ BUILD_BUG_ON(bits > 8); \ BUILD_BUG_ON(bits <= 0); \ \ (buf[byte] >> (lowbit)) & ((1 << (bits)) - 1); \ })
Cheers, Fengguang