https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64294
--- Comment #10 from Mikael Pettersson <mikpelinux at gmail dot com> --- You're invoking undefined behaviour due to overflow in signed integer arithmetic. Running it after compiling with -fsanitize=undefined produces: petite.c:391:28: runtime error: signed integer overflow: 2147483647 * 2 cannot be represented in type 'int' Fixing that in the following crude way: --- petite.c 2014-12-20 16:02:59.786063515 +0100 +++ petite-fixed.c 2014-12-20 16:15:05.030889115 +0100 @@ -388,7 +388,7 @@ free(usects); return 1; } - backbytes = backbytes*2 + oob; + backbytes = (int)((unsigned int)backbytes*2 + (unsigned int)oob); if ( (oob = doubledl(&ssrc, &mydl, buf, bufsz)) == -1 ) { free(usects); return 1; allows the testcase to work at -O2 and -O3.