NoQ added inline comments.

================
Comment at: clang/lib/Analysis/CFG.cpp:2208
+}
+
 CFGBlock *CFGBuilder::VisitStmt(Stmt *S, AddStmtChoice asc) {
----------------
Tyker wrote:
> NoQ wrote:
> > Tyker wrote:
> > > NoQ wrote:
> > > > Tyker wrote:
> > > > > riccibruno wrote:
> > > > > > I don't understand why this is needed. Can you explain it ? Also I 
> > > > > > think that someone familiar with this code should comment on this 
> > > > > > (maybe @NoQ ?)
> > > > > the detail of why are complicated and i don't have them all in head 
> > > > > but without this edit in cases like 
> > > > > 
> > > > > ```
> > > > > switch (...) {
> > > > > [[likely]] case 1:
> > > > >         ...
> > > > >         [[fallthrough]];
> > > > > default:
> > > > >         ...
> > > > > }
> > > > > ```
> > > > > the fallthrough attribute emitted a diagnostic because is wasn't 
> > > > > handling attributed case statement. the edit i performed is probably 
> > > > > not the optimal way to solve the issue as it only solves the issue 
> > > > > for likelihood attribute. but i don't know any other attribute that 
> > > > > can be applied on a case statement but if they were others they would 
> > > > > probably have the same issue. but the code is quite hard to follow 
> > > > > and i didn't wanted to break anything. so this is what i came up with.
> > > > > i am going to look into it to find a better solution.
> > > > The [[likely]] attribute should not affect the overall topology of the 
> > > > CFG. It might be a nice piece of metadata to add to a CFG edge or to a 
> > > > CFG terminator, but for most consumers of the CFG (various static 
> > > > analyses such as analysis-based warnings or the Static Analyzer) the 
> > > > attribute should have little to no effect - the tool would still need 
> > > > to explore both branches. I don't know how exactly the fallthrough 
> > > > warning operates, but i find it likely (no pun intended) that the 
> > > > fallthrough warning itself should be updated, not the CFG.
> > > > 
> > > > It is probable that for compiler warnings it'll only cause false 
> > > > negatives, which is not as bad as false positives, but i wouldn't rely 
> > > > on that. Additionally, false negatives in such rare scenarios will be 
> > > > very hard to notice later. So i'm highly in favor of aiming for the 
> > > > correct solution in this patch.
> > > > 
> > > > 
> > > i think we all agree that the CFG structure shouldn't be affected by the 
> > > presence or absence of the likely attribute. but in the current state(no 
> > > changes to the CFG) it does for example. 
> > > 
> > > the CFG were obtained without the edit in CFG.cpp but with the added 
> > > likely attribute
> > > using: clang -cc1 -analyze test.cpp -analyzer-checker=debug.DumpCFG
> > > 
> > > input:
> > > 
> > > ```
> > > int f(int i) {
> > >         switch (i) {
> > >         [[likely]] case 1:
> > >                 return 1;
> > >         }
> > >         return i;
> > > }
> > > 
> > > ```
> > > outputs:
> > > 
> > > ```
> > >  [B5 (ENTRY)]
> > >    Succs (1): B2
> > > 
> > >  [B1]
> > >    1: i
> > >    2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
> > >    3: return [B1.2];
> > >    Preds (2): B3 B2
> > >    Succs (1): B0
> > > 
> > >  [B2]
> > >    1: i
> > >    2: [B2.1] (ImplicitCastExpr, LValueToRValue, int)
> > >    T: switch [B2.2]
> > >    Preds (1): B5
> > >    Succs (2): B4 B1
> > > 
> > >  [B3]
> > >    1:  [[likely]]case 1:
> > > [B4.2]   Succs (1): B1
> > > 
> > >  [B4]
> > >   case 1:
> > >    1: 1
> > >    2: return [B4.1];
> > >    Preds (1): B2
> > >    Succs (1): B0
> > > 
> > >  [B0 (EXIT)]
> > >    Preds (2): B1 B4
> > > 
> > > ```
> > > and
> > > input:
> > > 
> > > ```
> > > int f(int i) {
> > >         switch (i) {
> > >          case 1:
> > >                 return 1;
> > >         }
> > >         return i;
> > > }
> > > 
> > > ```
> > > outputs:
> > > 
> > > ```
> > >  [B4 (ENTRY)]
> > >    Succs (1): B2
> > > 
> > >  [B1]
> > >    1: i
> > >    2: [B1.1] (ImplicitCastExpr, LValueToRValue, int)
> > >    3: return [B1.2];
> > >    Preds (1): B2
> > >    Succs (1): B0
> > > 
> > >  [B2]
> > >    1: i
> > >    2: [B2.1] (ImplicitCastExpr, LValueToRValue, int)
> > >    T: switch [B2.2]
> > >    Preds (1): B4
> > >    Succs (2): B3 B1
> > > 
> > >  [B3]
> > >   case 1:
> > >    1: 1
> > >    2: return [B3.1];
> > >    Preds (1): B2
> > >    Succs (1): B0
> > > 
> > >  [B0 (EXIT)]
> > >    Preds (2): B1 B3
> > > ```
> > > i think think this is the underlying issue. the false diagnostic from 
> > > fallthrough previously mentioned is a consequence of this
> > Hmm, i see. I got it all wrong. Please forgive me!
> > 
> > You're just trying to make `CFGBuilder` support `AttributedStmt` correctly 
> > in general. And the logic you're writing says "support it as any other 
> > generic Stmt that doesn't have any control flow in it, unless it's a 
> > `[[likely]]`-attributed `AttributedStmt`, in which case jump straight to 
> > children".
> > 
> > Could you instead do this by implementing `CFGBuilder::VisitAttributedStmt` 
> > with that logic?
> > 
> > I'm also not sure this logic is actually specific to `[[likely]]`. Maybe we 
> > should unwrap all `AttributedStmt`s similarly?
> we shouldn't handle all AttributedStmt this way. for example fallthrough 
> needs to be present in the CFG because the analysis based warning depends on 
> it. but we probably can handle every AttributedStmt on a case statement this 
> way or even every AttributedStmt that aren't applied on a NullStmt. but 
> perhaps this should be in an other patch, this one is already quite big and 
> this issue is more general the likely attribute.
Thanks, this makes perfect sense to me!


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D59467/new/

https://reviews.llvm.org/D59467



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to