diff options
| author | Ted Kremenek <kremenek@apple.com> | 2009-09-03 01:48:03 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2009-09-03 01:48:03 +0000 |
| commit | b117fd91681f0f36fd5ded72e1f5d17f2645def0 (patch) | |
| tree | ed1d3d9628a3ddab445046b1367b1b3257d136c9 /clang/lib/Analysis/GRExprEngineInternalChecks.cpp | |
| parent | f7188325efa1b94a8c43de02d92e4d9967e0a6b1 (diff) | |
| download | bcm5719-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.cpp | 9 |
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)) { |

