mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-23 13:50:11 +00:00
[analyzer] Fix false positive in use-after-move checker
Differential Revision: https://reviews.llvm.org/D131525
This commit is contained in:
parent
5110eb8b67
commit
c74a204826
@ -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();
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user