【发布时间】:2016-01-02 22:56:23
【问题描述】:
https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
我在 GCC 5 上使用 std::string 时遇到了崩溃/valgrind 问题。上面的链接暗示从 GCC 5.x 开始的 ABI 发生了变化。 libstd++ 的新默认 ABI 是 C++11/14...,它与旧 ABI 不兼容。有一种方法可以使用定义来选择较旧的 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 影响了哪种代码以及如何修复它——一个开始的地方。
【问题讨论】:
-
如果您始终如一地编译所有对象(使用相同的 ABI),那么您得到的错误是由于您的程序中的错误或(不太可能)新 ABI 实现中的实际错误.在任何一种情况下,将其分解为一个小测试用例并在此处发布(minimal reproducible example)。