Re: Sparse crash when mixing int and enum in ternary operator

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

 



On Sat, Mar 27, 2010 at 10:16:38AM +0100, Kamil Dudka wrote:
> On Wednesday 24 of March 2010 11:07:04 Christopher Li wrote:
> > That is just too much. Most of the warning is coming from enum or
> > operation. e.g.
> > .type = KW_SPECIFIER | KW_SHORT,
> > lookup_keyword(token->ident, NS_KEYWORD | NS_TYPEDEF);
> 
> Looking once again, I don't think that's the case.  The warnings do not come 
> from the "enum or" operation, but they come from passing the integral result 
> to enum variable (or arg).  Instead of weaking my patch, we may improve the 
> code of sparse and add explicit casts back to enum:
> 
>     .type = (enum keyword) (KW_SPECIFIER | KW_SHORT),
>     lookup_keyword(token->ident, (enum namespace) (NS_KEYWORD | NS_TYPEDEF));

That looks wrong.  .type doesn't contain a value of type "enum keyword",
it contains the bitwise or of such values, which won't represent a valid
enum value.  Thus, .type should have an integral type, not an enum type.
The same goes for the second parameter of lookup_keyword.

> The whole problem can be narrowed down to a simple test-case:
> 
>     int main()
>     {
>         enum {
>             A = 0x1,
>             B = 0x2
>         } val = A | B;

This code seems semantically wrong, as described above.  val should only
have values 0x1 or 0x2, and you've assigned it 0x3, which doesn't
represent a valid value of its enum type.

> Here is what sparse gives:
> $ ./sparse enum.c
> enum.c:1:10: warning: non-ANSI function declaration of function 'main'
> enum.c:6:15: warning: conversion of
> enum.c:6:15:     int to
> enum.c:6:15:     int enum <noident>
> 
> 
> Here is what g++ gives:
> $ g++ enum.c
> enum.c: In function ‘int main()’:
> enum.c:6: error: invalid conversion from ‘int’ to ‘main()::<anonymous enum>’

Yup, both of these warnings seem correct.  Don't fix them by casting,
fix them by declaring "val" with an appropriate integral type.

- Josh Triplett
--
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