From de2603ab5ff7d049194fc02fc03992f975441f3f Mon Sep 17 00:00:00 2001 From: Project Nayuki <me@nayuki.io> Date: Tue, 28 Aug 2018 05:08:03 +0000 Subject: [PATCH] Simplified some C code for overflow-safe calculation. --- c/qrcodegen.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/c/qrcodegen.c b/c/qrcodegen.c index cd759c7..715cb78 100644 --- a/c/qrcodegen.c +++ b/c/qrcodegen.c @@ -984,7 +984,7 @@ bool qrcodegen_encodeSegmentsAdvanced(const struct qrcodegen_Segment segs[], siz testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int version) { assert(segs != NULL || len == 0); assert(qrcodegen_VERSION_MIN <= version && version <= qrcodegen_VERSION_MAX); - int result = 0; + long result = 0; for (size_t i = 0; i < len; i++) { int numChars = segs[i].numChars; int bitLength = segs[i].bitLength; @@ -995,13 +995,12 @@ testable int getTotalBits(const struct qrcodegen_Segment segs[], size_t len, int // Fail if segment length value doesn't fit in the length field's bit-width if (numChars >= (1L << ccbits)) return -1; - long temp = 4L + ccbits + bitLength; - if (temp > INT16_MAX - result) + result += 4L + ccbits + bitLength; + if (result > INT16_MAX) return -1; - result += temp; } assert(0 <= result && result <= INT16_MAX); - return result; + return (int)result; }