虚假的“函数调用中缺少哨兵”

时间:2012-08-23 16:08:09

标签: c++ unix gcc g++ exec

这个简单的代码段使用g ++ 4.7.0生成“函数调用中缺少的标记”警告,两者都编译为Cand C ++源代码。我认为这是编译器的错误,因为最终NULL值就在那里。

#include <unistd.h>

int main() {
    execlp("mkdir", "mkdir", "-p", "test", NULL);
    return 0;
}

我是对的吗?

2 个答案:

答案 0 :(得分:8)

不,你错了。

在C ++中,NULL类似于00L,在C中可能是相同的。如果该常量的类型小于指针,那么将它传递给可变参数是不安全的。功能,因为高位将填充垃圾。

在Linux上,execlp(1)手册页说:

  

参数列表必须由NULL指针终止,并且由于这些是可变参数函数,因此必须强制转换此指针{。{1}}。

即。便携地提供你需要做的哨兵:

(char *) NULL

这就是海湾合作委员会警告你的事情。

答案 1 :(得分:0)

来自我的documentation

since  these  are variadic functions, this pointer must be cast `(char *) NULL`.

尝试:

execlp("mkdir", "mkdir", "-p", "test", (char*)NULL);