根据标准,c++编译器需要如何处理格式不良的程序?

What is the C++ compiler required to do with ill-formed programs according to the Standard?

本文关键字:处理 格式 不良 程序 何处理 标准 c++ 编译器      更新时间:2023-10-16

c++ 03标准定义格式良好的程序 (1.3.14 [definition .well.formed])为

根据语法规则、可诊断的语义规则和一个定义规则(3.2)构造的c++程序

它进一步定义了病态程序 (1.3.4 [definitions .ill.formed])为

输入到非格式良好程序的c++实现(1.3.14)

和标准中充满了诸如"if X then the program is ill-formed"之类的语句,例如(2.13.1/3):

如果程序的一个翻译单元包含一个不能用任何允许的类型表示的整数字面值,则该程序是病态的。

然而,我还没有发现c++实现是如何处理病态程序的。

假设我有一个病态的程序。现在怎么办呢?

c++实现是否需要在遇到格式不良的程序时做一些特定的事情,或者c++实现行为只是未定义?

c++实现是否需要在遇到格式不良的程序时做一些特定的事情,或者c++实现行为只是未定义?

如果标准没有指定,则实现应该发出诊断消息(错误或警告)。然而,对于一些违规,标准明确规定不需要诊断。在这种情况下,程序是病态的,但实现通常不需要告诉用户,因为在一般情况下这样做太困难了。

关于一个定义规则,例如,参见c++ 11标准第3.2/4段:

每个程序应该只包含一个非内联函数或变量的定义在那个项目中;不需要诊断.

关于遇到违反规则时对实现的要求,第1.4/2段规定:

[…]

-如果程序不包含违反本国际标准规则的内容,则为符合标准的实现应在其资源限制内,接受并正确执行该程序。

- 如果程序违反了任何可诊断规则或出现了当实现不支持该构造时,将本标准定义为"条件支持";一个符合标准的实现应该至少发出一条诊断消息

-如果程序违反了不需要诊断的规则,则本国际标准标准对该程序的实现没有任何要求。

同样相关的是第1.4/1段,它解释了上面引用的段落中"可诊断规则"的含义:

可诊断规则集由本国际标准中的所有语法和语义规则组成对于那些包含"不需要诊断"的显式符号或描述为的规则导致"未定义行为"

所以总结一下:如果一个格式不良的程序包含一个可诊断的违反,而标准没有明确指定"不需要诊断",符合标准的实现应该发出一个诊断。

引用[intro.compliance]§2:

  • 如果程序不包含违反本国际标准规则的内容,则符合标准的实施应在其

  • 如果程序违反了任何可诊断规则或发生了本标准中描述的结构当实现不支持时,"条件支持"对于这个构造,一个符合标准的实现应该至少发布一个诊断信息。

  • 如果程序违反了不需要诊断的规则,则本国际标准不要求

我没有在标准中找到任何其他相关的段落。如果我们将它与[define .undefined]:

结合使用
<

未定义行为/strong>

本国际标准未规定的行为

[注:当此国际标准省略了对行为或程序何时执行的任何显式定义使用错误的结构或错误的数据。允许定义行为包括从完全忽视情况到不可预测的结果,在翻译或程序过程中的行为以环境特有的文件化方式执行(无论是否发出诊断消息),到终止翻译或执行(带有诊断的发布)消息)。许多错误的程序构造不会产生undefined行为;他们需要被诊断出来。-end note]

我想说我们到达了"发出诊断信息,进一步的行为是未定义的",因为标准没有说更多关于它的事情。

(首先,抱歉我的英语不好)

标准在§1.4.2中规定:

如果程序违反了任何可诊断规则[…]符合性实施应发出至少一条诊断信息。

病态程序的定义是"非良好形式的程序"(第1.3.9节),而良好形式的程序是(第1.3.26节):

根据语法规则、可诊断的语义规则和一次定义规则构造的c++程序

因此,病态程序确实隐式地违反了"某些"规则。如果规则R具有以下结构:

如果一个程序具有属性p,则它是一个病态程序。

当一个程序具有这样的属性p时,它确实隐式地违反了一条规则(根据病态程序的定义),尽管不清楚哪条规则被违反了,因为R本身没有(从严格的逻辑角度来看)。

我能找到的唯一相关的引用是,需要一个实现来诊断一个格式不良的程序,但它可以完成编译:

1.4实现遵从性[intro.compliance]

8)一个符合标准的实现可以有扩展(包括附加的库函数),前提是它们不改变任何函数的行为格式良好的计划。需要实现来诊断程序使用这样的扩展,根据这个是病态的国际标准。然而,在这样做之后,它们可以编译和执行这些程序