gpt4 book ai didi

c++ - 具有未定义行为但从未实际执行过的表达式是否会使程序出错?

转载 作者:IT老高 更新时间:2023-10-28 21:56:10 25 4
gpt4 key购买 nike

在许多关于未定义行为 (UB) 的讨论中,已经提出了这样一种观点,即仅在程序中存在的任何结构中,如果在程序中具有 UB,则要求一个符合要求的实现做任何事(包括什么都不做)。我的问题是,即使在 UB 与代码的执行相关联的情况下,是否应该从这个意义上理解这一点,而标准中指定的行为(否则)规定有问题的代码应该不被执行(这可能是针对程序的特定输入;它可能在编译时无法确定)。

用更通俗的说法,UB 的味道是否要求一个符合要求的实现来决定整个程序很糟糕,并且拒绝正确执行,即使是行为已完全明确定义的程序部分。一个示例程序是

#include <iostream>

int main()
{
int n = 0;
if (false)
n=n++; // Undefined behaviour if it gets executed, which it doesn't
std::cout << "Hi there.\n";
}

为清楚起见,我假设程序格式正确(因此特别是 UB 与预处理无关)。事实上,我愿意限制与“评估”相关的 UB,这显然不是编译时实体。我认为与给出的示例相关的定义是(重点是我的):

Sequenced before is an asymmetric, transitive, pair-wise relation between evaluations executed by a single thread (1.10), which induces a partial order among those evaluations

The value computations of the operands of anoperator are sequenced before the value computation of the result of the operator. If a side effect on a scalar object is unsequenced relative to either ... or a value computation using the value of the same scalar object, the behavior is undefined.

很明显,最后一句中的主语“副作用”和“值(value)计算”是“评估”的实例,因为这就是“先排序”关系的定义。

我认为在上述程序中,标准规定不会发生满足最后一句中的条件的评估(相对于彼此和所描述的类型无序),因此该程序没有 UB;没有错。

换句话说,我确信我的标题问题的答案是否定的。不过,我会很感激其他人在这个问题上的(积极的)意见。

对于那些主张肯定回答的人来说,也许还有一个问题,即当编译错误的程序时,是否会强制要求重新格式化硬盘?

本站的一些相关指点:

最佳答案

If a side effect on a scalar object is unsequenced relative to etc

副作用是执行环境状态的变化 (1.9/12)。更改是一种更改,而不是如果评估后可能会产生更改的表达式。如果没有变化,就没有副作用。如果没有副作用,那么没有副作用相对于其他任何事情都是无序的。

这并不意味着永远不会执行的 any 代码是 UB-free 的(尽管我很确定其中大部分是)。标准中每次出现的 UB 都需要单独检查。(删除的文本可能过于谨慎;见下文)。

标准也这样说

A conforming implementation executing a well-formed program shall produce the same observable behavior as one of the possible executions of the corresponding instance of the abstract machine with the same program and the same input. However, if any such execution contains an undefined operation, this International Standard places no requirement on the implementation executing that program with that input (not even with regard to operations preceding the first undefined operation).

(强调我的)

据我所知,这是唯一说明“未定义行为”一词含义的规范性引用:程序执行中的未定义操作。没有执行,没有 UB。

关于c++ - 具有未定义行为但从未实际执行过的表达式是否会使程序出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24186681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com