Re: Safe integer overflows in C++

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Piotr Wyderski <piotr.wyderski@xxxxxxxxx> writes:

> 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.

You could consider using unsigned types.

Or, restricting yourself to gcc, the simplest option would to use the
-fwrapv option.  With -fwrapv gcc defines signed overflow to wrap using
twos-complement arithmetic.  That will let you reliably detect overflow.

Without using -fwrapv or -fno-strict-overflow, there is no way in gcc to
reliably detect signed overflow after it occurs.  The only thing you can
do is check before the operation whether it will occur.

Ian


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux