使用GCC编译选项“-Werror”时,如何忽略错误?

5

我有以下测试代码,文件test.c:

#include <stdio.h>

int *func()
{
    int i = 123;
    return &i;
}

int main()
{
    printf("%d\n", *func());
}

如果我使用命令来编译它,那就没有问题了。

gcc test.c -o test

它会有以下警告信息:
warning: address of stack memory associated with local variable 'i'
  returned [-Wreturn-stack-address]
return &i;
        ^
1 warning generated.

但它可以输出结果:123 如果我使用命令:
gcc -Werror test.c -o test

它将会包含以下错误信息:
error: address of stack memory associated with local variable 'i'
  returned [-Werror,-Wreturn-stack-address]
return &i;
        ^
1 error generated.

我现在想要使用 -Werror 选项,但是我也想忽略 与本地变量 'i' 关联的堆栈内存地址 警告。我该怎么做?


1
你知道返回指向栈变量的指针是一个糟糕的想法,对吧?如果你进行任何函数调用(包括隐式函数调用,有时在使用= {0};初始化结构体/数组时执行),指针所引用的值将不再有效。这个警告是有原因的。 - ShadowRanger
1
谢谢@ShadowRanger,我明白了,我只想暂时解决它。 - thinkerou
C ++返回对本地变量的引用 (2011年,5个答案和137个赞)。 - Peter Mortensen
使用哪个版本的GCC?在哪个平台上运行? - Peter Mortensen
我认为OP没有使用GCC,而是选择了Clang-Wreturn-stack-addressClang的特性。它在GCC中不存在(除非在GCC 3.4之前已被删除(2003年或更早)-这是非常不可能的)。 - Peter Mortensen
显示剩余15条评论
2个回答

10
大多数gcc警告可以通过在警告名称前加上no-来禁用,例如:-Wno-return-stack-address
话虽如此,这不是你想忽略的事情;返回指向堆栈变量的指针是未定义行为,在大多数编译器上具有半可预测的结果,但它非常脆弱;任何函数调用,隐式或显式,都可能覆盖该指针所引用的值。

在较新的GCC版本中,它将使用-Wno-return-local-addr而不是-Wno-return-stack-address。详情请参阅:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wno-return-local-addr - Peter Mortensen
@PeterMortensen:我不知道。原帖的作者告诉我警告开关是什么,我建议他们在名称前添加“no-”以禁用它。 - ShadowRanger
好的,我找到了一种更高效的搜索方法 - Peter Mortensen
搜索应该是没有三个字母“-no”(或者只使用最后一部分)。-Wreturn-local-addr显然是在GCC 4.8中引入的(发布于2015年6月23日)。(它在 GCC 4.7 中没有出现。) - Peter Mortensen
OP可能没有使用GCC,而是使用其他编译器(具有一些常见的选项名称)。-Wreturn-stack-address似乎已经在Clang 3.3中引入,并且在最新版本中(未列出3.2)。Clang 3.3发布于2015年之前,在2012年至2014年期间发布。 - Peter Mortensen
显示剩余3条评论

0
根据gcc关于-Werror的文档, 你可以使用-Wno-error=来"取消特定警告的-Werror". 在我们的情况下,我们可以忽略-Wreturn-stack-address,方法如下:-Wno-error=return-stack-address
gcc -Werror -Wno-error=return-stack-address test.c -o test

正如此处的另一个答案已经指出的那样,您可以通过在警告名称后添加no-来禁用大多数警告。在上面链接的文档中:

每个特定的警告选项也有一个以-Wno-开头的负形式来关闭警告;例如,-Wno-implicit

我认识到这个问题中给出的例子只是一个例子。我需要这样做的地方是编译我无法编辑的外部库,原因可能是许可证或其他原因。通常情况下,我可以提交一个工单来移除警告,但在此期间,我会评估风险并选择将警告静音,直到有更新出现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接