当前位置:  开发笔记 > 编程语言 > 正文

了解GCC 5的_GLIBCXX_USE_CXX11_ABI或新的ABI

如何解决《了解GCC5的_GLIBCXX_USE_CXX11_ABI或新的ABI》经验,为你挑选了2个好方法。

https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html

我在GCC 5上使用std :: string遇到了崩溃/ valgrind问题.上面的链接提示ABI从GCC 5.x开始发生了变化.libstd ++的新默认ABI是C++ 11/14 ...它与旧的ABI不兼容.有一种方法可以使用define选择较旧的ABI.

我试图了解ABI之间有什么区别,但没有找到详细信息.我想帮助理解:

    需要修复std :: string的哪些问题才能与新的ABI兼容?他们是否与写字有关?

    这些变化是否会破坏旧的ABI?

    让_GLIBCXX_USE_CXX11_ABI工作的任何提示?

关于我遇到的问题的更多细节(https://github.com/YasserAsmi/jvar/issues/21)该项目在GCC 4.8和Clang中运行良好.使用GCC,相同的代码拒绝运行:

x_misc(33112,0x7fff728c2000) malloc: *** error for object 0x7fd639c034cc:    pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

这是部分Valgrind输出:

==33027== Invalid read of size 1
==33027==    at 0x1006F78BA: _platform_memmove$VARIANT$Nehalem (in /usr/lib/system/libsystem_platform.dylib)
==33027==    by 0x100009388: jvar::Variant::toString[abi:cxx11]() const (in bin/ex_misc)
==33027==    by 0x1000023A7: bugreport() (in bin/ex_misc)
==33027==    by 0x1000133B8: main (in bin/ex_misc)

该项目使用std :: string并具有一些自定义内存管理.它正在使用放置新构造函数等进行一些非典型但有效的操作.我试图更好地理解API对哪种代码的影响以及如何修复它 - 一个开始的地方.



1> Mark B..:

    旧版本std::string不符合C++ 11,因为该标准禁止写入时复制实现.在std::string没有破坏ABI 的情况下无法创建兼容性,因此他们这样做是为了返回不兼容的版本以实现ABI兼容性.

    是.

    确保程序中的所有翻译单元使用相同的值,_GLIBCXX_USE_CXX11_ABI您应该没问题.如果你将它们混合在翻译单元中,你肯定会遇到问题.你可能会,如果你有在不沟通不同的翻译单位的定义不同的值是确定strings到对方.



2> Artyom..:

例如,COW和非COW字符串之间有一个有趣的区别:

std::string some_string;
std::string foo()
{
   return some_string;
}

char const *s = foo().c_str();
printf("%s\n",s);

这将与COW字符串一起使用,因为some_string和foo返回的c_str()指向相同的内存,但是当不是COW时,一旦foo销毁了返回的std :: string,s就会失效。

从样本那里,您应该研究这个方向。


K ...但是通过尝试使用从临时std :: string中提取的指针(作为从foo()返回的值创建)提取的指针,这仍然不是未定义的行为吗?由于允许但不要求COW,因此您不能假定它正在运行。
这是未定义的行为,但是当字符串为COW而不是使用非COW字符串时,可能导致隐藏的错误。
那你就怪错了。隐藏的错误是由于未定义的行为,而不是由于COW的存在。与取消引用`nullptr`导致(或不引起)程序崩溃没有什么不同。
我不是在怪我在解释旧的ABI可能如何工作,而新的ABI不能工作-代码似乎具有这样的功能
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有