EXAMPLE An example of undefined behavior is the behavior on integer overflow. C11dr §3.4.3 3
int overflow is undefined behavior, but does that apply to the following which exists the loop, and does not use the the side effect of the now out-of-scope i? In particular, does this Postfix increment spec help?
... The value computation of the result is sequenced before the side effect of updating the stored value of the operand. ... §6.5.2.4 2
Compiles without warnings with well-enabled C11
#include <limits.h>
#include <stdio.h>
int main(void) {
// Specified behavior when `i` has the value `INT_MAX`?
for (int i = INT_MAX - 2; i++ < INT_MAX;) {
printf("%d\n", i);
}
puts("Done");
return 0;
}
Sample output
2147483646
2147483647
Done
Of course code can be re-written to avoid this quandary with the below. Still, looking for confirmation concerning the above. (I think it is UB.) A similar issue exists with INT_MIN and i--.
for (int i = INT_MAX - 2; i < INT_MAX;) {
i++;
printf("%d\n", i);
}
GNU C11 (GCC) version 5.3.0 (i686-pc-cygwin)
compiled by GNU C version 5.3.0, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3
'-std=c11' '-O0' '-g3' '-Wpedantic' '-Wall' '-Wextra' '-Wconversion' '-c' '-fmessage-length=0' '-v' '-MMD' '-MP' '-MF' xx.o' '-o' 'xx.o' '-mtune=generic' '-march=i686'
/usr/lib/gcc/i686-pc-cygwin/5.3.0/cc1.exe -quiet -v -MMD xx.d -MF xx.d -MP -MT xx.o -dD -Dunix -idirafter ... xx.c
Regardless of the scope i, the program has undefined behaviour in the evaluaton of i++ when i is 2147483647 (assuming INT_MAX=2147483647 on your system).
Your example can be re-written as:
include <limits.h>
int main(void) {
// Specified behavior when `i` has the value `INT_MAX`?
{
int i = INT_MAX;
i++;
}
puts("Done");
return 0;
}
The value computation of i++ results in integer overflow irrespective of whether the computed value is used or if that object cease to exist right after the next sequence point; sequence point or storage duration of the object is irrelevant whether there's an undefined behaviour here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With