mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-22 09:21:57 -05:00
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:
parent
edb10aa17a
commit
6c4e0e8549
1 changed files with 16 additions and 9 deletions
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue