C++ 升级到G++;4.8-异常\u ptr.h不支持异常传播
我正试图用g++4.8重新编译一个巨大的遗留应用程序,以便调试C++ 升级到G++;4.8-异常\u ptr.h不支持异常传播,c++,g++,centos6,C++,G++,Centos6,我正试图用g++4.8重新编译一个巨大的遗留应用程序,以便调试glibc检测到的内存损坏问题(使用AddressSanitarizer)。之前我们使用的是g++4.4.7 但是,编译失败,原因是: /opt/rh/devtoolset-2/root/usr/include/c++/4.8.2/bits/exception\u ptr.h:40:4:error:#error此平台不支持异常传播。 编译自定义异常处理程序时(我猜)。自定义异常处理程序仅在一个位置使用异常\u ptr: void re
glibc检测到的内存损坏问题(使用AddressSanitarizer)。之前我们使用的是g++4.4.7
但是,编译失败,原因是:
/opt/rh/devtoolset-2/root/usr/include/c++/4.8.2/bits/exception\u ptr.h:40:4:error:#error此平台不支持异常传播。
编译自定义异常处理程序时(我猜)。自定义异常处理程序仅在一个位置使用异常\u ptr
:
void reportOtherException(void) const
{
std::exception_ptr p = std::current_exception();
std::string s = (p != 0 ? p.__cxa_exception_type()->name() : "null");
printf("DvMain Bad Exception: '%s'\n", s.c_str());
mErrorReporter(0, DvLog::WARNING, 0, Dv::NO_PROFILE, 0, DvLog::UNHANDLED_OTHER_EXCEPTION);
}
而reportOtherException()
的用法如下:
try
{
// Catch and log uncaught exceptions, then exit.
catch (const std::bad_exception& e) { exHandler.reportBadException(e); }
catch (const std::exception& e) { exHandler.reportStandardException(e); }
catch (...) { exHandler.reportOtherException(); }
}
我对C++很陌生,不知道这个错误是什么意思。使用了4.4.7,但不使用4.8
在4.8版上编译时,有什么需要更改的指针吗
编辑I
以下是一些附加信息:
g++ --version
g++ (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
最小代码
DvComDefaultExceptionHandler_test.h
编译命令和输出
编辑II
对include文件的跟踪归结为_GCC_ATOMIC_INT_LOCK_FREE的值。运行这个简单的程序会将“2”打印为uuu GCC\u ATOMIC\u INT\u LOCK\u FREE的值
int
main(int argc, char **argv)
{
printf("__GCC_ATOMIC_INT_LOCK_FREE = %d\n", __GCC_ATOMIC_INT_LOCK_FREE);
}
G++版本:
$ g++ --version
g++ (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
编辑II
我已经在Centos 7虚拟机上运行了g++6.3.1。还是一样的问题
源文件-仅一行
#包括
Compile命令:g++-c-o test.o test.cpp
我能够使用停靠的Centos6和gcc 4.8.2重现您的问题。将开发工具升级到版本6(gcc 6.3.1)后,代码编译没有任何问题。尝试使用以下步骤升级开发工具(建议仅用于测试):
- 通过添加文件/etc/yum.repos.d/devtools-sclo.repo添加sclo centos6存储库:
- 安装devtoolset-6软件包:
yum安装devtoolset-6-binutils devtoolset-6-gcc-c++
- 将bash环境设置为新版本:
scl启用devtoolset-6 bash
现在尝试重新编译您的基本示例和完整源代码
注意:这个存储库还包含devtoolset-3和devtoolset-4的包。如果需要,很容易尝试。首先,直接包括
在技术上不受支持。它在头文件中这样说。在GCC 4.4中,这或多或少是出于偶然。此头文件的C++11迁移破坏了它,因为出于名称空间的原因,C++98代码无法使用ATOMIC\u INT\u LOCK\u FREE
宏,并且头文件不再工作
在GCC 7中,这是作为此错误的一部分修复的(再次意外):
在这个版本中,直接包含
的技巧应该同样有效
这意味着您的选择是:
在C++11或更高版本模式下编译代码(建议使用GCC6的C++14)
如果GCC 7可用,则升级到DTS 7,它具有重新启用C++98 hack的上游修复程序
将std::exception_ptr
的使用包装为不透明类型,以C++11或更高版本模式编译其实现,并将系统的其余部分保持在C++98模式
使用另一个黑客,也许像这样:
#include <exception>
#ifndef ATOMIC_INT_LOCK_FREE
# define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE
#endif
#include <bits/exception_ptr.h>
#包括
#ifndef原子内部无锁
#定义原子\u内部\u锁定\u自由\u GCC\u原子\u内部\u锁定\u自由
#恩迪夫
#包括
同样,这是完全不受支持的,但它不应该比您现在拥有的(GCC4.4)更糟糕
在Red Hat Enterprise Linux 6.9上,我无法用DTS 2再现这一点。请使用devtoolset-2-gcc-c++
软件包版本、一个最简单的示例(可能是触发此操作的一组#include
指令)和完整的编译器命令行来修改您的帖子。您是否使用-std=c++11编译?我已经更新了最简单的代码。我没有使用std=c++11进行编译,我再次尝试使用-std=c++98使用了适用于4.4.7的相同标志。同样的结果。我已经编辑了这个问题,包含了关于uuu GCC_ATOMIC_INT_LOCK_FREE值的信息,这是错误的原因。谢谢您的研究。正如在另一个问题上提到的,升级devtools不起作用。这些指令只适用于64位,似乎没有32位回购可用(?)我创建了一个新的Centos 7 64位虚拟机。我试过g++4.8、5.3和6.3.1。它们都有相同的错误。cpp文件现在只有一行:#include
。你是怎么做到的?@Danny此标题不能直接包含在内。看看它的内容。首先尝试包括。谢谢!!我试试4号黑客。我只想运行地址消毒器,4.8是最接近的版本。即使从4.4.7到4.8,仍有许多新的错误/警告需要解决。迁移到C++11将是一项艰巨的工作,可能需要几个月。这是一个相当大的应用程序。
int
main(int argc, char **argv)
{
printf("__GCC_ATOMIC_INT_LOCK_FREE = %d\n", __GCC_ATOMIC_INT_LOCK_FREE);
}
$ g++ --version
g++ (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
#include <bits/exception_ptr.h>
[testing-devtools]
name=devtools multiple for CentOS
baseurl=http://mirror.centos.org/centos/6/sclo/x86_64/rh/
gpgcheck=0
#include <exception>
#ifndef ATOMIC_INT_LOCK_FREE
# define ATOMIC_INT_LOCK_FREE __GCC_ATOMIC_INT_LOCK_FREE
#endif
#include <bits/exception_ptr.h>