[analyzer] LoopWidening: fix crash by avoiding aliased references invalidation
Summary: LoopWidening is invalidating references coming from type aliases which lead to a crash. Patch by Abbas Sabra! Differential Revision: https://reviews.llvm.org/D80669
This commit is contained in:
parent
7117066bd6
commit
29353e69d2
|
@ -67,8 +67,10 @@ ProgramStateRef getWidenedLoopState(ProgramStateRef PrevState,
|
|||
}
|
||||
|
||||
// References should not be invalidated.
|
||||
auto Matches = match(findAll(stmt(hasDescendant(varDecl(hasType(referenceType())).bind(MatchRef)))),
|
||||
*LCtx->getDecl()->getBody(), ASTCtx);
|
||||
auto Matches = match(
|
||||
findAll(stmt(hasDescendant(
|
||||
varDecl(hasType(hasCanonicalType(referenceType()))).bind(MatchRef)))),
|
||||
*LCtx->getDecl()->getBody(), ASTCtx);
|
||||
for (BoundNodes Match : Matches) {
|
||||
const VarDecl *VD = Match.getNodeAs<VarDecl>(MatchRef);
|
||||
assert(VD);
|
||||
|
|
|
@ -12,3 +12,11 @@ void invalid_type_region_access() {
|
|||
for (int i = 0; i < 10; ++i) { }
|
||||
clang_analyzer_eval(&x != 0); // expected-warning{{TRUE}}
|
||||
} // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
|
||||
|
||||
using AR = const A &;
|
||||
void invalid_type_alias_region_access() {
|
||||
AR x = B();
|
||||
for (int i = 0; i < 10; ++i) {
|
||||
}
|
||||
clang_analyzer_eval(&x != 0); // expected-warning{{TRUE}}
|
||||
} // expected-warning@-1{{reference cannot be bound to dereferenced null pointer in well-defined C++ code; comparison may be assumed to always evaluate to true}}
|
||||
|
|
Loading…
Reference in New Issue