定义未定义的行为

Edw*_*per 17 c c++ undefined-behavior

是否存在C++(和/或C)的任何实现,可以保证在任何时候调用未定义的行为,它会发出错误信号?显然,这样的实现可能不如标准C++实现那么高效,但它可能是一个有用的调试/测试工具.

如果不存在这样的实现,那么是否存在任何无法实现的实际原因?或者只是没有人完成它的工作呢?

编辑:为了使这更加精确:我希望有一个编译器允许我做出断言,对于运行完成的C++程序的给定运行,该运行的任何部分都不涉及未定义的行为.

Pub*_*bby 3

是的,也不是。

我相当确定,出于实际目的,实现可以使 C++ 成为一种安全语言,这意味着每个操作都有明确定义的行为。当然,这会带来巨大的开销,并且在某些情况下可能根本不可行,例如多线程代码中的竞争条件。

现在的问题是,这不能保证您的代码在其他实现中定义!也就是说,它仍然可以调用 UB。例如,观察以下代码:

int a;
int* b;

int foo() {
  a = 5;
  b = &a;
  return 0;
}

int bar() {
  *b = a;
  return 0;
}

int main() {
  std::cout << foo() << bar() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

根据标准,调用foo和 的顺序bar由实现来决定。现在,在安全的实现中,必须定义此顺序,可能是从左到右的评估。问题是,从右到左求值会调用 UB,除非您在不安全的实现上运行它,否则不会捕获它。安全的实现可以简单地编译评估顺序的每个排列或进行一些静态分析,但这很快就变得不可行并且可能无法确定。

因此总而言之,如果存在这样的实现,它会给您一种错误的安全感。