[cfe-commits] r169563 - in /cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive: CallEvent.h CheckerContext.h ExplodedGraph.h
Jordan Rose
jordan_rose at apple.com
Thu Dec 6 17:13:28 PST 2012
On Dec 6, 2012, at 16:07 , David Blaikie <dblaikie at gmail.com> wrote:
> On Thu, Dec 6, 2012 at 3:55 PM, Jordan Rose <jordan_rose at apple.com> wrote:
>> Author: jrose
>> Date: Thu Dec 6 17:55:34 2012
>> New Revision: 169563
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=169563&view=rev
>> Log:
>> [analyzer] Avoid ProgramStateRef copy constructors.
>>
>> Suggested by David Blaikie. ExplodedNode, CallEvent, and CheckerContext all
>> hang onto their ProgramState, so the accessors can return a reference to the
>> internal state rather than preemptively copying it. This helps avoid
>> temporary ProgramStateRefs, though local variables will still (correctly)
>> do an extra retain and release.
>>
>> Modified:
>> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
>> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h
>> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h
>>
>> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h?rev=169563&r1=169562&r2=169563&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h (original)
>> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h Thu Dec 6 17:55:34 2012
>> @@ -142,10 +142,12 @@
>> protected:
>> friend class CallEventManager;
>>
>> - CallEvent(const Expr *E, ProgramStateRef state, const LocationContext *lctx)
>> + CallEvent(const Expr *E, const ProgramStateRef &state,
>> + const LocationContext *lctx)
>> : State(state), LCtx(lctx), Origin(E), RefCount(0) {}
>
> FWIW - when passing in to take ownership (which wasn't the case in the
> particular call chain I was looking at in your last review - that one
> just called getPtr()) you could prefer to pass by value and use swap
> to transfer ownership. This will avoid a retain/release in the case of
> passing in a temporary.
>
> (passing things by value and using swap (or move assignment in C++11)
> to take ownership is a nice habit to get into as it becomes more
> common/powerful/useful in C++11 with movable types being a common
> situation (whereas these days optimizing for swappable types in this
> way is a bit less common))
>
> Just a thought, in case this is important to you/this code.
>
> - David
IntrusiveRefCntPtr is already properly move-assignable. These methods don't acquire ownership in general, though...there really are cases where multiple CallEvents or ExplodedNodes may refer to the same ProgramState. There are a few cases, though, where the local variables that feed into these things aren't being used afterwards (or if they come from temporaries).
We probably would see a win just compiling as C++11. Thanks!
Jordan
More information about the cfe-commits
mailing list