]> granicus.if.org Git - clang/commitdiff
When retrieving an ElementRegion, if its super region is a StringRegion,
authorZhongxing Xu <xuzhongxing@gmail.com>
Mon, 11 May 2009 14:23:36 +0000 (14:23 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Mon, 11 May 2009 14:23:36 +0000 (14:23 +0000)
retrieve the string value.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71430 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/RegionStore.cpp

index 84c8195ecb139171a6fb0d5136790478dfd27dea..9d29a90b3e768524ab6ab73edd80c91b06419181 100644 (file)
@@ -736,6 +736,24 @@ SVal RegionStoreManager::Retrieve(const GRState* St, Loc L, QualType T) {
   if (state.contains<RegionKills>(R))
     return UnknownVal();
 
+  // Check if the region is an element region of a string literal.
+  if (const ElementRegion *ER = dyn_cast<ElementRegion>(R)) {
+    if (const StringRegion *StrR=dyn_cast<StringRegion>(ER->getSuperRegion())) {
+      const StringLiteral *Str = StrR->getStringLiteral();
+      SVal Idx = ER->getIndex();
+      if (nonloc::ConcreteInt *CI = dyn_cast<nonloc::ConcreteInt>(&Idx)) {
+        int64_t i = CI->getValue().getSExtValue();
+        char c;
+        if (i == Str->getByteLength())
+          c = '\0';
+        else
+          c = Str->getStrData()[i];
+        const llvm::APSInt &V = getBasicVals().getValue(c, getContext().CharTy);
+        return nonloc::ConcreteInt(V);
+      }
+    }
+  }
+
   // If the region is an element or field, it may have a default value.
   if (isa<ElementRegion>(R) || isa<FieldRegion>(R)) {
     const MemRegion* SuperR = cast<SubRegion>(R)->getSuperRegion();