限制"正确"对于posix_spawn?

时间:2018-01-11 18:19:41

标签: c linux

所以我看到头文件spawn.h大量使用' restrict':

const char* command = "whatever";
const char* args[] = {command, "--arg1", "--arg2"};
  • 有趣的是,posix_spawnp没有。

但我经常为exec系列调用使用的模式是:

execv(command, args);

现在,exec家庭,/不要/使用限制,所以我可以(忽略一些const演员)

posix_spawn(nullptr, command, nullptr, nullptr, args, __environ);

但是我(技术上)因为限制而无法执行以下操作:__ path和  __argv都被标记为受限制,因此无法指向同一个对象。

{{1}}

这是否在我不知道的某个深层次上是明智的? :-)
当然它全部都包含在宏中,所以也许从未启用它?

请注意,这个问题非常多地出现在假设和语言律师的土地上。我还没有找到一个强制执行此限制的编译或lint选项,当然也不是来自C ++,使用extern" C"但同样我不想在将来进入一个

1 个答案:

答案 0 :(得分:0)

是的,它对posix_spawn函数本身的编译器很有用。

它告诉编译器他可能对数组有什么假设。特别是它告诉第一个参数不能被字符数组别名: char*和类似的可以别名所有其他指针类型。

对于您和任何其他人(他们会将char*转换为pid_t*作为路径传递?)这可能是显而易见的,但这不是编译器。

类似的参数适用于其他数组。如果它们的基类型只是一些typedef ed整数类型,编译器可能会怀疑别名,实际上它永远不会存在。

对于您展示的代码没有问题,因为restrict保护它指向的对象,而不是其他引用的对象。如果有人想要,他必须使用像

这样的东西
char *restrict const __argv[restrict],

但这可能过于“限制性”,在这里。