[PATCH] D40560: [analyzer] Get construction into `operator new` running in simple cases.

Artem Dergachev via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 20 19:08:59 PST 2017

NoQ added a comment.

A slower explanation of the approach in '3.' in the previous message:

(1) Evaluate operator new() aka the allocator call as usual.
(2) Take the return value of (1) as usual.
(3) Take `CXXConstructExpr` which is the child of the `CXXNewExpr` that triggered the allocator call on (1).
(4) Construct a `StackFrameContext` with `CXXConstructExpr` from (3).
(5) //**Don't**// put the newly constructed `StackFrameContext` on the location context stack.
(6) Construct the `StackArgumentsSpaceRegion` for the `StackFrameContext` from (4).
(7) Construct the `CXXThisRegion` for the `StackArgumentsSpaceRegion` from (6).
(8) Bind the return value from (2) to `CXXThisRegion` from (7) in the Store.
(9) Put the node with the state from (8) to the worklist as usual.
(10) `CoreEngine` says it's time to evaluate `CXXConstructExpr` from (3) as usual.
(11) Make sure that the binding we made in (8) survives garbage collection*.
(11) Construct `StackFrameContext` for the `CXXConstructExpr` from (3) as usual.
(12) `LocationContextManager` ensures that on (4) and on (11) we get //the same// `StackFrameContext`.
(13) //**Don't**// bind `CXXThisRegion` while entering the stack frame - it was already done in (8).
(14) Finally enter the stack frame we've constructed twice on (4) and on (11), as usual.
(15) Evaluate the constructor, as usual.
(16) Bind this-value to `CXXConstructExpr` after evaluation (as usual? not sure).
(17) Allow the binding in the Store we made on (8) to be garbage-colllected as usual.
(18) When evaluating `CXXNewExpr`, take value of `CXXConstructExpr` and bind it to `CXXNewExpr`.

*We  may modify `SymbolReaper::isLiveRegion()` for this purpose. Sounds easy.


More information about the cfe-commits mailing list