Szelethus added inline comments.
================ Comment at: lib/StaticAnalyzer/Checkers/UninitializedObjectChecker.cpp:681-689 + Optional<nonloc::LazyCompoundVal> OtherObject = + getObjectVal(OtherCtor, Context); + if (!OtherObject) + continue; + + // If the CurrentObject is a field of OtherObject, it will be analyzed + // during the analysis of OtherObject. ---------------- NoQ wrote: > Szelethus wrote: > > NoQ wrote: > > > Szelethus wrote: > > > > NoQ wrote: > > > > > It seems safer to look at `CXXConstructExpr::getConstructionKind()`. > > > > > > > > > > Taking a `LazyCompoundVal` and converting it back to a region is > > > > > definitely a bad idea because the region within `LazyCompoundVal` is > > > > > completely immaterial and carries no meaning for the value > > > > > represented by this `SVal`; it's not necessarily the region you're > > > > > looking for. > > > > Looking at the singleton test case, I think I need to get that region > > > > somehow, and I'm not too sure what you meant under using > > > > `CXXConstructExpr::getConstructionKind()`. One thing I could do, is > > > > similar to how `getObjectVal` works: > > > > ``` > > > > Loc Tmp = Context.getSValBuilder().getCXXThis(OtherCtor->getParent(), > > > > > > > > Context.getStackFrame()); > > > > > > > > auto OtherThis = > > > > Context.getState()->getSVal(Tmp).castAs<loc::MemRegionVal>(); > > > > > > > > OtherThis.getRegion(); // Hooray! > > > > ``` > > > > > > > > I have tested it, and it works wonders. Is this a "safe-to-use" region? > > > You can directly ask `CXXConstructExpr` if it's a field or a base > > > constructor. I could describe `getConstructionKind()` as some sort of > > > very limited `ConstructionContext` that's available in the AST: it > > > explains to you what sort of object is being constructed. I suspect it's > > > enough for your purposes. > > I think I'm aware of how it works, but my issue is that it's very limited: > > ``` > > enum ConstructionKind { CK_Complete, CK_NonVirtualBase, CK_VirtualBase, > > CK_Delegating } > > ``` > > Sadly, whether the `CXXConstructExpr` was a field construction or a "top > > level" (non-field) construction can't be retrieved from > > `getConstructionKind()`, as I understand it. > > > > If I were to return true (say that the constructed object will be analyzed > > later, thus ignoring it for now) if `getConstructionKind() == CK_Complete`, > > the singleton testcase will fail (I have tested it). I'm very confident > > that I need to obtain the constructed object's `MemRegion`. > Whoops, yeah, i was wrong. I mis-remembered that there's a `CK_` for field. > > Then, yeah, the code looks good, let me recall where we were in terms of why > do we need it>< "it" as if? https://reviews.llvm.org/D48436 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits