Tests: Stop invoking UB in AK::NeverDestroyed's tests

Instead of attempting a stack use-after-free by reading an out-of-scope
object's data member, let's keep a flag that checks if the destructor
had been called in the outer scope.
This commit is contained in:
Daniel Bertalan 2024-06-05 23:52:33 +02:00
parent edb10aa17a
commit 6c4e0e8549

View file

@ -44,20 +44,27 @@ TEST_CASE(should_construct_by_move)
EXPECT_EQ(1, n->num_moves);
}
NO_SANITIZE_ADDRESS static void should_not_destroy()
{
Counter* c = nullptr;
struct DestructorChecker {
DestructorChecker(bool& destroyed)
: m_destroyed(destroyed)
{
AK::NeverDestroyed<Counter> n {};
// note: explicit stack-use-after-scope
c = &n.get();
}
EXPECT_EQ(0, c->num_destroys);
}
~DestructorChecker()
{
m_destroyed = true;
}
bool& m_destroyed;
};
TEST_CASE(should_not_destroy)
{
should_not_destroy();
bool destroyed = false;
{
AK::NeverDestroyed<DestructorChecker> n(destroyed);
}
EXPECT(!destroyed);
}
TEST_CASE(should_provide_dereference_operator)