Idea Detail view

 
 
 

Value tracking simultaneously assumes enums both can and cannot take any value

 

In the following snippet I've defined a basic assertion macro and an enum, with an external function that returns a value typed by that enum. I wish to verify that the returned value is a valid enumerated value.

Firstly, if we remove both assertions below then there are no warnings generated, despite the fact that an out of bounds access on the `printf` is possible.

If you add both assertions then the warning described inline occur: a warning on the first assertion claims that the result can be predetermined. If we assume that enums can only take their enumerated values then this could be a reasonable claim, albeit unsafe in my opinion.

However, if you remove the first assertion then a warning is generated on the `printf` line indicating that a possible out-of-range access at position `-2147483648` occurs. In this case, Lint assumes that enums can take any possible value. In my opinion this is the desired result, however it conflicts with the previous paragraph.

 

   #include <stdlib.h>
   #include <stdio.h>
   #include <stdint.h>
   
   typedef enum MyEnum_e
   {
     ENUM_VAL_0 = 0,
     ENUM_VAL_1 = 1,
     ENUM_VAL_COUNT
   } MyEnum_t;
   
   MyEnum_t f(void);
    
   #define MY_ASSERT(cond) if (!(cond)) exit(0)
   int main()
   {
       static int32_t the_array[(uint32_t)ENUM_VAL_COUNT] = { 0, 1 };
       MyEnum_t the_value = f(); //some function call, perhaps external. consider f() could return (MyEnum_t)(-1);
       MY_ASSERT(the_value >= ENUM_VAL_0); //causes warnings 2650 and 587, incorrectly claims predicate '>=' can be pre-determined and always evaluates to true.
       MY_ASSERT(the_value < ENUM_VAL_COUNT);
       (void)printf("%i", the_array[the_value]); //If you comment out the first assertion above then this line triggers "warning 676: possibly indexing before the beginning of an allocation, inference yields -2147483648"
    
       return 0;
   }

 

 

Pending

1 Votes