summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-03-23 15:42:58 +0000
committerTed Kremenek <kremenek@apple.com>2009-03-23 15:42:58 +0000
commitc7fef2ad530f6220b29d6d3133d6b6ec50adebb5 (patch)
tree2de3233b490626c3058220d884a14a848bf86226 /clang/lib
parent4a683478d5dcac60111788c73e764f310435d90a (diff)
downloadbcm5719-llvm-c7fef2ad530f6220b29d6d3133d6b6ec50adebb5.tar.gz
bcm5719-llvm-c7fef2ad530f6220b29d6d3133d6b6ec50adebb5.zip
analyzer: Fix embarrassing regression in BasicStore when invalidating struct
values passed-by-reference to unknown functions. llvm-svn: 67519
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Analysis/BasicStore.cpp4
-rw-r--r--clang/lib/Analysis/SymbolManager.cpp4
2 files changed, 8 insertions, 0 deletions
diff --git a/clang/lib/Analysis/BasicStore.cpp b/clang/lib/Analysis/BasicStore.cpp
index b883f880614..01260480d19 100644
--- a/clang/lib/Analysis/BasicStore.cpp
+++ b/clang/lib/Analysis/BasicStore.cpp
@@ -525,6 +525,10 @@ Store BasicStoreManager::getInitialStore() {
// Punt on static variables for now.
if (VD->getStorageClass() == VarDecl::Static)
continue;
+
+ // Only handle simple types that we can symbolicate.
+ if (!SymbolManager::canSymbolicate(VD->getType()))
+ continue;
// Initialize globals and parameters to symbolic values.
// Initialize local variables to undefined.
diff --git a/clang/lib/Analysis/SymbolManager.cpp b/clang/lib/Analysis/SymbolManager.cpp
index 4d101f186bd..efc7cd3b86f 100644
--- a/clang/lib/Analysis/SymbolManager.cpp
+++ b/clang/lib/Analysis/SymbolManager.cpp
@@ -94,6 +94,10 @@ QualType SymbolRegionRValue::getType(ASTContext& C) const {
SymbolManager::~SymbolManager() {}
+bool SymbolManager::canSymbolicate(QualType T) {
+ return Loc::IsLocType(T) || T->isIntegerType();
+}
+
void SymbolReaper::markLive(SymbolRef sym) {
TheLiving = F.Add(TheLiving, sym);
TheDead = F.Remove(TheDead, sym);
OpenPOWER on IntegriCloud