遗漏是不确定的行为?

时间:2014-10-23 10:46:49

标签: c++ language-lawyer

标准说:

1.3.24                                                          [defns.undefined]
undefined behavior
behavior for which this International Standard imposes no requirements
[ Note: Undefined behavior may be expected when this International Standard 
omits any explicit definition of behavior or when a program uses an erroneous 
construct or erroneous data. Permissible undefined behavior ranges from ignoring 
the situation completely with unpredictable results, to behaving during 
translation or program execution in a documented manner characteristic of the 
environment (with or without the issuance of a diagnostic message), to 
terminating a translation or execution (with the issuance of a diagnostic 
message). Many erroneous program constructs do not engender undefined behavior; 
they are required to be diagnosed.
— end note ]

显然,标准不能涵盖行为的每个可能方面。因此,如果标准不涵盖某些内容,它似乎可以"是未定义的行为。究竟是什么意思?

它暗示如果标准不涵盖某些内容,它就不能对其施加要求。但是,如果没有明确说明标准,标准怎么说是未定义的行为呢?从字面上看,任何事情都可以在程序中发生,并且假定它不是未定义的行为,除非按照标准这样说。这是否意味着默认情况下非标准程序是未定义的行为?


答复者说,笔记是非规范性的。这在Are notes and examples in the core language specification of the C++ Standard non-normative?中得到了解答:

  

文件正文中的注释和示例只能是   用于提供旨在协助的其他信息   理解或使用该文件。它们不得含有   要求("应&#34 ;;见3.3.1和表H.1)或任何信息   被认为是使用该文件必不可少的,例如:   说明(命令性;见表H.1),建议("应&#34 ;;   见3.3.2和表H.2)或许可("可能&#34 ;;见表H.3)。笔记   可以写成事实陈述。

在我看来,省略的东西不是严格的未定义行为。例如,如果注释中提到了某种严格的未定义行为吗?

3 个答案:

答案 0 :(得分:6)

  

但是,如果没有明确说明,标准怎么说一些未定义的行为呢?

因为那是 undefined 的意思。发生的事情尚未确定。该标准定义了有效程序所期望的 ,它不会尝试列出所有可能的无效程序并说“这是未定义的,这也是未定义的,这也是未定义的”。

标准未指定在程序运行时触发计算机时会发生什么。这并不意味着它定义明确。这显然是未定义的。

  

字面上任何事情都可以在程序中发生,并且假定它不是未定义的行为,除非标准中这样说。

我不确定你在这里说的是什么,但是它向后听起来是180°。

  

这是否意味着默认情况下非标准程序是未定义的行为?

什么是“非标准程序”?

答案 1 :(得分:2)

您引用的注释的最后一句在第一句中解释了may

  

许多错误的程序结构不会产生未定义的行为;他们需要被诊断出来。

因此,可能是非常正确的。

任何未定义的内容都是未定义的,尽管有很多方法可以定义(即使它只是略有约束)。

此外,由于注释不是规范性的,因此无法定义行为。

答案 2 :(得分:1)

正式地,标准未定义的任何内容 未定义的行为。如果标准没有定义,它是如何定义的 定义它?

实际上,有几件事情被视为 给定;如果标准定义了行为,例如,a 实现无法添加其他可观察行为。 (即 在a = 2 * a;之类的声明中,实现不是 允许修改除a之外的任何内容,即使我不认为 你会在标准中找到这种效果的明确段落。)

但那是关于它的。如果标准没有定义它,那就是 根据标准的未定义行为。 (一个 实施可提供进一步的定义。事实上,所有 做。)