gpt4 book ai didi

c - 是使用任何未定义的不确定值还是仅使用存储在具有自动存储的对象中的值?

转载 作者:行者123 更新时间:2023-12-01 03:32:45 24 4
gpt4 key购买 nike

根据 C99 J.2,在以下情况下行为未定义:

The value of an object with automatic storage duration is used while it is indeterminate



对象具有不确定值的所有其他情况呢?如果我们使用它们,我们是否也总是调用 UB?还是我们只在 UB 包含陷阱表示时才调用它们?

例子包括:
  • 使用 malloc 分配的对象的值(7.20.3.3p2)
  • 【非自动存储】a FILE*调用后fclose关于它 (7.19.3p4)
  • 【非自动存储中】调用后的指针free关于它 (6.2.4p2)

  • ...等等。

    我已经使用 C99 作为我的引用资料,但您可以在答案中随意引用 C99 或 C11。

    最佳答案

    我在这里使用 C11 修订版:
    标准中的定义是:

    indeterminate value

    either an unspecified value or a trap representation

    trap representation

    an object representation that need not represent a value of the object type

    unspecified value

    Unspecified valid value of the relevant type where this International Standard imposes norequirements on which value is chosen in any instance



    未指定的值是相关类型的有效值,因此它不会导致未定义的行为。使用陷阱表示将。

    但是为什么标准中存在这种措辞是因为该摘录使编译器能够发出诊断信息,或拒绝使用未初始化的局部变量的值但仍然符合标准的程序;因为据说有些类型不能在内存中包含陷阱表示,所以它们在不确定状态下总是具有未指定的值。这适用于例如 unsigned char .并且由于使用未指定的值没有未定义的行为,因此标准不允许拒绝这样的程序。
    另外,说一个 unsigned char通常没有陷阱表示......除了 IIRC 有一些计算机体系结构,其中寄存器可以设置为“未初始化”,并且从这种体系结构中的寄存器读取将触发故障。因此,即使 unsigned char在内存中并没有真正的陷阱表示,在这种架构上,如果它是自动存储持续时间并且编译器决定将它存储在寄存器中并且它在执行时仍未初始化,则它会以 100% 的概率导致硬件故障称呼。

    关于c - 是使用任何未定义的不确定值还是仅使用存储在具有自动存储的对象中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37204530/

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