Delete functions that return a pointer when the dynamic object is a rvalue.
authorNick Terrell <terrelln@fb.com>
Fri, 24 Jul 2015 00:46:30 +0000 (17:46 -0700)
committerfacebook-github-bot-4 <folly-bot@fb.com>
Fri, 24 Jul 2015 01:22:10 +0000 (18:22 -0700)
commit8e48b79db72939d8ded148400c7f0572c6882ef9
tree04739c17dd94e3a6757a746a11aad2b68c751f4e
parent5532f19f7b604a9b12c79a1d0a4fe3b0ff74f3d1
Delete functions that return a pointer when the dynamic object is a rvalue.

Summary: This diff is not yet complete, I want to see the contbuild before I change the
functions that return references to member functions.

It is unsafe to return a pointer when the dynamic object is a rvalue, because if
the pointer escapes the expression after the object is destroyed, we go into
segfault / undefined behavior land.
I have deleted these overloads.  The amount of valid code that is now disallowed
is minimal.  The only valid case I can think of is returing a pointer and
passing it to a function in the same expression that does not save the pointer.
However, this case is also dangerous, because if the function you pass it to
decides to save the pointer for later, we are in trouble, e.g.

  save_ptr(dynamic("str").c_str())

Since there are simple workarounds (naming the object), I think that is a small
price to pay for the greatly increased safety.

The next step is to overload all members that return a reference to a member
to move the member out if the dynamic is a rvalue:

  const dynamic& at(dynamic const&) const&;
        dynamic& at(dynamic const&)      &;
        dynamic  at(dynamic const&)      &&;  // Move out

I also need to go over the code more carefully to make sure that nothing went
wrong.

Reviewed By: @marcinpe

Differential Revision: D2257914
folly/dynamic-inl.h
folly/dynamic.cpp
folly/dynamic.h