From a86f09a1f72892fe91791200ae2bb4aeb2da4b13 Mon Sep 17 00:00:00 2001 From: "Daniel J. Hofmann" Date: Mon, 21 Mar 2016 15:37:18 +0100 Subject: [PATCH] Makes switching between floating and fixed coordinates safe wrt. overflows --- include/util/coordinate.hpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/include/util/coordinate.hpp b/include/util/coordinate.hpp index 39eb02f3f..e0cf88c47 100644 --- a/include/util/coordinate.hpp +++ b/include/util/coordinate.hpp @@ -30,6 +30,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "util/strong_typedef.hpp" +#include + #include //for std::ostream #include #include @@ -50,22 +52,30 @@ OSRM_STRONG_TYPEDEF(double, FloatLongitude) inline FixedLatitude toFixed(const FloatLatitude floating) { - return FixedLatitude(static_cast(floating) * COORDINATE_PRECISION); + const auto latitude = static_cast(floating); + const auto fixed = boost::numeric_cast(latitude * COORDINATE_PRECISION); + return FixedLatitude(fixed); } inline FixedLongitude toFixed(const FloatLongitude floating) { - return FixedLongitude(static_cast(floating) * COORDINATE_PRECISION); + const auto longitude = static_cast(floating); + const auto fixed = boost::numeric_cast(longitude * COORDINATE_PRECISION); + return FixedLongitude(fixed); } inline FloatLatitude toFloating(const FixedLatitude fixed) { - return FloatLatitude(static_cast(fixed) / COORDINATE_PRECISION); + const auto latitude = static_cast(fixed); + const auto floating = boost::numeric_cast(latitude / COORDINATE_PRECISION); + return FloatLatitude(floating); } inline FloatLongitude toFloating(const FixedLongitude fixed) { - return FloatLongitude(static_cast(fixed) / COORDINATE_PRECISION); + const auto longitude = static_cast(fixed); + const auto floating = boost::numeric_cast(longitude / COORDINATE_PRECISION); + return FloatLongitude(floating); } // Coordinate encoded as longitude, latitude