【问题标题】:Is calling `wait` with an uninitialized value undefined behavior?是否使用未初始化的值未定义的行为调用“等待”?
【发布时间】:2018-03-20 21:44:07
【问题描述】:
int number;

// In some process

wait(&number);

我正在对一个进程进行等待调用,并想知道这是否安全,或者我会得到未定义的行为吗?。

【问题讨论】:

  • 取决于wait 是否期望一个有效值,或者它是否是一个输出参数。
  • wait 等待分叉的进程退出,所以如果你已经分叉了一个进程,那么是的,它是安全的。或者你的意思是另一个wait
  • 如果number 在范围内,为什么它会是未定义的行为?
  • 对于wait()系统调用,这是正常使用,没有UB。
  • how to use wait in C的可能重复

标签: c undefined-behavior


【解决方案1】:

如果wait 是指等待分叉进程退出的系统调用wait,那么这样做是安全的。 number 可以未初始化,因为 wait 会将状态存储在该变量中。

如果您在谈论另一个 wait 函数,那么如果不查看该 wait 函数的源代码,我就无法告诉您。

【讨论】:

    【解决方案2】:

    这是安全的,因为您将变量的地址传递给函数。虽然number 没有初始化,但它的地址有一个明确定义的值。因此,该函数可以安全地获取该地址,取消引用它,并在那里写入一个值,这正是 wait 所做的。

    man page for wait 声明:

    pid_t wait(int *status);
    

    ...

    如果 status 不为 NULL,wait() 和 waitpid() 存储状态信息 在 它指向的 int。

    如果您在写入之前尝试读取number 的值,并且仅当存储的值是陷阱表示(即不代表“真实”价值)。

    【讨论】:

      猜你喜欢
      • 2020-02-12
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      相关资源
      最近更新 更多