sgatev marked 3 inline comments as done.
sgatev added a comment.

I also agree that the current approach isn't robust. I think that a proper 
solution would involve patching the CFG because in some cases it seems to be 
incorrect. For example, the call to `qux` is incorrectly deemed to be 
unreachable in the CFG of the following code:

  int foo();
  
  class Fatal {
   public:
    ~Fatal() __attribute__((noreturn));
    int bar();
    int baz();
  };
  
  void qux();
  
  void target(bool b1, bool b2) {
    int value = b1 ? foo() : (b2 ? Fatal().bar() : Fatal().baz());
    qux();
  }

I'd be happy to look into a solution for this as a follow up. I guess it would 
have an impact on other users of the CFG too.



================
Comment at: clang/include/clang/Analysis/FlowSensitive/ControlFlowContext.h:50
+  std::unique_ptr<CFG> Cfg;
+  llvm::DenseMap<const Stmt *, const CFGBlock *> StmtToBlock;
+};
----------------
gribozavr2 wrote:
> xazax.hun wrote:
> > There is a special class for this at `clang/lib/Analysis/CFGStmtMap.cpp`. 
> > That also does some special handling of the terminators. I wonder if we 
> > need to do something similar here (or just use that class as is?).
> The only downside I see is that CFGStmtMap needs a ParentMap, which is not 
> cheap to make, but we don't need. Maybe we need to make it optional in 
> CFGStmtMap?
The main reason for me not to use `CFGStmtMap` right away is that based on some 
tests it seems to behave differently compared to what's implemented here. I 
plan to look into that in detail and see if there's an opportunity to replace 
the logic here. It shouldn't be too difficult to do that in a follow up as 
`getStmtToBlock` is used in a single place.


================
Comment at: 
clang/include/clang/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.h:103
 std::vector<llvm::Optional<TypeErasedDataflowAnalysisState>>
-runTypeErasedDataflowAnalysis(const CFG &Cfg,
+runTypeErasedDataflowAnalysis(const ControlFlowContext &Ctx,
                               TypeErasedDataflowAnalysis &Analysis,
----------------
gribozavr2 wrote:
> I'd suggest a more verbose name like `CFCtx`, since `Ctx` is most often used 
> in Clang for `ASTContext`. (Here and elsewhere in the patch.)
Replaced `Ctx` with `CFCtx` across the patch.


================
Comment at: clang/lib/Analysis/FlowSensitive/TypeErasedDataflowAnalysis.cpp:51
+  if (Block.getTerminator().isTemporaryDtorsBranch()) {
+    // The first successor of a block with a temporary destructor terminator is
+    // the block that evaluates the destructor. If that block has a noreturn
----------------
xazax.hun wrote:
> This comment might be a bit hard to understand without a code example. 
> Admittedly, including an example here could get very chatty, but we could 
> refer to the name of the corresponding test.
> 
> I wonder whether naming the blocks like `The first successor of block 'A'` 
> would make this clearer.
I updated the comment and added more tests. Hopefully, that would be good 
enough for now and we can replace all of this with a more principled solution 
shortly.


================
Comment at: 
clang/unittests/Analysis/FlowSensitive/TypeErasedDataflowAnalysisTest.cpp:47
+    auto Ctx = ControlFlowContext::build(nullptr, Body, Result.Context);
+    assert(Ctx);
 
----------------
gribozavr2 wrote:
> Use `llvm::cantFail` to unwrap the `Expected`?
Much better. Thanks!


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D116022

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

Reply via email to