包括<;原子>;打破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
如何恢复正确的行为
版本信息:我正在运行Ubuntu3.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