[webkit-dev] PSA: String shouldn't be a member of a ThreadSafeRefCounted class

Ryosuke Niwa rniwa at webkit.org
Fri Feb 23 23:45:21 PST 2018

Hi all,

This is a remainder that our *String class is NOT thread safe*, and should
NOT be used inside an object shared across multiple threads. In particular,
it's not necessarily safe to have it as a member of ThreadSafeRefCounted
class, which can be *accessed* from multiple threads.

Let's consider the following example.

class A : public ThreadSafeRefCounted<A> {
        A(const String& name)
            : m_name(name)
        { }
        String name() { return m_name.isolatedCopy(); }

        String m_name;

This code is NOT thread safe depending on how name() is used.

For example, if it's ever inserted or looked up in a hash table as the key,
or if it's ever converted into an AtomicString, then it would lead to
memory corruption. This is because String::hash() would mutate
m_hashAndFlags member variable without any lock, and isolatedCopy() doesn't
make a copy if there is exactly one reference to a given StringImpl (String
is basically just a RefPtr of StringImpl).

- R. Niwa
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-dev/attachments/20180223/6b87ff7b/attachment.html>

More information about the webkit-dev mailing list