【发布时间】:2018-06-20 23:01:13
【问题描述】:
考虑
void swap(int* a, int* b)
{
if (a != b){
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
}
int main()
{
int a = 0;
int b = 1;
swap(&a, &b); // after this b is 0 and a is 1
return a > b ? 0 : a / b;
}
swap 试图欺骗编译器使其不优化程序。
是否定义了该程序的行为? a / b 永远无法访问,但如果是,那么您将得到除以零。
【问题讨论】:
-
我对 UB 的理解是,它需要一条不可避免地导致包含 UB 的表达式的路径。也就是说,只要有可能没有达到带有 UB 的表达式,就没有 UB。虽然我找不到来源。否则,在调用成员函数之前检查
nullptr等常见策略将是UB。 -
@FrançoisAndrieux 我会说 UB 是当且仅当采用表达式的路径时。
-
@You:在 C++ 标签上。我在 C 标签上问过这个问题,因为 C 中的规则通常更简单。
-
@You 那不一样。这个问题是在问,而是将 UB 引入分支足以迫使编译器假设该分支是不可访问的。
-
@You 我认为 C 可能与 C++ 具有相同的 UB 定义,也可能不同,这是答案的一部分。 C 和 C++ 是 不同的语言,据我了解,随着时间的推移,它们的差异越来越大。没有人说它们必须具有相同的行为,所以我认为作为 C++ 问题的副本结束是不合适的。
标签: c language-lawyer undefined-behavior