Remove folly::Future conversion constructor
Summary: This constructor is unsafe. The check it uses before doing the comparison isn't a safe enough check to see if the cast is valid. For example, this is broken in the presence of multiple inheritance because it doesn't adjust the pointer offset to the correct vtable. e.g. struct A { virtual ~A() {}; virtual void doSomething() = 0; }; struct B { virtual ~B() {} virtual void doSomethingElse() = 0; }; struct C : public B, public A { virtual ~C() {} void doSomething() override { std::cout << "Something!" << std::endl; } void doSomethingElse() override { std::cout << "Something Else!" << std::endl; } }; int main (int argc, char **argv) { auto c = folly::makeFuture<std::shared_ptr<C>>(std::make_shared<C>()); folly::Future<std::shared_ptr<A>> a = std::move(c); a.get()->doSomething(); return 0; } This code will print "Something else!" when run. Reviewed By: siyengar Differential Revision: D3679673 fbshipit-source-id: dcbf40ca82d458f17ee11191591f8b8daf58c919
Showing
Please register or sign in to comment