NoQ added inline comments.

================
Comment at: lib/StaticAnalyzer/Checkers/IteratorChecker.cpp:478-479
+    auto &SymMgr = C.getSymbolManager();
+    EndSym = SymMgr.conjureSymbol(CE, C.getLocationContext(),
+                                  C.getASTContext().LongTy, C.blockCount());
+    State = createContainerEnd(State, ContReg, EndSym);
----------------
baloghadamsoftware wrote:
> NoQ wrote:
> > I see what you did here! And i suggest considering `SymbolMetadata` here 
> > instead of `SymbolConjured`, because it was designed for this purpose: the 
> > checker for some reason knows there's a special property of an object he 
> > wants to track, the checker doesn't have a ready-made symbolic value to 
> > represent this property (because the engine didn't know this property even 
> > exists, so it didn't denote its value), so the checker comes up with its 
> > own notation. `SymbolMetadata` is used, for example, in `CStringChecker` to 
> > denote an unknown string length for a given null-terminated string region.
> > 
> > This symbol carries the connection to the region (you may use it to 
> > reverse-lookup the region if necessary), and in particular it is considered 
> > to be live as long as the base region is live (so you don't have to deal 
> > with liveness manually; see also comments around 
> > `SymbolReaper::MarkInUse`). It's also easier to debug, because we can track 
> > the symbol back to the checker. Generally, symbol class hierarchy is cool 
> > because we know a lot about the symbol by just looking at it, and 
> > `SymbolConjured` is a sad fallback we use when we didn't care or manage to 
> > come up with a better symbol.
> > 
> > I'm not sure if `LongTy` is superior to `IntTy` here, since we don't know 
> > what to expect from the container anyway.
> > 
> > Also, please de-duplicate the symbol creation code. Birth of a symbol is 
> > something so rare it deserves a drum roll :)
> > 
> > I'd take a pause to figure out if the same logic should be applied to the 
> > map from containers to end-iterators.
> SymbolMetaData is bound to a MemRegion. Iterators are sometimes symbols and 
> sometimes memory regions, this was one of the first lessons I learned from my 
> first iterator checker.
Oh. Hmm. Ok. Right.

To be sure: in what cases do you need to create a new symbol when the iterator 
is already a symbol? How broken do we become if we try to say that the symbolic 
iterator and its own offset are the same thing?


https://reviews.llvm.org/D32592



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

Reply via email to