Safe integer overflows in C++

Piotr Wyderski piotr.wyderski@gmail.com
Thu Apr 14 17:25:00 GMT 2011


Hello,

I'm writing a library in C++ for decimal fixed-point arithmetic. Basically,
any suitable decimal fraction q is scaled by 10^k with k selected in such a
way that q * 10^k is an integral value stored in std::int64_t. This allows me
to perform basic arithmetic operations on such scaled fractions using
integral arithmetic only, which results in extremely fast code. Performance
is of crucial importance here and the values rarely exceed the
capacity of std::int64_t
so I can't use GMP or similar libraries.

However, signed overflows are considered UB in C and C++, so my library
doesn't need to be portable beyond the "sane" platform set -- U2, 2^n encodings
with 32- and 64-bit fundamental types. I know that GCC does a lot to detect
overflow-related errors, as they are mostly bugs. But in this case I
know exactly
what's happening under the hood, so assuming the above caveats, the question
is how to perform overflowing integral arithmetic in GCC more or less
safely, e.g.:

std::int64_t x = ..., y = ...;
std::int64_t z = x + y; // may overflow!

if (overflow) {

    // enter slow correction path

} else {

    // fast path
}

and how to detect that addition/subtraction has overflowed.
Are there any pragmas or built-ins related to the above issue?

As a last resort I can use GCC inline assembly, but since the set of
target platforms is relatively big (x86, x86, SPARC, POWER, Itanium),
I'd rather want to use a semi-portable gnu++0x-based solution.

    Best regards,
    Piotr Wyderski



More information about the Gcc-help mailing list