diff options
-rw-r--r-- | clang/include/clang/Analysis/PathSensitive/MemRegion.h | 3 | ||||
-rw-r--r-- | clang/include/clang/Analysis/PathSensitive/SVals.h | 4 | ||||
-rw-r--r-- | clang/lib/Analysis/RegionStore.cpp | 5 | ||||
-rw-r--r-- | clang/lib/Analysis/SVals.cpp | 5 |
4 files changed, 14 insertions, 3 deletions
diff --git a/clang/include/clang/Analysis/PathSensitive/MemRegion.h b/clang/include/clang/Analysis/PathSensitive/MemRegion.h index 287dd09c2be..e2f15375511 100644 --- a/clang/include/clang/Analysis/PathSensitive/MemRegion.h +++ b/clang/include/clang/Analysis/PathSensitive/MemRegion.h @@ -189,6 +189,9 @@ protected: const MemRegion* superRegion); public: + + const StringLiteral* getStringLiteral() const { return Str; } + QualType getType(ASTContext& C) const { return C.getCanonicalType(Str->getType()); } diff --git a/clang/include/clang/Analysis/PathSensitive/SVals.h b/clang/include/clang/Analysis/PathSensitive/SVals.h index 16322f111f2..0bacc863e14 100644 --- a/clang/include/clang/Analysis/PathSensitive/SVals.h +++ b/clang/include/clang/Analysis/PathSensitive/SVals.h @@ -170,6 +170,10 @@ public: void print(llvm::raw_ostream& Out) const; // Utility methods to create NonLocs. + + static NonLoc MakeVal(BasicValueFactory& BasicVals, unsigned X, + bool isUnsigned); + static NonLoc MakeVal(BasicValueFactory& BasicVals, uint64_t X, QualType T); static NonLoc MakeVal(BasicValueFactory& BasicVals, IntegerLiteral* I); diff --git a/clang/lib/Analysis/RegionStore.cpp b/clang/lib/Analysis/RegionStore.cpp index 05d311df899..cdc8b2723d1 100644 --- a/clang/lib/Analysis/RegionStore.cpp +++ b/clang/lib/Analysis/RegionStore.cpp @@ -272,9 +272,8 @@ SVal RegionStoreManager::getSizeInElements(const GRState* St, } if (const StringRegion* SR = dyn_cast<StringRegion>(R)) { - // FIXME: Unsupported yet. - SR = 0; - return UnknownVal(); + const StringLiteral* Str = SR->getStringLiteral(); + return NonLoc::MakeVal(getBasicVals(), Str->getByteLength(), false); } if (const AnonTypedRegion* ATR = dyn_cast<AnonTypedRegion>(R)) { diff --git a/clang/lib/Analysis/SVals.cpp b/clang/lib/Analysis/SVals.cpp index 764a05fe8f0..0210729b469 100644 --- a/clang/lib/Analysis/SVals.cpp +++ b/clang/lib/Analysis/SVals.cpp @@ -242,6 +242,11 @@ NonLoc Loc::NE(BasicValueFactory& BasicVals, const Loc& R) const { //===----------------------------------------------------------------------===// // Utility methods for constructing Non-Locs. //===----------------------------------------------------------------------===// +NonLoc NonLoc::MakeVal(BasicValueFactory& BasicVals, unsigned X, + bool isUnsigned) { + return nonloc::ConcreteInt(BasicVals.getValue(X, sizeof(unsigned)*8, + isUnsigned)); +} NonLoc NonLoc::MakeVal(BasicValueFactory& BasicVals, uint64_t X, QualType T) { return nonloc::ConcreteInt(BasicVals.getValue(X, T)); |