UB可以导致多个单线程应用运行产生不同的输出吗?

zr.*_*zr. 1 c++ deterministic undefined-behavior

对于相同的输入,满足以下条件的代码是否可以为每次运行生成不同的输出?

  • 代码是单线程的,但它确实链接到线程安全的运行时库.
  • 没有显式调用rand()或time()或他们的朋友.
  • 有一些堆内存分配.
  • 可能存在一些(错误的)代码导致未定义的行为.

sth*_*sth 8

"未定义的行为"意味着任何事情都可能发生.这还包括在程序的每次运行中可能发生的不同事情.

例如,如果使用未初始化的内存,则可能与程序运行程序运行程序运行的内容完全不同.

一个简单的例子:

int main() {
  char s[1024];
  s[1023] = '\0';
  std::cout << s << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这通常会在每次运行时打印不同的字符串.它不使用任何堆分配,我不认为它甚至是任何未定义的行为,所以可能它不是你的问题的预期解决方案.

另一个例子是new可以在每个程序运行时返回不同的地址(这里也没有UB):

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

因此,即使没有未定义的行为,也存在"随机性"的来源,因此当然,对于未定义的行为,每个程序运行时都会发生不同的事情.