AK: Disallow constness laundering in RefPtr and NonnullRefPtr

Until now, it was possible to assign a RP<T const> or NNRP<T const>
to RP<T> or NNRP<T>. This meant that the constness of the T was lost.

We had a lot of code that relied on this sloppiness, and by the time
you see this commit, I hopefully found and fixed all of it. :^)
This commit is contained in:
Andreas Kling 2023-02-21 00:25:40 +01:00
commit 3c7a0ef1ac
Notes: sideshowbarker 2024-07-16 23:55:37 +09:00
2 changed files with 20 additions and 20 deletions

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
* Copyright (c) 2018-2023, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@ -47,16 +47,16 @@ public:
enum AdoptTag { Adopt };
ALWAYS_INLINE NonnullRefPtr(T const& object)
: m_ptr(const_cast<T*>(&object))
ALWAYS_INLINE NonnullRefPtr(T& object)
: m_ptr(&object)
{
m_ptr->ref();
}
template<typename U>
ALWAYS_INLINE NonnullRefPtr(U const& object)
ALWAYS_INLINE NonnullRefPtr(U& object)
requires(IsConvertible<U*, T*>)
: m_ptr(const_cast<T*>(static_cast<T const*>(&object)))
: m_ptr(static_cast<T*>(&object))
{
m_ptr->ref();
}
@ -79,7 +79,7 @@ public:
}
ALWAYS_INLINE NonnullRefPtr(NonnullRefPtr const& other)
: m_ptr(const_cast<T*>(other.ptr()))
: m_ptr(other.ptr())
{
m_ptr->ref();
}
@ -87,7 +87,7 @@ public:
template<typename U>
ALWAYS_INLINE NonnullRefPtr(NonnullRefPtr<U> const& other)
requires(IsConvertible<U*, T*>)
: m_ptr(const_cast<T*>(static_cast<T const*>(other.ptr())))
: m_ptr(static_cast<T*>(other.ptr()))
{
m_ptr->ref();
}
@ -145,7 +145,7 @@ public:
return *this;
}
NonnullRefPtr& operator=(T const& object)
NonnullRefPtr& operator=(T& object)
{
NonnullRefPtr tmp { object };
swap(tmp);