gpt4 book ai didi

c - C 编译器编译 i = i++; 是否合法?作为系统("rm -rf/");?

转载 作者:行者123 更新时间:2023-11-30 21:46:59 24 4
gpt4 key购买 nike

未定义行为究竟有多未定义?我读过这样的说法:各种 C 标准允许第一个未定义行为之后的所有行为实际上是任意的。您会看到人们对像 i = i++; 这样的语句说四个基本的不确定性级别。 :

  1. i 可以是语句后的 ii+1。”
  2. i 可以在语句后保存任何值。”
  3. 任何值都可能发生任何情况,或者执行可能完全停止,但编译 i = i++;具有特定的副作用,如 system("rm -rf /");不符合规定。
  4. 绝对任何事情都可能发生,包括system("rm -rf /"); !我描述的易于触发的文件系统破坏编译器是 100% 符合标准的。

我相信答案不是 1,但它是哪一个(如果有的话)?如果答案取决于引用的具体 C 标准,那么答案 vector 会很好。

编辑:linked possible duplicate并不是同一个问题(更多的是询问一个代码路径上未定义行为的可能性是否会导致不确定性,无论代码路径如何),而是 this question 的答案直接指出答案是 4——即,未定义确实意味着该标准对行为没有任何限制。我不知道为什么所有的反对票......

第二次编辑:second linked question也不是重复的。它只是询问为什么给定的语句是未定义的(答案当然是序列点的微妙之处)。再次,this question's最佳答案直接回答了我的问题,尽管没有权威引用(与已接受的答案不同)。

最佳答案

官方将“未定义行为”定义为:

behavior, upon use of a nonportable or erroneous program construct or of erroneous data, for which this International Standard imposes no requirements

2 NOTE Possible 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).

这就是全部意思。这一段背后没有任何 secret 含义、歧义或“神圣真理”。

尝试推理未定义的行为对于程序员和编译器来说都是毫无意义的。对于程序员来说,当您可以修复错误和编写代码时,您会浪费时间担心不可移植和错误的行为。对于编译器来说,不可能捕获每个未定义行为的实例:这相当于暂停问题。这就是为什么它首先是未定义的行为。因为如果不是这样的话,它会受到不合理的限制,并且毫无疑问会使编译器编写者的工作变得更加困难或不可能。

这是一个简单且技术上非类似的示例。在 Brainfuck 中,规范中没有任何内容说明如何处理不平衡的括号。它将简化实现,基本上不检查平衡括号(更少的代码和逻辑),但代价是程序看起来正常工作、不正常工作或段错误(即在空容器上执行操作)。

C 是一种复杂得多的语言。如果 C 中没有“未定义行为”,该规范可能会有 1300 页长。

关于c - C 编译器编译 i = i++; 是否合法?作为系统("rm -rf/");?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37513225/

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