NoQ added inline comments.

================
Comment at: clang/lib/Analysis/CFG.cpp:1945
+      auto DRE =
+          DeclRefExpr::Create(*Context, {}, {}, VD, false, SourceLocation(),
+                              VD->getType(), VK_PRValue);
----------------
tbaeder wrote:
> NoQ wrote:
> > Is there a way to attach some valid source locations here, like the source 
> > location of the attribute's identifier argument?
> > 
> > I'm worried that the static analyzer may be unable to consume the CFG 
> > without them, it typically requires source locations for almost arbitrary 
> > statements. I'm still not sure how it'll react to synthetic statements, 
> > maybe turning them into a custom `CFGElement` subclass (like destructors) 
> > would be safer as it'll let all clients of the CFG to treat these in a 
> > custom manner. Otherwise it makes it look like a completely normal 
> > call-expression to the clients, which is not necessarily a good thing.
> Look like I can't query the attribute for any locations except its entire 
> range; I can also just pass `VD->getLocation()` to all locations here.
> 
> I thought doing this without creating fake AST nodes is better as well but I 
> wasn't sure how to do that properly, or if I have to update all consumers of 
> the CFG.
Based on the other comment thread, yeah I think it's better to have a new CFG 
element class than to build synthetic AST. The new element would replace like 
5-6 elements that the synthetic AST would otherwise imply. And it'll have the 
benefit of explicitly indicating that this isn't a "normal" call-expression, 
which is good because it's likely that many clients actually want *at least a 
little bit* of custom logic, that they'll otherwise be unable to implement.

If you don't want to update all clients, the usual thing to do is to add yet 
another flag in `CFG::BuildOptions`, and leave it off by default so that 
different clients could opt-in gradually as they implement support for the new 
element.

Given that thread-safety analysis is an analysis-based warning, and all 
analysis-based warnings share the same CFG, you'll probably still have to 
update the other analysis-based warnings. But there are like 4 of them and all 
their entry points are in the same function so you can easily see what they are.


================
Comment at: clang/lib/Analysis/CFG.cpp:1951-1952
+
+      SmallVector<Expr *> Args;
+      Args.push_back(DRE);
+      auto A = CallExpr::Create(*Context, F, Args, FD->getType(), VK_PRValue,
----------------
tbaeder wrote:
> NoQ wrote:
> > Shouldn't there be a unary operator `&` here somewhere? In your example the 
> > variable is `int` but the function accepts `int *`.
> Hm, I think you are right, but it doesn't make difference for the CFG (at 
> least not for thread anysis), does it? Is there a way for me to test that I 
> pass the right parameter value?
> it doesn't make difference for the CFG

Hmm wait no that's not how it's supposed to be. The CFG is supposed to have 
every sub-expression flattened. So if you're adding
```
CallExpr 'foo'
`- DeclRefExpr 'x'
```
to the CFG, you're supposed to be adding two elements: one for `DeclRefExpr`, 
then one for `CallExpr` *below* it:
```
[B1]
1. DeclRefExpr 'x'
2. CallExpr 'foo([B1.1])'
```
And if you also add a `UnaryOperator`:
```
CallExpr 'foo'
`- UnaryOperator '&'
   `- DeclRefExpr 'x'
```
then it's gotta be three CFG elements:
```
[B1]
1. DeclRefExpr 'x'
2. UnaryOperator '&[B1.1]'
3. CallExpr 'foo([B1.2])'
```

This is what clients expect. This probably doesn't matter for thread safety 
analysis because this `DeclRefExpr` doesn't have any effect on that analysis, 
but other clients expect these expressions to be fully flattened this way. 
(This is especially important in expressions with control flow such as `&&` or 
`?:`.)

Typically `CallExpr`s will also have a `DeclRefExpr` to the callee function as 
a child, probably with some function to pointer decay, which is a couple more 
elements.


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

https://reviews.llvm.org/D152504

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

Reply via email to