diff options
author | Ted Kremenek <kremenek@apple.com> | 2011-09-30 03:51:54 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2011-09-30 03:51:54 +0000 |
commit | e4c6675cccbaac991843def43072687bca50d989 (patch) | |
tree | 50b9daa1acb7af1db09ff6428c0abdf3044ca71b /lib/StaticAnalyzer/Core/CoreEngine.cpp | |
parent | 0658879cc98e8cb918e2f349a59c901f74f0de11 (diff) |
Fix crash when analyzing C++ code involving constant enums and switch statements (<rdar://problem/10202899>).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140844 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/StaticAnalyzer/Core/CoreEngine.cpp')
-rw-r--r-- | lib/StaticAnalyzer/Core/CoreEngine.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/StaticAnalyzer/Core/CoreEngine.cpp b/lib/StaticAnalyzer/Core/CoreEngine.cpp index 20b86a8fd3..2511ca778d 100644 --- a/lib/StaticAnalyzer/Core/CoreEngine.cpp +++ b/lib/StaticAnalyzer/Core/CoreEngine.cpp @@ -697,13 +697,18 @@ ExplodedNode* SwitchNodeBuilder::generateDefaultCaseNode(const ProgramState *St, bool isSink) { // Get the block for the default case. - assert (Src->succ_rbegin() != Src->succ_rend()); + assert(Src->succ_rbegin() != Src->succ_rend()); CFGBlock *DefaultBlock = *Src->succ_rbegin(); + // Sanity check for default blocks that are unreachable and not caught + // by earlier stages. + if (!DefaultBlock) + return NULL; + bool IsNew; ExplodedNode *Succ = Eng.G->getNode(BlockEdge(Src, DefaultBlock, - Pred->getLocationContext()), St, &IsNew); + Pred->getLocationContext()), St, &IsNew); Succ->addPredecessor(Pred, *Eng.G); if (IsNew) { |