- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
C++ 标准为 unclear1 行为提供了大量的定义,这意味着或多或少相同,但存在细微差别。阅读 this answer ,我注意到措辞“程序格式错误;不需要诊断”。
实现定义与未指定行为的不同之处在于,前一种情况下的实现必须清楚地记录它正在做什么(在后一种情况下,它不需要),两者都是格式良好的。 未定义行为与未指定行为的不同之处在于程序是错误 (1.3.13)。
否则,它们都有一个共同点,即该标准对实现将做什么没有任何假设或要求。除了 1.4/8,它声明实现可能有扩展,这些扩展不会改变格式良好的程序的行为,但根据标准是格式不正确的,并且实现必须诊断这些的使用,但之后可以继续编译和执行格式错误的程序。
格式不正确的程序仅被定义为格式不正确(太棒了!)。另一方面,格式良好的程序被定义为符合语法和可诊断语义规则的程序。因此,这意味着格式错误的程序是违反语法或语义规则(或两者)的程序。换句话说,一个格式错误的程序实际上根本不应该编译(如何以任何有意义的方式翻译一个语法错误的程序?)。
我倾向于认为 erroneous 这个词也意味着编译器应该使用错误消息中止构建(毕竟,erroneous 表明存在错误) ,但 1.3.13 中的“注意”部分明确允许一些不同的东西,包括默默地忽略问题(编译器明显不会因为 UB 而破坏构建,大多数默认情况下甚至不会发出警告) .
人们可能会进一步认为 erroneous 和 ill-formed 是相同的,但如果是这种情况或该词的含义,该标准并未详细说明。
此外,1.4 规定
a conforming implementation shall [...] accept and correctly execute a well-formed program
和
If a program contains a violation of a rule for which no diagnostic is required, [...] no requirement on implementations with respect to that program.
换句话说,一个符合规范的实现必须接受一个格式良好的程序,但它也可能接受一个格式错误的程序,甚至没有警告。除非,如果程序格式不正确因为它使用了扩展。
第二段暗示任何与“不需要诊断”相关的内容意味着规范中没有任何要求,这意味着它几乎等同于“未定义的行为”,除了没有提及错误。
因此,使用诸如“格式错误;无需诊断”之类的措辞背后的意图是什么?
“无诊断”的存在表明它与未定义的行为相同(或大部分相同?)。此外,由于实现定义和未指定行为被定义为格式良好,它必须是不同的。
另一方面,由于格式错误的程序破坏了语法/语义规则,它实际上不应该编译。然而,与“不需要诊断”结合使用意味着编译器可以在没有警告的情况下静默退出,并且之后您将无法找到可执行文件。
“格式错误;无需诊断”和“未定义行为”之间是否有区别,或者这只是同一事物的复杂同义词?
最佳答案
标准并不总是像我们希望的那样连贯,因为这是一个非常大的文件,由一个数字(在实践中)编写不同的人,尽管所有的校对确实发生了,不一致的地方就会溜走。如果是未定义的行为(以及一般的错误),我认为有一个对于许多最基本的事情,还有一个额外的问题(指针等),C++ 标准的灵感来自于 C。但是C标准认为所有错误都是未定义的行为,除非另有说明,如 C++ 标准试图采取所有错误都需要的观点诊断,除非另有说明。 (虽然他们仍然必须允许标准省略指定的情况一种行为。)我认为这占了很多措辞不一致。
在全局范围内,这种不一致是令人遗憾的,但总的来说,如果标准说有些东西是错误的或格式不正确的,那么它需要一个诊断,除非标准说它没有,或者它是未定义的行为。在类似的东西“格式错误;无需诊断”,“无需诊断”required"很重要,否则,它需要诊断。至于“格式错误;没有”之间的区别需要诊断”和“未定义的行为”,没有。第一个可能在代码是不正确,第二个是运行时问题,但不是系统的。 (一个定义的规范规则——显然是一个编译时问题——以“then行为未定义”。)
关于c++ - Undefined Behavior 和 Ill-formed 之间的区别,不需要诊断消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22180312/
是否有办法获得一个 Behavior t [a],其中时间 t 时 [a] 的值是 Behavior t [Behavior t a] 中包含的值> 在时间 t?即,具有以下类型的函数: Behavi
(问题最初是由对 Are there race conditions in this producer-consumer implementation? 的回答下的评论提示的,但这里严格从 C 语言的
摘自本文:http://www-public.int-evry.fr/~gibson/Teaching/CSC7322/ReadingMaterial/Wegner87.pdf 它定义类型: type
阅读Akka 2.6.10 API Docs ,akka.actor.typed.scaladsl.Behaviors.setup 和 akka.actor.typed.scaladsl.Behavi
我从 easymock 和 JUnit 测试用例中得到了一些无法解释的行为。我收到 IllegalStateException:缺少前面方法调用的行为定义:myCollaborator.getCurr
在 akka typed 中,我们有行为的概念。 如果我们想保留 Actor 的相同行为,我们会在处理完一条消息后返回 Behaviors.same。但是我们也可以返回这个。两者有何不同? 最佳答案
我正在 Kubernetes 中创建一个 HorizontalPodAutoscaler,我需要将缩减稳定窗口配置为小于默认值。使用的代码和错误如下: apiVersion: autoscalin
在 Python 中,为什么 [:] 切片操作的行为不一致? 它对于列表和字符串的行为有所不同。 对于列表,它给出一个副本列表对象,对于字符串,它给出相同的字符串对象。 我觉得这令人困惑,违反直觉。有
我需要将一些对象存储到数据库中。 首先 我将它们存储在内存中(存储在集合中) 当其中一个正确存储在数据库中时,我会将其删除 所以, public class AuditService { pr
下面的程序 (prog1) 抛出 OutOfMemoryError 错误。确实如此。但如果我在第 5 行(prog2)下方添加 sysout,它不会抛出错误。这种奇怪的行为有什么原因吗? 程序1: p
我有以下二叉搜索树(在 C++ 中),我对特定代码行有疑问: delete k; 如果我删除该行,我的代码可以正常工作,但我不明白为什么。据我了解:来自 k 的数据被插入到树中,然后变量 k 被删除。
我想知道如果我尝试对已删除或可能尚未分配的指针执行 delete 会发生什么?我读过两件事:第一,delete 运算符会做一些检查,我们不需要检查指针是否为空;然后,我读到它会导致未知的行为.. 我在
我无法解释 Scala 集合的这种行为。 让我们从一些定义开始。 import scala.collection.mutable.Set case class Item(name: String, c
我一直在尝试在 wpf 窗口上实现一种行为,因此我在当前的解决方案中添加了对 System.Winodws.Interactivity 的引用,然后编写了所需的行为。但为了应用这种行为,我必须在 Wi
我试图理解 rdpmc 指令。因此,我有以下 asm 代码: segment .text global _start _start: xor eax, eax mov ebx, 10
我正在关注这里的测试:https://github.com/plone/plone.app.referenceablebehavior/blob/master/plone/app/referencea
行为(方法体)可以是状态机或事件 - 事件很容易理解,因为它们等同于过程代码。 我不明白状态机如何用作操作的行为? 您能为此提供一个简单的示例吗? ---注意--- Operation 是一个仅规范元
我正在尝试在 Cocoa 应用程序中实现自定义终止行为。通常,当我的应用程序正常退出时,它会执行最终运行时数据库清理,然后退出。每当调用 [NSApp Terminate:aSender] 时,都会在
这里没什么太严肃的,只是好奇。 我想举个例子,想出了这段代码: const { Observable, Subject } = Rx const timeout$ = new Subject() co
我希望类中的方法在 IO 线程上运行一些代码,但只有当它们订阅的主题具有特定值时。然后调用者应该在 Android UI 线程上收到响应。 类似这样的事情: public class MyClass
我是一名优秀的程序员,十分优秀!