r175594 - Replace SVal llvm::cast support to be well-defined.
Jordan Rose
jordan_rose at apple.com
Wed Feb 20 10:50:26 PST 2013
Thanks, David!
Is it all right if I add Optional to clang/Basic/LLVM.h, so that it doesn't have to appear everywhere?
A few comments inline.
On Feb 19, 2013, at 21:52 , David Blaikie <dblaikie at gmail.com> wrote:
> Author: dblaikie
> Date: Tue Feb 19 23:52:05 2013
> New Revision: 175594
>
> URL: http://llvm.org/viewvc/llvm-project?rev=175594&view=rev
> Log:
> Replace SVal llvm::cast support to be well-defined.
>
> See r175462 for another example/more details.
>
> Modified:
> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h
> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h
> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h
> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
> cfe/trunk/lib/StaticAnalyzer/Checkers/ArrayBoundCheckerV2.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/BoolAssignmentChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/BuiltinFunctionChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/CStringChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/DereferenceChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/DivZeroChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/ExprInspectionChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/IdempotentOperationChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSKeychainAPIChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCAtSyncChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCContainersChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/PthreadLockChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/StreamChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/UnixAPIChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/VLASizeChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/Environment.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineC.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCXX.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/MemRegion.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/ProgramState.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/RegionStore.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/SValBuilder.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/SVals.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/SimpleConstraintManager.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/Store.cpp
>
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h?rev=175594&r1=175593&r2=175594&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/SVals.h Tue Feb 19 23:52:05 2013
> @@ -69,6 +69,25 @@ protected:
> public:
> explicit SVal() : Data(0), Kind(0) {}
>
> + template<typename T>
> + T castAs() const {
> + assert(T::isType(*this));
> + T t;
> + SVal& sv = t;
> + sv = *this;
> + return t;
> + }
> +
> + template<typename T>
> + llvm::Optional<T> getAs() const {
> + if (!T::isType(*this))
> + return llvm::Optional<T>();
> + T t;
> + SVal& sv = t;
> + sv = *this;
> + return t;
> + }
Bikeshedding to isKind, instead of isType, since "type" is such an overloaded word in Clang already.
Also, capital variable names, and ampersand on the variable name rather than the type.
I guess Val->SVal::operator=(*this) isn't really cleaner than the reference trick, huh. A bunch of these types didn't have default constructors, though, so I'm wondering if adding T(const SVal &) constructors makes more sense. Eh.
>
> - bool isExpression() {
> + bool isExpression() const {
> return !isa<SymbolData>(getSymbol());
> }
Heh, thanks.
> if (originalRegion != R) {
> if (Optional<SVal> OV = B.getDefaultBinding(R)) {
> - if (const nonloc::LazyCompoundVal *V =
> - dyn_cast<nonloc::LazyCompoundVal>(OV.getPointer()))
> + if (llvm::Optional<nonloc::LazyCompoundVal> V =
> + OV.getPointer()->getAs<nonloc::LazyCompoundVal>())
This is going through another Optional, so you should be able to just use OV->getAs now.
> @@ -1669,9 +1670,8 @@ NonLoc RegionStoreManager::createLazyBin
> // If we already have a lazy binding, and it's for the whole structure,
> // don't create a new lazy binding.
> if (Optional<SVal> V = B.getDefaultBinding(R)) {
> - const nonloc::LazyCompoundVal *LCV =
> - dyn_cast<nonloc::LazyCompoundVal>(V.getPointer());
> - if (LCV) {
> + if (llvm::Optional<nonloc::LazyCompoundVal> LCV =
> + V.getPointer()->getAs<nonloc::LazyCompoundVal>()) {
Ditto.
More information about the cfe-commits
mailing list