有符号整数溢出后的变量未被使用,是否会触发未定义行为?
该C语言程序是否存在未定义行为?
给定程序
#include <limits.h> int main (void) { int i = 0; // 假设用户严格遵循输入要求.. printf ("Enter a number in the range [0 - INT_MAX] : \n"); scanf ("%d", &i); while (i++ < INT_MAX) { // 执行一些操作.. // 循环体内未使用变量i的值 } // 循环体之后未在任何地方使用变量i的值 return 0; }
问题背景
当循环执行到最后一次判断时,i的值为INT_MAX,此时i++ < INT_MAX的表达式会先以INT_MAX作为判断值(结果为假,循环退出),但后置自增的副作用会使i变为INT_MAX + 1,这会触发有符号整数溢出。而溢出后的i值在程序后续未被使用,请问该程序是否存在未定义行为?
结论与标准依据
该程序存在未定义行为,依据来自C语言标准(以C17为例)的条款:
6.5 表达式 第5段:如果在表达式求值过程中出现异常条件(即结果在数学上无定义,或不在其类型的可表示值范围内),则行为是未定义的。
具体来说,后置自增操作i++的副作用是对i执行i = i + 1的操作,当i为INT_MAX时,i + 1的结果超出了有符号int类型的可表示范围,属于上述条款中“结果不在类型可表示范围内”的情况。无论溢出后的i值是否被后续代码使用,只要触发了有符号整数溢出,就会导致未定义行为。
内容的提问来源于stack exchange,提问作者H.S.
相关产品推荐
相关产品推荐

