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

Richard Smith richard at metafoo.co.uk
Tue Oct 30 14:19:44 PDT 2012


On Tue, Oct 30, 2012 at 1:51 PM, Ted Kremenek <kremenek at apple.com> wrote:
> On Oct 30, 2012, at 1:24 PM, Richard Smith <richard at metafoo.co.uk> wrote:
>
> 3) If there is no code after an enum-covered switch with no default,
> or the next statement can be reached by a different path, we should
> make a conservative assumption (that it cannot happen for cases where
> it happening would trigger a warning, and that it can happen in cases
> where it not happening would trigger a warning).
>
>
> I think I understand what you mean, but that's a bit of a run on sentence.
> The multiple "it happening" and "it not happening" is confusing.  Can you be
> a bit more clear?  Since this may not be fixed immediately it would be good
> to establish some clarity here.

Sorry for my terrible sentence construction! I have in mind examples like this:

enum E { a, b, c };
int f(bool b, E e) {
  int n;
  if (b) {
    switch (e) { // #1
    case a: case b: case c:
      return 0;
    }
  } else {
    n = 0;
  }
  return n; // #2
}

I'm suggesting that in this case, we should be conservative when
adding a CFG edge from #1 to #2, because:
  * #2 has predecessors other than #1, and
  * #1 has no explicit indication that the default case is reachable

By "be conservative", I mean:
  * If the presence of a CFG edge would make a particular checker
think there was a bug, we assume the edge from #1 to #2 cannot happen
for the purpose of that check
  * If the absence of a CFG edge would make a particular checker think
there was a bug, we assume the edge from #1 to #2 can happen for the
purpose of that check

So, -Wuninitialized and -Wreturn-type would assume that the edge from
#1 to #2 cannot happen (and -Wuninitialized would not warn here). But
-Wunreachable-code would assume that the edge from #1 to #2 can
happen, and again would not warn (as it happens, -Wunreachable-code
can actually assume that the edge cannot happen too, since we only
make this assumption in the cases where we already know #2 is
reachable by some other path).



More information about the cfe-dev mailing list