summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis/GRExprEngineInternalChecks.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-09-03 01:48:03 +0000
committerTed Kremenek <kremenek@apple.com>2009-09-03 01:48:03 +0000
commitb117fd91681f0f36fd5ded72e1f5d17f2645def0 (patch)
treeed1d3d9628a3ddab445046b1367b1b3257d136c9 /clang/lib/Analysis/GRExprEngineInternalChecks.cpp
parentf7188325efa1b94a8c43de02d92e4d9967e0a6b1 (diff)
downloadbcm5719-llvm-b117fd91681f0f36fd5ded72e1f5d17f2645def0.tar.gz
bcm5719-llvm-b117fd91681f0f36fd5ded72e1f5d17f2645def0.zip
Fix regression introduced in r80786 and reported in PR 4867. We should use
'dyn_cast' instead of 'cast' as the denominator value could be UnknownVal (and is not guaranteed to be a DefinedVal). llvm-svn: 80869
Diffstat (limited to 'clang/lib/Analysis/GRExprEngineInternalChecks.cpp')
-rw-r--r--clang/lib/Analysis/GRExprEngineInternalChecks.cpp9
1 files changed, 7 insertions, 2 deletions
diff --git a/clang/lib/Analysis/GRExprEngineInternalChecks.cpp b/clang/lib/Analysis/GRExprEngineInternalChecks.cpp
index 45c3079d06a..ab19a6a94a3 100644
--- a/clang/lib/Analysis/GRExprEngineInternalChecks.cpp
+++ b/clang/lib/Analysis/GRExprEngineInternalChecks.cpp
@@ -716,11 +716,16 @@ void CheckBadDiv::PreVisitBinaryOperator(CheckerContext &C,
return;
}
+ // Handle the case where 'Denom' is UnknownVal.
+ const DefinedSVal *DV = dyn_cast<DefinedSVal>(&Denom);
+
+ if (!DV)
+ return;
+
// Check for divide by zero.
ConstraintManager &CM = C.getConstraintManager();
const GRState *stateNotZero, *stateZero;
- llvm::tie(stateNotZero, stateZero) = CM.AssumeDual(C.getState(),
- cast<DefinedSVal>(Denom));
+ llvm::tie(stateNotZero, stateZero) = CM.AssumeDual(C.getState(), *DV);
if (stateZero && !stateNotZero) {
if (ExplodedNode *N = C.GenerateNode(B, stateZero, true)) {
OpenPOWER on IntegriCloud