【发布时间】:2017-11-22 12:10:17
【问题描述】:
尽管出现了标题,但这不是一个哲学问题。
然而,它是严格意义上的语义。
背景
answer 在之前的编辑中指出,读取未初始化的值是未定义的行为。我同意这个评估。其他人则没有。
经过一番挖掘,我得出的结论是,它是否是未定义的行为是未定义的。
标准的 6.3.2.1 中的第 2 小节仅声明访问未初始化的对象,
[...] 可以使用寄存器存储类 [...]
声明
是未定义的行为。
其他部分,例如 6.7.9 [Initializers] 或 6.5.2.1 [Array subscripting] 未提及访问未初始化的值。
因此,毫无疑问,是否提到这种特殊情况被标准称为未定义行为。
语义
但是:3.4.3 1 声明 未定义的行为 是
行为,在使用不可移植或错误的程序结构或错误数据时, 本国际标准对此没有要求
从一个未初始化的数组中读取
- 使用错误数据
- 使用非便携式结构。 (即内存分配的细节1)
- 导致行为
- 标准没有要求产生可预测的效果
我称之为“未定义的行为”。 但也许我错过了什么(?)
还有一个更广泛的问题:
是否必须明确提及行为才能被视为“未定义行为”?
注意事项:
- 这个问题是针对 C 语言及其社区的问题
- 问题是关于语义的。它不质疑从未初始化的数组读取是否“明智”。 (事实并非如此,除非您是渗透测试员)
- 我使用了this C11 标准草案
脚注:
-
malloccalloc等,确实对如何执行分配有要求。但是声明一个固定长度的数组并没有指定未初始化数据的性质。
【问题讨论】:
-
3.4.3.1 回答了更广泛的问题。如果某些行为不是由标准明确或隐含地强加的,那就是 UB。
-
真正的哲学问题是:C 的真正实现是什么? (答案没那么简单)
标签: c undefined-behavior