[cfe-dev] [cfe-commits] False positive for -Wunreachable-code

Jordan Rose jordan_rose at apple.com
Tue Oct 30 09:25:06 PDT 2012


On Oct 30, 2012, at 2:34 , Abramo Bagnara <abramo.bagnara at bugseng.com> wrote:

> Il 28/10/2012 08:12, Abramo Bagnara ha scritto:
>> $ cat p.c
>> #include <stdio.h>
>> 
>> enum e { a, b = 4 } x = 3;
>> 
>> void g(int v) {
>>  printf("%d\n", v);
>> }
>> 
>> int main(int argc, char **argv) {
>>  switch (x) {
>>  case a:
>>    g(0);
>>    break;
>>  case b:
>>    g(1);
>>    break;
>>  default:
>>    g(2);
>>    break;
>>  }
>> }
>> $ _clang -Wunreachable-code -Wcovered-switch-default -O2 p.c
>> p.c:17:3: warning: default label in switch which covers all enumeration
>> values
>>      [-Wcovered-switch-default]
>>  default:
>>  ^
>> p.c:18:7: warning: will never be executed [-Wunreachable-code]
>>    g(2);
>>      ^
>> $ ./a.out
>> 2
>> 
>> Of course -Wcovered-switch-default warning is a perfectly true positive.
>> 
>> My reading of the standard is that nothing prevent an enum to have a
>> value different from listed enum constants if this value is compatible
>> with enum range (and code generation seems to agree on that).
> 
> I've attached the patch for review.
> 
> The fixed testcase shows well why to hide warnings about undefined
> behaviour in code actually generated is a bad thing.

If we do this, we're going to want this under a CFG option at the very least. The static analyzer should continue assuming that an enum input to a switch is always a valid enum constant, in order to keep our false positive rate down.

Jordan



More information about the cfe-dev mailing list