forked from OSchip/llvm-project
Handle symbolicating a reference in an initializer expression that we don't understand.
llvm-svn: 154084
This commit is contained in:
parent
00fa5968cb
commit
34ac1cf3cd
|
|
@ -375,7 +375,12 @@ void ExprEngine::VisitDeclStmt(const DeclStmt *DS, ExplodedNode *Pred,
|
||||||
// Recover some path-sensitivity if a scalar value evaluated to
|
// Recover some path-sensitivity if a scalar value evaluated to
|
||||||
// UnknownVal.
|
// UnknownVal.
|
||||||
if (InitVal.isUnknown()) {
|
if (InitVal.isUnknown()) {
|
||||||
InitVal = svalBuilder.getConjuredSymbolVal(NULL, InitEx, LC,
|
QualType Ty = InitEx->getType();
|
||||||
|
if (InitEx->isLValue()) {
|
||||||
|
Ty = getContext().getPointerType(Ty);
|
||||||
|
}
|
||||||
|
|
||||||
|
InitVal = svalBuilder.getConjuredSymbolVal(NULL, InitEx, LC, Ty,
|
||||||
currentBuilderContext->getCurrentBlockCount());
|
currentBuilderContext->getCurrentBlockCount());
|
||||||
}
|
}
|
||||||
B.takeNodes(N);
|
B.takeNodes(N);
|
||||||
|
|
|
||||||
|
|
@ -568,3 +568,13 @@ struct PR11146::Entry {
|
||||||
void PR11146::baz() {
|
void PR11146::baz() {
|
||||||
(void) &Entry::x;
|
(void) &Entry::x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test symbolicating a reference. In this example, the
|
||||||
|
// analyzer (originally) didn't know how to handle x[index - index2],
|
||||||
|
// returning an UnknownVal. The conjured symbol wasn't a location,
|
||||||
|
// and would result in a crash.
|
||||||
|
void rdar10924675(unsigned short x[], int index, int index2) {
|
||||||
|
unsigned short &y = x[index - index2];
|
||||||
|
if (y == 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue