Re: sparse: ioctl defines and "error: bad integer constant expression"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 03/15/2014 12:59 PM, Hans Verkuil wrote:
> Hi!
> 
> Here is another sparse error that I get when running sparse over
> drivers/media/v4l2-core/v4l2-ioctl.c:
> 
> drivers/media/v4l2-core/v4l2-ioctl.c:2043:9: error: bad integer constant expression
> drivers/media/v4l2-core/v4l2-ioctl.c:2044:9: error: bad integer constant expression
> drivers/media/v4l2-core/v4l2-ioctl.c:2045:9: error: bad integer constant expression
> drivers/media/v4l2-core/v4l2-ioctl.c:2046:9: error: bad integer constant expression
> 
> etc.
> 
> The root cause of that turns out to be in include/asm-generic/ioctl.h:
> 
> #include <uapi/asm-generic/ioctl.h>
> 
> /* provoke compile error for invalid uses of size argument */
> extern unsigned int __invalid_size_argument_for_IOC;
> #define _IOC_TYPECHECK(t) \
>         ((sizeof(t) == sizeof(t[1]) && \
>           sizeof(t) < (1 << _IOC_SIZEBITS)) ? \
>           sizeof(t) : __invalid_size_argument_for_IOC)
> 
> If it is defined as this:
> 
> #define _IOC_TYPECHECK(t) (sizeof(t))
> 
> then all is well with the world.
> 
> I can patch v4l2-ioctl.c to redefine _IOC_TYPECHECK if __CHECKER__ is defined, but
> shouldn't sparse understand this instead? There was a similar situation with
> ARRAY_SIZE in the past that sparse now understands.

Here is a small test case for this problem:

====== ioc-typecheck.c ======
extern unsigned int __invalid_size_argument_for_IOC;
#define _IOC_TYPECHECK(t) \
                ((sizeof(t) == sizeof(t[1]) && \
                    sizeof(t) < (1 << 14)) ? \
                   sizeof(t) : __invalid_size_argument_for_IOC)

#define TEST_IOCTL (50 | (_IOC_TYPECHECK(unsigned) << 8))

static unsigned iocnrs[] = {
        [TEST_IOCTL & 0xff] = 1,
};
/*
 * check-name: correct handling of _IOC_TYPECHECK
 *
 * check-error-start
 * check-error-end
 */
====== ioc-typecheck.c ======

Running sparse over this gives:

error: bad integer constant expression

Regards,

	Hans
--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux