Bug 179405
Summary: | Avoid using reinterpret_cast in WeakPtr downcasting | ||
---|---|---|---|
Product: | WebKit | Reporter: | Jiewen Tan <jiewen_tan> |
Component: | Web Template Framework | Assignee: | Nobody <webkit-unassigned> |
Status: | NEW | ||
Severity: | Normal | CC: | cdumez, ggaren, jiewen_tan, koivisto, rniwa |
Priority: | P2 | ||
Version: | WebKit Nightly Build | ||
Hardware: | Unspecified | ||
OS: | Unspecified |
Jiewen Tan
We should probably avoid using reinterpret_cast in WeakPtr downcasting as it might point to a wrong pointer if multiple inheritance is involved.
Examples:
class Base {
public:
virtual ~Base()
{
}
int foo()
{
return 0;
}
auto& weakPtrFactory() { return m_weakPtrFactory; }
private:
WeakPtrFactory<Base> m_weakPtrFactory;
};
class ExtraBase {
public:
virtual ~ExtraBase() { }
int someExtraData { 1 };
};
class Multi : public ExtraBase, public Base {
public:
int foo()
{
return 1;
}
};
TEST(WTF_WeakPtr, MultiInheritance)
{
Multi object;
Multi* multiPtr = &object;
Base* basePtr = static_cast<Base*>(&object);
EXPECT_NE((void*)basePtr, (void*)multiPtr);
WeakPtr<Base> baseWeakPtr = object.weakPtrFactory().createWeakPtr(object);
WeakPtr<Multi> multiWeakPtr = makeWeakPtr(object);
EXPECT_NE((void*)baseWeakPtr.get(), (void*)multiWeakPtr.get());
}
One can copy and paste the above example into API test of WeakPtr and run the test. The result is:
jwtan$ run-api-tests WTF_WeakPtr.MultiInheritance
Running build-api-tests
FAIL WTF_WeakPtr.MultiInheritance
/Users/jwtan/Documents/Source/OpenSource/Tools/TestWebKitAPI/Tests/WTF/WeakPtr.cpp:280
Expected: ((void*)baseWeakPtr.get()) != ((void*)multiWeakPtr.get()), actual: 0x7ffee36e7218 vs 0x7ffee36e7218
Tests that failed:
WTF_WeakPtr.MultiInheritance
Attachments | ||
---|---|---|
Add attachment proposed patch, testcase, etc. |