diff options
author | Ted Kremenek <kremenek@apple.com> | 2009-08-24 22:47:34 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2009-08-24 22:47:34 +0000 |
commit | d6cfbafd3b920839c37668a08a46f410634e8025 (patch) | |
tree | d57596c636fe23e0c0561cecc37d07ce5531126a /clang/lib/Analysis/GRExprEngineInternalChecks.cpp | |
parent | d64be8201d949e5850cb675b8889398e5bd701d0 (diff) | |
download | bcm5719-llvm-d6cfbafd3b920839c37668a08a46f410634e8025.tar.gz bcm5719-llvm-d6cfbafd3b920839c37668a08a46f410634e8025.zip |
ConstraintManager::AssumeDual now accepts a 'DefinedSVal' instead of 'SVal' for
the condition. This eliminates a source of bugs where the client doesn't
correctly reason about undefined or unknown values. This fixes PR 4759.
llvm-svn: 79952
Diffstat (limited to 'clang/lib/Analysis/GRExprEngineInternalChecks.cpp')
-rw-r--r-- | clang/lib/Analysis/GRExprEngineInternalChecks.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/clang/lib/Analysis/GRExprEngineInternalChecks.cpp b/clang/lib/Analysis/GRExprEngineInternalChecks.cpp index d22f276a55c..1b2fd1cb9fb 100644 --- a/clang/lib/Analysis/GRExprEngineInternalChecks.cpp +++ b/clang/lib/Analysis/GRExprEngineInternalChecks.cpp @@ -575,10 +575,15 @@ public: if (!Att->isNonNull(idx)) continue; + const SVal &V = state->getSVal(*I); + const DefinedSVal *DV = dyn_cast<DefinedSVal>(&V); + + if (!DV) + continue; + ConstraintManager &CM = C.getConstraintManager(); const GRState *stateNotNull, *stateNull; - llvm::tie(stateNotNull, stateNull) = CM.AssumeDual(state, - state->getSVal(*I)); + llvm::tie(stateNotNull, stateNull) = CM.AssumeDual(state, *DV); if (stateNull && !stateNotNull) { // Generate an error node. Check for a null node in case |