C++ 最早可以表现出来的未定义行为是什么?

标签 c++ undefined-behavior

我知道未定义的行为可能会导致任何事情,这使得任何包含 UB 的程序都可能毫无意义。我想知道是否有任何方法可以识别程序中未定义行为可能导致问题的最早点。 这是一个例子来说明我的问题。

void causeUndefinedBehavior()
{
   //any code that causes undefined behavior
   //every time it is run
   char* a = nullptr;
   *a;
}


int main()
{
 //code before call
 //...
 causeUndefinedBehavior();
 //code after call
 //...
}

根据我的理解,未定义行为可能被引发(不一定表现出来)的时间是:

  1. causeUndefinedBehavior() 被编译时。
  2. main() 被编译时。
  3. 程序运行时。
  4. 在执行 causeUndefinedBehavior() 时。

或者对于每种情况和每种实现,未定义行为的诱发点是完全不同的吗?

此外,如果我注释掉调用 causeUndefinedBehavior() 的行,是否会消除 UB,或者它是否仍然存在于程序中,因为包含 UB 的代码已被编译?

最佳答案

正如您的代码所展示的那样,未定义的行为几乎始终是尝试行为时的运行时状态 的条件。对您的代码稍作修改可以使这一点变得非常明显:

void causeUndefinedBehavior()
{
   //any code that causes undefined behavior
   //every time it is run
   char* a = nullptr;
   *a;
}


int main()
{
 srand(time(NULL));
 //code before call
 //...
 if (rand() % 973 == 0)
    causeUndefinedBehavior();
 //code after call
 //...
}

您可以执行此操作一千次或更多次并且永远不会触发 UB 执行条件。这不会改变函数本身显然是 UB 的事实,但是在编译时在调用程序的上下文中检测不是微不足道的。

关于C++ 最早可以表现出来的未定义行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114459/

相关文章:

c++ - 我可以指定默认值吗?

c++ - 您是否可以使用 std::aligned_union 违反严格的别名规则

c++ - UB 取消引用 union 数组时

c++ - 结构对齐和类型重新解释

C 编程段错误 : 11

c++ - 当不使用指针来跟踪当前节点时,为什么树遍历会导致未定义的行为?

c++ - 重载 << 和 >> 运算符 : The program compiles but running it doesn't accept input

c++ - 带默认参数的构造函数

c++ - 访问持有 QString 的 shared_ptr 时程序崩溃

c++ - 不需要默认构造函数时 map operator[] 的安全性