C++ 升级到G++;4.8-异常\u ptr.h不支持异常传播

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

我正试图用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 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>