V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
forcecharlie
V2EX  ›  C

A bug in GCC that may cause memory leaks in valid C++ programs

  •  
  •   forcecharlie · 2017-04-28 10:43:50 +08:00 · 2517 次点击
    这是一个创建于 2796 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Hacker News 地址:

    https://news.ycombinator.com/item?id=14214034

    原文地址:

    https://akrzemi1.wordpress.com/2017/04/27/a-serious-bug-in-gcc/

    Bug 地址:

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66139

    经测试 clang 和 visual C++ 都是正确的。

    测试 Visual C++ 可以移步: http://webcompiler.cloudapp.net/

    感觉这对 RAII 影很大。

    13 条回复    2017-04-29 09:55:26 +08:00
    AngelCriss
        1
    AngelCriss  
       2017-04-28 11:32:32 +08:00
    所以,构造函数不要抛异常啊。
    limhiaoing
        2
    limhiaoing  
       2017-04-28 11:34:41 +08:00 via iPhone
    @AngelCriss
    都说是 bug 了
    enenaaa
        3
    enenaaa  
       2017-04-28 11:45:32 +08:00
    注意限制使用匿名对象即可
    owt5008137
        4
    owt5008137  
       2017-04-28 13:19:18 +08:00 via Android
    所以即便是 RAII,也不要在构造函数内抛异常
    forcecharlie
        5
    forcecharlie  
    OP
       2017-04-28 13:23:18 +08:00
    @limhiaoing
    @owt5008137
    @enenaaa
    @AngelCriss

    这个是个 bug,clang 和 vc++ 行为正常。
    Monad
        6
    Monad  
       2017-04-28 13:41:14 +08:00
    RAII 可不能搞一个 temporary 对象
    所以是怎么发现的...
    owt5008137
        7
    owt5008137  
       2017-04-28 16:19:27 +08:00 via Android
    @forcecharlie 即便是个 BUG,你也得为它买单
    forcecharlie
        8
    forcecharlie  
    OP
       2017-04-28 16:58:31 +08:00
    @owt5008137 针对这个 bug 评估风险,风险大的地方我已经使用 clang 了,比如 基于 cpprestsdk 的 git LFS 服务器( Linux ),安装文档要求使用 clang。部署脚本优先使用 clang。
    limhiaoing
        9
    limhiaoing  
       2017-04-29 08:45:32 +08:00 via iPhone
    @owt5008137
    C++引入异常的一个原因就是用于报告构造函数错误,所以构造函数抛异常是很合理的做法。
    这个 bug 使用了 C++11 的特性,意味着老的代码不需要有这方面的顾虑。
    limhiaoing
        10
    limhiaoing  
       2017-04-29 09:06:50 +08:00 via iPhone
    15 年报告的 bug,但 gcc 似乎不着急解决。
    bug 单里 Tomasz Kamiński 的例子的写法在 C++11 其实还是挺常见的。
    在 gcc 解决前想继续使用 gcc 编译的话可以用代码静态分析扫描一遍,给 aggregate initialization 的匿名对象加个变量名就好了。
    limhiaoing
        11
    limhiaoing  
       2017-04-29 09:16:16 +08:00 via iPhone
    @owt5008137
    另外这个 bug 并不是构造函数抛异常导致的,bug 单里 Tomasz Kamiński 的例子是 std::basic_string::at 抛的异常。
    limhiaoing
        12
    limhiaoing  
       2017-04-29 09:17:15 +08:00 via iPhone
    @limhiaoing
    说错了,是 std::vector::at 抛的异常。
    owt5008137
        13
    owt5008137  
       2017-04-29 09:55:26 +08:00 via Android
    @limhiaoing 确实比较坑。所以很多 c++项目和我们都是不使用异常的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3264 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 12:12 · PVG 20:12 · LAX 04:12 · JFK 07:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.