【发布时间】:2014-08-12 12:29:50
【问题描述】:
我试图理解为什么以下代码会生成“参数可能被破坏..”警告。这是一个最小的示例:
#include <unistd.h>
extern char ** environ;
int test_vfork(char **args, char **newEnviron)
{
pid_t pid = vfork();
if (pid == 0) {
execve(args[0], args, (newEnviron != NULL)? newEnviron : environ);
}
return 0;
}
这是输出(这是 gcc 4.3.3):
$ gcc -O2 -Wclobbered -c test.c -o test.o
test.c: In function ‘test_vfork’:
test.c:5: warning: argument ‘newEnviron’ might be clobbered by ‘longjmp’ or ‘vfork’
我还发现,如果我将 execve 行替换为以下内容,警告就会消失:
if (newEnviron != NULL)
execve(commandLine[0], commandLine, newEnviron);
else
execve(commandLine[0], commandLine, environ);
不知道为什么 gcc 比原来更喜欢这个。有人能解释一下吗?
【问题讨论】:
-
Clang 3.4(在 OS X 上)可以毫无怨言地编译它,即使使用
-Wall -Wextra。你可以试试(很多)更新的 GCC。 -
@GradyPlayer:我已经检查过了,但不知道这如何适用于这种情况。
newEnviron参数未通过代码进行修改。 -
我不认为需要修改它才能得到警告,而且我不知道没有三元的版本与编译器是否可以,我怀疑这是一个错误......但是您是否尝试使用
returns_twice来装饰函数? -
代码分析真的很难。感谢 GCC 试图警告你它不确定你的代码是否安全,尽管我非常希望该代码没有真正的危险。
标签: c linux gcc gcc-warning