包括<;原子>;打破GCC';s转换为空诊断,distcc修复它。(包括最少的例子)

包括<;原子>;打破GCC';s转换为空诊断,distcc修复它。(包括最少的例子),gcc,c++11,gcc-warning,distcc,Gcc,C++11,Gcc Warning,Distcc,这个问题实际上包括两个观察结果 首先:包含,默认情况下会启用警告 令我惊讶的是,我可以编译noerror.cpp而没有错误。即使标题通过#pragma GCC diagnostic ignore抑制了警告和错误,我的代码中的显式pragma也应该重新启用它们,但它不会 顺便说一句,clang++无论是否包含标头,都会出现预期的错误: error: cannot initialize return object of type 'int *' with an rvalue of type 'boo

这个问题实际上包括两个观察结果

首先:包含
,默认情况下会启用警告

令我惊讶的是,我可以编译
noerror.cpp
而没有错误。即使
标题通过
#pragma GCC diagnostic ignore
抑制了警告和错误,我的代码中的显式pragma也应该重新启用它们,但它不会

顺便说一句,
clang++
无论是否包含标头,都会出现预期的错误:

error: cannot initialize return object of type 'int *' with an rvalue of type 'bool'
第二:使用distcc运行可恢复正常行为
我有多个工作站。如果我试图在其中任何一个基础上进行局部构建,我会遇到上述行为。但是,如果distcc试图在任何远程机器上构建它,则会正确地发出错误。(这就是我第一次发现这个问题的原因;我们的构建很有可能使distcc回退到本地编译)。事实上,即使我对自己的机器使用了
distcc
SSH,也会恢复正确的行为(即错误):

$ DISTCC_HOSTS='localhost' distcc g++-4.8 -c -std=c++11 noerror.cpp # no error
$ DISTCC_HOSTS='@[my_ip_address]' distcc g++-4.8 -c -std=c++11 noerror.cpp
noerror.cpp: In function ‘int* foo()’:
noerror.cpp:3:21: error: converting ‘false’ to pointer type ‘int*’ [-Werror=conversion-null]
cc1plus: some warnings being treated as errors
我不清楚
distcc
如何恢复正确的行为

版本信息:我正在运行Ubuntu
3.5.0-46-generic
、GCC4.8.1和distcc 3.1

总结 包含
似乎会破坏GCC的
转换空值
诊断。不知何故,使用distcc修复了它我已经搜索过了,但是找不到任何类似bug的引用。这是试点错误、已知问题还是我应该提交GCC错误报告?


[编辑:代码片段来自我将其作为警告而不是错误。粘贴了更正的版本]

我进一步发现,这仅在将编译和预处理结合在一个步骤中时才会发生。这解释了使用
distcc
时的行为差异:它预处理本地计算机上的所有代码,并远程编译

尽管@user2485710的评论与此相反,但这并不是试点错误或使用记录不良的功能。这是一个真正的bug,我已经这样报告了:


[目前尚未解决,但Harald van Dijk指出,GCC会抑制该警告,因为它(错误地)认为它位于系统标头中。可以使用
-Wsystem headers
重新暴露错误/警告]

#pragma GCC诊断错误
看起来真的不是个好主意idea@user2485710我通常使用命令行标志。但是,我想解决
标题使用pragmas在内部取消设置该诊断并忘记重置它的可能性(例如,按下但没有弹出)。你能详细解释一下为什么你认为这是一个坏主意吗?与此无关,gcc文档明确指出,
#pragma
具有不一致的行为。如果这种方法从一开始就不应该起作用,你不能说“它不起作用”。只需使用命令行选项,但始终不是您想要的。@user2485710文档中说明某些警告是可控的,我已经验证了pragma是否适用于该特定警告。不管怎样,你不是在建设性的:我有同样的行为,如果我在命令行中指定它,正如我在问题中所说的
$ g++-4.8 -c -std=c++11 error.cpp
error.cpp: In function ‘int* foo()’:
error.cpp:3:21: error: converting ‘false’ to pointer type ‘int*’ [-Werror=conversion-null]
 int * foo() {return false;}
                     ^
cc1plus: some warnings being treated as errors
error: cannot initialize return object of type 'int *' with an rvalue of type 'bool'
$ DISTCC_HOSTS='localhost' distcc g++-4.8 -c -std=c++11 noerror.cpp # no error
$ DISTCC_HOSTS='@[my_ip_address]' distcc g++-4.8 -c -std=c++11 noerror.cpp
noerror.cpp: In function ‘int* foo()’:
noerror.cpp:3:21: error: converting ‘false’ to pointer type ‘int*’ [-Werror=conversion-null]
cc1plus: some warnings being treated as errors