aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2008-11-24 02:18:56 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2008-11-24 02:18:56 +0000
commit6613d08a19aa6ce9b6330487f3bfac841d4b8a4d (patch)
tree88def2c7b5eaae7a26d0b4099038f0ea87729615
parent0947b4e6c778ca94bbd0a56548de0b6b5ff1dfc9 (diff)
Add getSize() support for StringRegion.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59930 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Analysis/PathSensitive/MemRegion.h3
-rw-r--r--include/clang/Analysis/PathSensitive/SVals.h4
-rw-r--r--lib/Analysis/RegionStore.cpp5
-rw-r--r--lib/Analysis/SVals.cpp5
4 files changed, 14 insertions, 3 deletions
diff --git a/include/clang/Analysis/PathSensitive/MemRegion.h b/include/clang/Analysis/PathSensitive/MemRegion.h
index 287dd09c2b..e2f1537551 100644
--- a/include/clang/Analysis/PathSensitive/MemRegion.h
+++ b/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/include/clang/Analysis/PathSensitive/SVals.h b/include/clang/Analysis/PathSensitive/SVals.h
index 16322f111f..0bacc863e1 100644
--- a/include/clang/Analysis/PathSensitive/SVals.h
+++ b/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/lib/Analysis/RegionStore.cpp b/lib/Analysis/RegionStore.cpp
index 05d311df89..cdc8b2723d 100644
--- a/lib/Analysis/RegionStore.cpp
+++ b/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/lib/Analysis/SVals.cpp b/lib/Analysis/SVals.cpp
index 764a05fe8f..0210729b46 100644
--- a/lib/Analysis/SVals.cpp
+++ b/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));