libc++是否维护了一个进程范围内的内部状态,其中发生在代码某一部分中的操作可以通过调用std::*类(例如std::set)影响代码的某些遥远部分?更确切地说,我看到了类似这样的崩溃(只显示堆栈跟踪的顶部):
std::__1::__tree<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::less<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >::__insert_unique(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 156, stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
修复方法是升级一个与崩溃无关的库,以纠正C++ ABI问题。我只是感到惊讶的是,ABI问题可能会产生远离原因的影响,并且怀疑标准库本身是否存在某种状态损坏?
发布于 2015-02-23 18:40:24
C++不提供受保护的环境。如果代码的任何部分做了一些被禁止的事情(例如删除一个对象两次,取消数组的限制.)那么,代码的任何其他位置都可以执行任何操作,无论是立即执行,还是经过很长一段时间之后。
实际上,问题往往是错误显然不会造成任何伤害,因为程序(显然)只是起作用了。
关于违反ABI的错误非常低(例如,可能需要机器代码来保存特定的寄存器,但它不需要),而且您没有什么可惊讶的。欢迎来到“未定行为”地狱。
在特定的std::set和std::map中,已知某些实现依赖于哨兵,因此覆盖全局变量甚至会影响以后创建的映射和集合。
而且,C++中的几乎所有东西都依赖于动态分配的内存,而违反ABI的程序可能破坏与此相关的数据结构,其效果可能在以后显示数百万条执行的指令(例如,损坏的空闲块被重新分配用于其他事情时)。
https://stackoverflow.com/questions/28680694
复制相似问题