Ok, I think I worked through the issues. Please take another look :D

================
Comment at: lib/StaticAnalyzer/Core/ExprEngine.cpp:54-56
@@ -53,1 +53,5 @@
 
+REGISTER_TRAIT_WITH_PROGRAMSTATE(
+    InitializedTemporariesSet,
+    llvm::ImmutableSet<const CXXBindTemporaryExpr *>);
+
----------------
Jordan Rose wrote:
> Manuel Klimek wrote:
> > Jordan Rose wrote:
> > > This needs to include the current StackFrameContext as well (for 
> > > recursive functions). You can get that from the current LocationContext.
> > Can you elaborate on how I would put that into a datastructure? Just use a 
> > std::pair? (doesn't seem to work with ImmutableSet though)
> > 
> > Also, I seem unable to write a test that breaks because of this - any hints 
> > would be highly welcome.
> We'd have to write a specialization of ImutProfileInfo for std::pair, but 
> that's probably not a bad idea anyway. Please feel free to add one to 
> ImmutableSet.h.
> 
> I would guess the test case would look something like this:
> 
>   static bool test(bool isInner) {
>     if (isInner || NoReturnDtor() || test(true)) {
>       *(volatile int *)0 = 1; // should warn
>     }
>   }
>   void topLevel() {
>     test(false);
>   }
> 
Sent patch for review & added test.

================
Comment at: lib/StaticAnalyzer/Core/ExprEngine.cpp:771
@@ +770,3 @@
+             !State->contains<InitializedTemporariesSet>(BTE));
+      State = State->add<InitializedTemporariesSet>(BTE);
+      StmtBldr.generateNode(BTE, Pred, State);
----------------
Jordan Rose wrote:
> Manuel Klimek wrote:
> > Alex McCarthy wrote:
> > > If includeTemporaryDtorsInCFG is not set, should we avoid this state 
> > > modification?
> > That's a good question (for Jordan ;)
> > 
> > Another question is whether we still want to do the runCheckersForPre / 
> > runCheckersForPost enchilada.
> We're trying to run pre/post-checks on all non-trivial statements, so yes, we 
> should still do it. It's //almost// simple enough that we can hoist that out 
> of the big switch, but I'm not sure that's correct for all statement kinds, 
> and no one's looked into it.
> 
> (But now that we have C++11, I'm //really// inclined to hoist the thing into 
> a closure, so that people don't have to write that "loop over the nodes 
> generated by pre-checkers" loop themselves.)
> 
> As for the state modification, what I mainly care about is that we //clean 
> up// the map. Since that doesn't happen when temporary destructors are off, 
> yes, we should be checking here. (Note that this is also important if we stop 
> generating conditions for every temporary destructor—we need to make sure 
> that the state is clean by the end of the full-expression even if we skip 
> some of the conditions.)
Done.

================
Comment at: lib/StaticAnalyzer/Core/ExprEngine.cpp:1451
@@ -1433,1 +1450,3 @@
 
+  if (const CXXBindTemporaryExpr *BTE = 
+      dyn_cast<CXXBindTemporaryExpr>(Condition)) {
----------------
Jordan Rose wrote:
> Manuel Klimek wrote:
> > Alex McCarthy wrote:
> > > I think it's worth pulling this out into a new processTemporary helper 
> > > method rather than adding it to processBranch: you're not reusing any of 
> > > the logic in processBranch in the temporary dtor case.
> > > 
> > > This would involve adding a new HandleTemporary helper (or similar) that 
> > > you'd call instead of HandleBranch, and that would call processTemporary
> > I agree. I mainly haven't done that, as somewhere in that chain there is an 
> > interface, and the method is abstract. I found only one use, so I assume 
> > somebody else implements that interface outside of the clang codebase. I'd 
> > like to hear what Jordan thinks on that issue, architecture-wise.
> These days the interface isn't serving us much real purpose. In theory 
> CoreEngine is just traversing CFGs, and doesn't actually know very much about 
> C ef al. It then hands the CFGElements off to its SubEngine, which actually 
> processes them and tells the CoreEngine where to go next if there's a branch. 
> ExprEngine is the particularly SubEngine that understands the AST / the 
> language.
> 
> In practice there's a lot of linguistic knowledge coded into CoreEngine, just 
> because there's a lot of linguistic knowledge in the CFG and in ProgramPoints 
> these days. But either way, SubEngine is more of an interface than a real 
> base class; I don't think Ted ever expected that we'd get subclassing more 
> than one level deep. It's okay to split this up into helper methods.
Done.

http://reviews.llvm.org/D3627



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to