forked from OSchip/llvm-project
Fix crash when analyzing C++ code involving constant enums and switch statements (<rdar://problem/10202899>).
llvm-svn: 140844
This commit is contained in:
parent
753406221b
commit
afedc07a9b
|
@ -301,7 +301,10 @@ public:
|
|||
class BlockEdge : public ProgramPoint {
|
||||
public:
|
||||
BlockEdge(const CFGBlock *B1, const CFGBlock *B2, const LocationContext *L)
|
||||
: ProgramPoint(B1, B2, BlockEdgeKind, L) {}
|
||||
: ProgramPoint(B1, B2, BlockEdgeKind, L) {
|
||||
assert(B1 && "BlockEdge: source block must be non-null");
|
||||
assert(B2 && "BlockEdge: destination block must be non-null");
|
||||
}
|
||||
|
||||
const CFGBlock *getSrc() const {
|
||||
return static_cast<const CFGBlock*>(getData1());
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -441,3 +441,29 @@ int rdar9948787_positive() {
|
|||
return 0;
|
||||
}
|
||||
|
||||
// Regression test against global constants and switches.
|
||||
enum rdar10202899_ValT { rdar10202899_ValTA, rdar10202899_ValTB, rdar10202899_ValTC };
|
||||
const rdar10202899_ValT val = rdar10202899_ValTA;
|
||||
void rdar10202899_test1() {
|
||||
switch (val) {
|
||||
case rdar10202899_ValTA: {}
|
||||
};
|
||||
}
|
||||
|
||||
void rdar10202899_test2() {
|
||||
if (val == rdar10202899_ValTA)
|
||||
return;
|
||||
int *p = 0;
|
||||
*p = 0xDEADBEEF;
|
||||
}
|
||||
|
||||
void rdar10202899_test3() {
|
||||
switch (val) {
|
||||
case rdar10202899_ValTA: return;
|
||||
default: ;
|
||||
};
|
||||
int *p = 0;
|
||||
*p = 0xDEADBEEF;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue