libc++ 是否维护内部状态?

Does libc++ maintain an internal state?

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 问题的影响远非原因感到惊讶,想知道标准库本身是否有一些状态已损坏?

C++ 不提供受保护的环境。如果代码的任何部分做了一些禁止的事情(例如删除一个对象两次,注销数组的限制......)那么代码的任何其他地方都可以做任何事情,无论是立即还是长时间之后。

实际上,问题通常是错误不会明显造成任何伤害,因为程序(显然)可以正常工作。

关于违反 ABI 的错误是非常低级别的(例如,机器代码可能需要保留某个寄存器,但它没有),没有什么可以让您感到惊讶的。欢迎来到"undefined behavior"地狱。

在特定的 std::setstd::map 中,某些实现已知依赖于哨兵,因此覆盖全局变量甚至会影响以后创建的映射和集合。

此外,C++ 中的几乎所有内容都依赖于动态分配的内存,违反 ABI 的程序可能会破坏与之相关的数据结构,其影响可能会在以后显示数百万条已执行的指令(例如,当损坏的空闲块被重新分配给别的东西)。