首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么时候会发生UB ?它是否会使所有以前签约的合同无效?

什么时候会发生UB ?它是否会使所有以前签约的合同无效?
EN

Stack Overflow用户
提问于 2019-06-11 02:39:50
回答 1查看 147关注 0票数 0

C或C++语言的语义与用户形成了对比。有些构造对它们的行为没有任何限制,要么是因为在某些情况下没有指定的行为(比如取消引用不指向对象的指针,比如空指针),要么是因为显式未定义。在这两种情况下,都不提供关于以下行为的保证。

但是过去呢?这些指令定义了行为并产生了输出。我认为输出可以被擦除,但以前的交互可能已经在过去观察到了。

未定义的行为是否具有先见之明,以至于某些输出不会发生?例如:

std::cout << "hello, world" << std::endl; // with a flush
float f = 1./0.; // UB: cancels previous syscall?

在这里做write系统调用(假设是Unix)不是一致的吗?

现在,内存模型如何呢?可以保证原子对象上的所有操作、互斥锁上的所有操作以及所有顺序一致的操作都有一个顺序(每个操作都与指令流一致,但它们的联合不必是一致的);如果程序表现出未定义的行为,什么时候才能应用这种保证?

实现是否可以在程序执行过程中的某个时刻使用未定义的行为作为不遵守内存模型要求的借口?换句话说,作为语言语义的契约的客户端(用户)可以期望这些需求(在I/O上、在操作订单上)在哪些点上被交付?

澄清:只有格式良好的程序

(我意识到我可能没有像我想要的那样具体。)

一些程序的源代码违反了一致性或健全性规则:

对于没有在不同点绑定到不同名称的有效specialization

  • templates的

  • 模板,

违反了one definition规则

被描述为完全无效。这些程序可以通过诊断被编译器拒绝,或者被编译,但在这种情况下,程序的执行没有定义的行为。让我们称之为“先验的UB”。

问题不是关于这些程序,而是关于格式良好的程序,这些程序至少在一段时间内可以有一些定义良好的执行。

EN

回答 1

Stack Overflow用户

发布于 2019-06-11 22:55:34

该标准允许实现提供他们认为合适的任何行为保证,而不是它要求的行为保证。假设如下所示:

unsigned char ch = getc();
printf("Oh no %d\n", 1/ch + ((-ch)<<1));

标准不承认执行可能到达getc()而没有到达printf的任何情况,因此,如果发生这种情况,确实会对程序行为施加任何要求。这种情况可能发生的实现(例如,由于由control-C触发的SIGINT )想要允许程序员利用所产生的语义,可以并且应该提供标准所要求的那些之外的适当保证,但是是否以及何时提供此类保证的问题超出了标准的管辖范围。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56531850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档