Fix undefined behaviour in float<->int conversion
Summary: This change fixes a case of undefined behaviour when converting between floating point and integral values using folly::to<>. Undefined behaviour is triggered when a floating point value is cast into an integral value that cannot represent the source value. This happens in both cases, float-to-int and int-to-float conversion, with folly::to<> due to the check for loss of precision. The new test cases expose the undefined behaviour. The fix is a series of extra checks, the majority of which will only kick in if the value to be converted is close to the boundary of the range of the target type. These checks ensure that the conversion will only be performed if the source value is within the range representable by the target type. The extra checks /will/ make the code slower. However, a later change in this series, which refactors the implementation of folly::to<>, will restore some of the performance. Reviewed By: yfeldblum Differential Revision: D3433757 fbshipit-source-id: 43495d18f831206ef48f74332663263d789a4f8a
Showing
Please register or sign in to comment