未定義行為存在的重要目的:無論是 signed integer overflow 或者其他機制,藉由語言標準中的刻意留空,允許更激進最佳化的存在。
依據 C 語言規範,overflow of a signed value is undefined behavior,而符合規範的正確 C 程式不應產生 signed overflow。
在這個案例中,(int + 100 > int) 總是成立,自然上述第 6 行就被最佳化處理給移除了。
➜ c_playground gcc test.c -O2 -o test.out && ./test.out
200 GT 100
-2147483549 GT 2147483647
➜ c_playground gcc test.c -O0 -o test.out && ./test.out
200 GT 100
-2147483549 LT 2147483647