C或C++语言的语义与用户形成了对比。有些构造对它们的行为没有任何限制,要么是因为在某些情况下没有指定的行为(比如取消引用不指向对象的指针,比如空指针),要么是因为显式未定义。在这两种情况下,都不提供关于以下行为的保证。
但是过去呢?这些指令定义了行为并产生了输出。我认为输出可以被擦除,但以前的交互可能已经在过去观察到了。
未定义的行为是否具有先见之明,以至于某些输出不会发生?例如:
std::cout << "hello, world" << std::endl; // with a flush
float f = 1./0.; // UB: cancels previous syscall?
在这里做write
系统调用(假设是Unix)不是一致的吗?
现在,内存模型如何呢?可以保证原子对象上的所有操作、互斥锁上的所有操作以及所有顺序一致的操作都有一个顺序(每个操作都与指令流一致,但它们的联合不必是一致的);如果程序表现出未定义的行为,什么时候才能应用这种保证?
实现是否可以在程序执行过程中的某个时刻使用未定义的行为作为不遵守内存模型要求的借口?换句话说,作为语言语义的契约的客户端(用户)可以期望这些需求(在I/O上、在操作订单上)在哪些点上被交付?
澄清:只有格式良好的程序
(我意识到我可能没有像我想要的那样具体。)
一些程序的源代码违反了一致性或健全性规则:
对于没有在不同点绑定到不同名称的有效specialization
违反了one definition规则
被描述为完全无效。这些程序可以通过诊断被编译器拒绝,或者被编译,但在这种情况下,程序的执行没有定义的行为。让我们称之为“先验的UB”。
问题不是关于这些程序,而是关于格式良好的程序,这些程序至少在一段时间内可以有一些定义良好的执行。
https://stackoverflow.com/questions/56531850
复制相似问题