[analyzer] Fix false positive in use-after-move checker

Differential Revision: https://reviews.llvm.org/D131525
This commit is contained in:
malavikasamak 2022-08-09 17:25:19 -07:00
parent 5110eb8b67
commit c74a204826
2 changed files with 26 additions and 4 deletions

View File

@ -618,10 +618,6 @@ void MoveChecker::checkPreCall(const CallEvent &Call, CheckerContext &C) const {
if (!IC)
return;
// Calling a destructor on a moved object is fine.
if (isa<CXXDestructorCall>(IC))
return;
const MemRegion *ThisRegion = IC->getCXXThisVal().getAsRegion();
if (!ThisRegion)
return;
@ -631,6 +627,10 @@ void MoveChecker::checkPreCall(const CallEvent &Call, CheckerContext &C) const {
if (!MethodDecl)
return;
// Calling a destructor on a moved object is fine.
if (isa<CXXDestructorDecl>(MethodDecl))
return;
// We want to investigate the whole object, not only sub-object of a parent
// class in which the encountered method defined.
ThisRegion = ThisRegion->getMostDerivedObjectRegion();

View File

@ -900,6 +900,28 @@ void checkMoreLoopZombies4(bool flag) {
}
}
void checkExplicitDestructorCalls() {
// The below code segments invoke the destructor twice (explicit and
// implicit). While this is not a desired code behavior, it is
// not the use-after-move checker's responsibility to issue such a warning.
{
B* b = new B;
B a = std::move(*b);
b->~B(); // no-warning
delete b;
}
{
B a, b;
new (&a) B(reinterpret_cast<B &&>(b));
(&b)->~B(); // no-warning
}
{
B b;
B a = std::move(b);
b.~B(); // no-warning
}
}
struct MoveOnlyWithDestructor {
MoveOnlyWithDestructor();
~MoveOnlyWithDestructor();