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的错误是非常低级别的(例如,可能需要机器代码来保留某个寄存器,但它没有),你不会感到惊讶。欢迎来到"未定义行为"地狱。
在特定的std::set
和std::map
中,在某些实现中已知它们依赖于哨兵,因此覆盖全局变量甚至会影响稍后创建的映射和集合。
此外,C++中的几乎所有东西都依赖于动态分配的内存,违反ABI的程序可能会破坏与之相关的数据结构,其影响可能会在以后表现出数百万条执行的指令(例如,当损坏的空闲块被重新分配给其他东西时)。
- 将函数类成员映射到类本身内部
- Boost Spirit,获取迭代器内部语义动作
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 内联函数中具有内部链接的全局变量
- 在函数内部的声明中初始化数组,并在外部使用它
- 如何在不知道向量大小的情况下输入向量内部的向量?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 卷曲bracers内部结构的声明
- 从函数角度看ID到文件路径的内部与外部映射
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 启动状态机无法在启动时处理内部转换
- 精神X3:具有内部状态的解析器
- 如何在函数内部使用 zmq(以非阻塞方式)在客户端请求时获取函数的状态?
- 什么是内部::状态::输入,并且在中间定义了什么
- 复制有状态分配器:标准库分配器语义和内部内存
- 分布和内部状态
- libc++是否维护内部状态
- 在开关状态情况下,模板功能内部的不同类型的分配
- 如何修改/更新通过 const 引用传递的对象的内部状态
- C++lambda如何/可以保持内部状态