[cfe-dev] False positive for -Wunreachable-code
    Tom Care 
    tcare at apple.com
       
    Tue Aug  3 10:30:55 PDT 2010
    
    
  
-Wunreachable-code works by looking for CFG blocks without predecessors. If we compare the two attached CFGs, we can see that when the destructor is present there is an extra 'unreachable' block that starts with the throw statement. I'm guessing this has to do with the implementation of C++ destructors and exceptions (implicit destructor call?), but I'm not an expert in this area. I'll let someone with more C++ CFG knowledge confirm.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CFG-with-destructor.dot
Type: application/msword
Size: 645 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20100803/c8e7adbd/attachment.dot>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CFG-without-destructor.dot
Type: application/msword
Size: 542 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20100803/c8e7adbd/attachment-0001.dot>
-------------- next part --------------
On Aug 3, 2010, at 8:22 AM, Abramo Bagnara wrote:
> 
> The following typescript shows that clang incorrectly seems to mark as
> unreachable a throw of a temporary.
> 
> Please note that if I remove the destructor of struct s, no warning is
> generated.
> 
> $ cat w.cc
> struct s {
>  explicit s() { }
>  ~s() { }
> };
> 
> int f_bad(int x) {
>  if (x)
>    throw s();
>  return 0;
> }
> 
> int f_good(int x) {
>  if (x) {
>    s e;
>    throw e;
>  }
>  return 0;
> }
> $ llvm/Debug+Asserts/bin/clang++ -Wunreachable-code -c w.cc
> w.cc:8:5: warning: will never be executed [-Wunreachable-code]
>    throw s();
>    ^~~~~~~~~
> 1 warning generated.
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
    
    
More information about the cfe-dev
mailing list