如何解决centos双编译器设置中gcc编译器优化导致的分段错误 我有一个用GCC构建的大型C++软件项目。在将一些新代码添加到存储库中之后,其中一个二进制文件开始在较大的测试数据上出现分段错误(在一些较小的测试输入上没有segfault)。我用两种不同的系统测试了几种不同的硬件。Ubuntu18和Centos6。测试的GCC编译器为6.3、7.4和9.2。Ubuntu上的二进制构建总是好的,Centos上的二进制构建总是坏的(segfault)。操作系统出现问题: uname -a Linux hostname 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

如何解决centos双编译器设置中gcc编译器优化导致的分段错误 我有一个用GCC构建的大型C++软件项目。在将一些新代码添加到存储库中之后,其中一个二进制文件开始在较大的测试数据上出现分段错误(在一些较小的测试输入上没有segfault)。我用两种不同的系统测试了几种不同的硬件。Ubuntu18和Centos6。测试的GCC编译器为6.3、7.4和9.2。Ubuntu上的二进制构建总是好的,Centos上的二进制构建总是坏的(segfault)。操作系统出现问题: uname -a Linux hostname 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux,c++,gcc,segmentation-fault,C++,Gcc,Segmentation Fault,我的Unbuntu只有一个编译器,但Cenos通常有一个旧的GCC4.8,在此基础上我们构建了6.3、7.4或9.2。我的C++代码是用不同版本的GCC和不同的硬件构建的,所有的代码都在 std::ostream& operator(ostream&, const string&); 但是从我代码中的几个随机位置中的一个。我使用了-O2或-O3选项。使用-O0选项时,二进制文件没有问题,但速度要慢几倍。我正在尝试生成需要更快的生产代码 我知道一个解决方案是找出哪行代码导

我的Unbuntu只有一个编译器,但Cenos通常有一个旧的GCC4.8,在此基础上我们构建了6.3、7.4或9.2。我的C++代码是用不同版本的GCC和不同的硬件构建的,所有的代码都在

std::ostream& operator(ostream&, const string&);
但是从我代码中的几个随机位置中的一个。我使用了-O2或-O3选项。使用-O0选项时,二进制文件没有问题,但速度要慢几倍。我正在尝试生成需要更快的生产代码

我知道一个解决方案是找出哪行代码导致了这个分段错误,我将在下一步尝试。我的问题是,在制作gcc编译器时,是否有任何选项可以帮助解决这个segfault问题


我已经按照建议(在下面的评论部分提供)打开了完整警告,并用警告消息更新了所有依赖库(包括boost)。看来这解决了问题。我学到了一个重要的教训:我们编写的任何代码都必须通过迂腐的墙。应该有人写一个答案来帮助其他程序员。

没有人回答过这个问题。我将在这里总结我的经验,没有任何具体的代码。首先,我在centos6上进行了测试,最初的gcc是4.8,我用gcc7.4构建了最新的gcc 9.2编译器。在这台机器上,使用编译器9.2生成的二进制文件在使用-O选项时只有分段错误。segfault总是在std-ostream&operator中,无法从您发布的内容猜出原因,但我怀疑您的代码中的某个地方。这听起来像是编译器错误或代码库中的UB。只有在使用优化编译时才会崩溃的代码通常表示存在未定义行为的问题(您已经在C++标准之外做了一些事情,而优化器则做了一些可怕的事情,因为一旦遇到了未定义的行为,编译器就可以做任何它想做的事情)。作为第一步,我建议把编译器警告变成MAX(<代码> -WORT -WORACH-WEDANANTIC< <代码>和适当的<代码> -STD= 标志)。并尽可能地解决问题。您是否尝试过asan和/或ubsan?清洁剂非常擅长发现问题。
因此,由于代码的行为未定义,这不太可能发生。
-不。您的代码中很可能存在未定义的行为。您必须向其他人展示一个帮助。谢谢感谢您花时间在这里添加您的经验,我注意到一些非常奇怪的问题,根据编译器版本的不同,分段错误不一致,但我想我也应该检查自己的代码,以防出现潜在问题。
// samearray is array<int,4> somearray;
somearray[4]=someNumber;