如果启用了-Wsequence-point
,当未定义的行为代码被发现时,GCC应该警告用户。例如为什么在这个例子中GCC不会发出警告
b = a + ++a;
应该由海湾合作委员会注意到,应报告为“未定义行为”的代码(因为ISO C没有指定除了评估操作数的顺序)。
不过,我打了语法,我想这一个:
int *a = malloc(sizeof(int) * 2);
a[0] = 1;
printf("%d\n", *(a + (*a)++ - *a));
当然,我得到了警告
警告:“*”可以未定义[操作 - Wsequence点]
这是我预期的,因为*a
的值(这是a[0]
)可以递增或可以不同时处理第三个操作数。但是,我尝试了以下一种:
int *a = malloc(sizeof(int) * 2);
a[0] = 1;
printf("%d\n", *(a + (*a)++ - 1));
我很惊讶,因为我没有收到警告。这不应该是UB吗?我的意思是,根据ISO C99,可以在表达评估(除了逗号运算符和三元运算符除外)的任何点评估后增量操作。在我后面的例子中,我不是递增指针,而是指向它的整数。因此,根据标准,它可以随时增加(这意味着它可以在整个表达式评估后递增),因此程序可能同时打印1
或2
,对不对?
为什么GCC不会发出任何警告?或者我错过了什么?我错误地理解了规格吗?