From fe550f38669fe0f488926c1ef0feb6c101f586d6 Mon Sep 17 00:00:00 2001 From: Eli Fidler Date: Tue, 31 May 2016 11:51:37 -0400 Subject: [PATCH] avoid array index out-of-bounds UBSAN gave "runtime error: index 13 out of bounds for type 'const uint32_t [10]'" --- include/rapidjson/internal/dtoa.h | 3 ++- test/unittest/dtoatest.cpp | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/include/rapidjson/internal/dtoa.h b/include/rapidjson/internal/dtoa.h index bc45496..8d6350e 100644 --- a/include/rapidjson/internal/dtoa.h +++ b/include/rapidjson/internal/dtoa.h @@ -102,7 +102,8 @@ inline void DigitGen(const DiyFp& W, const DiyFp& Mp, uint64_t delta, char* buff kappa--; if (p2 < delta) { *K += kappa; - GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * kPow10[-static_cast(kappa)]); + int index = -static_cast(kappa); + GrisuRound(buffer, *len, delta, p2, one.f, wp_w.f * (index < 9 ? kPow10[-static_cast(kappa)] : 0)); return; } } diff --git a/test/unittest/dtoatest.cpp b/test/unittest/dtoatest.cpp index fe28271..afd76eb 100644 --- a/test/unittest/dtoatest.cpp +++ b/test/unittest/dtoatest.cpp @@ -37,6 +37,7 @@ TEST(dtoa, normal) { TEST_DTOA(1.2345678, "1.2345678"); TEST_DTOA(0.123456789012, "0.123456789012"); TEST_DTOA(1234567.8, "1234567.8"); + TEST_DTOA(-79.39773355813419, "-79.39773355813419"); TEST_DTOA(0.000001, "0.000001"); TEST_DTOA(0.0000001, "1e-7"); TEST_DTOA(1e30, "1e30");