# [PATCH 2/2] os: Work around integer overflow in TimerSet.

Cyril Brulebois kibi at debian.org
Sun Mar 6 12:57:05 PST 2011

```Hi,

Fernando Carrijo <fcarrijo at freedesktop.org> (06/03/2011):
> I found this, buried in Section 6.2.5 (9) of the C Standard:
>
>     A computation involving unsigned operands can never overflow,
>     because a result that cannot be represented by the resulting
>     unsigned integer type is reduced modulo the number that is one
>     greater than the largest value that can be represented by the
>     resulting type.
>
> So, I presume, something isn't quite right in this series.

I suggest you try that yourself:
,---
#include <stdio.h>
#include <X11/Xmd.h>

int main(void) {
CARD32 a = (CARD32)(~0)/5*4;
CARD32 b = (CARD32)(~0)/5*2;
CARD32 c = (CARD32)(~0)/5*1;
CARD32 s;
printf("max : %u\n", (CARD32)(~0));
printf("a   : %u\n", a);
printf("b   : %u\n", b);
printf("c   : %u\n", c);
s=(a+b>a) ? (a+b) : ((CARD32)(~0));
printf("sum1: %u\n", s);
printf("sum2: %u\n", (a+b));
a+=b;
printf("+=  : %u\n", a);
return 0;
}
`---

Getting this:
,---
\$ gcc bar.c && ./a.out
max : 4294967295
a   : 3435973836
b   : 1717986918
c   : 858993459
sum1: 4294967295
sum2: 858993458
+=  : 858993458
`---

See? It overflows, with a+b == c, as seen in sum2 or +=. And the
“expected” result in sum1.

KiBi.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.x.org/archives/xorg-devel/attachments/20110306/3cf604bd/attachment.pgp>
```

More information about the xorg-devel mailing list