From 0fbdd57835c121bfcd67330db1ae82c982ccd644 Mon Sep 17 00:00:00 2001 From: "Daniel J. Hofmann" Date: Fri, 22 Jan 2016 19:36:10 +0100 Subject: [PATCH] Quickfixes polyline encoder's undefined behavior via left-shifting negative numbers --- src/engine/polyline_compressor.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/engine/polyline_compressor.cpp b/src/engine/polyline_compressor.cpp index 2af6735a3..61e4f2c8b 100644 --- a/src/engine/polyline_compressor.cpp +++ b/src/engine/polyline_compressor.cpp @@ -1,6 +1,7 @@ #include "engine/polyline_compressor.hpp" #include +#include namespace osrm { @@ -27,13 +28,22 @@ std::string encode(int number_to_encode) std::string encode(std::vector &numbers) { std::string output; - const auto end = numbers.size(); - for (std::size_t i = 0; i < end; ++i) + for (auto &number : numbers) { - numbers[i] <<= 1; - if (numbers[i] < 0) + bool isNegative = number < 0; + + if (isNegative) { - numbers[i] = ~(numbers[i]); + const unsigned binary = std::llabs(number); + const unsigned twos = (~binary) + 1u; + number = twos; + } + + number <<= 1u; + + if (isNegative) + { + number = ~number; } } for (const int number : numbers)