记两个gcc的bug

一般来说程序的编译、运行遇到问题,只会怀疑code有问题,而不会怀疑是编译器的问题。不过日子久了,总会遇到各种各样奇怪的问题,最近遇到了两个gcc相关的bug,记录一下。

问题一

在编译一个并不复杂的文件的时候,gcc报内存不够的错误。
这个文件只是定义了一个嵌套了几层的std::map,而且,如果用GCC 4.8来编译,很快就编译完了,占的内存也不多。
然而,如果用GCC 6.2 (或者最新的7.1)来编译,会发现占用的时间非常长,而且占用内存特别多,最终(如果内存不够)会报internal compiler error: Killed的错。
观察发现,在编译的过程中gcc占用的内存越来越多,分配了足够多的swap之后能编译成功,最终内存要占到16~20GiB左右。
同事去submit了一个bug,https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80290,被confirm了。
不过,从comments看,似乎还挺复杂的,什么时候能修好,就难说了。。。
另外,用clang的话也不会出现这个bug。

问题二

在一个动态库里,遇到一个std::unique_ptr相关的segment fault。这个变量在constructor里明明创建过了,但是运行时发现它还是nullptr
简化一下问题,如果一个动态库里有类似这样的code:

std::unique_ptr<MyStruct> s = nullptr;
void onLoad() __attribute__((constructor));
void onLoad()
{
  s = std::make_unique<MyStruct>();
}

当这个动态库被dlopen的时候,我期望s会被onLoad()初始化好,然而在别的函数里用这个s的时候,会segment fault,因为s里面是个空指针!
关于这个问题,我在SO上提了个问题,结果发现,跟这个GCC的这个bug有关:

简单的说,动态库里 constructor 和 global/static 变量的初始化顺序是unspecified,所以有可能onLoad()先执行,然后再初始化global变量s, 把它初始化成nullptr。注意这个时候只是初始化,原来的变量并不会被析构,其实也是内存泄露。
不过,这个bug看上去暂时不会被修复,只是会在文档里注明这种情况初始化顺序是不定的。
要修复这个问题,需要给变量指定初始化顺序:

std::unique_ptr<MyStruct> s __attribute__((init_priority(101))) = nullptr;

注意init_priority的值设为101~65534都可以。 0~100是reserved,用了会有warning; 最大值是65535,也是默认值,要是设成65535,就和__attribute__((constructor))一样,顺序就变成unspecified了。
另外,clang也支持这个属性,表现也gcc一样,有同样的bug。

Share
  • 增达网:
    ——————————
    终生只需99元,让百万人每天浏览你的广告,每次浏览十秒时间。

    终生只需99元,免费下载群发软件,无使用限制,全部是破解版。

    终生只需99元,让你什么不干躺着就赚钱,上线替下线发展会员。
    ——————————
    群发软件免费下,无限广告免费发,

    百万流量免费享,十级提成免费拿。
    ——————————
    注册网址:

    http://www.wo.zengda.xin/
    ——————————
    免费会员,不花钱,照样赚
    ——————————

  • 增达网:
    ——————————
    终生只需99元,让百万人每天浏览你的广告,每次浏览十秒时间。

    终生只需99元,免费下载群发软件,无使用限制,全部是破解版。

    终生只需99元,让你什么不干躺着就赚钱,上线替下线发展会员。
    ——————————
    群发软件免费下,无限广告免费发,

    百万流量免费享,十级提成免费拿。
    ——————————
    注册网址:

    http://www.wo.zengda.xin/
    ——————————

  • 很荣幸来到这里参观!

  • 缘份的人生很精彩,诚挚的友谊不更改。

  • 相当精彩的博客!

  • 增达网:

    终生只需99元,让百万人每天浏览你的广告,每次浏览十秒时间。

    终生只需99元,免费下载群发软件,无使用限制,全部是破解版。

    终生只需99元,让你什么不干躺着就赚钱,上线替下线发展会员。

    注册网址:

    http://www.hai.zengda.xin/

    人和团队

    电话:13952023434

    QQ号:1542254052

  • 好好学习,天天向上

  • 好几年没用过博客了,支持下!

  • 增达网:

    逆向网赚,上线替下线赚钱,什么不干,坐收四十万。

    ①,让百万人每天浏览你的广告,每次浏览十秒时间。

    ②,免费下载营销软件,无使用限制,全部是破解版。

    ③,逆向推荐模式,自动下滑,上线替下线发展会员。

    详情登陆会员区查看。注册网址:

    http://www.cxb.356688.com/

    联系QQ-33092290

    凡我下线升级VIP立返人民币30元,不升级勿扰!

  • 这个不错哦,我好好读读!

  • 看看你的博客,也是一种娱乐!

  • 抱着学习的态度来看看

  • 我也有过博客,不过那都是很多年前的事情了!

  • 值得思考哦,受教了!

  • 来看看总能学到一点东西!