【问题标题】:Does libc++ maintain an internal state?libc++ 是否保持内部状态?
【发布时间】:2015-02-23 18:24:36
【问题描述】:

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 问题可能会产生与原因相去甚远的影响,并且想知道标准库本身是否存在某些状态已损坏?

【问题讨论】:

  • 全局 operator newoperator delete 维护每个进程的堆。它们被std::allocator 使用,因此(默认情况下)任何分配内存的标准类都使用它们,并且似乎与这里有关。破坏堆可能会破坏使用它的任何其他代码。
  • std::__1 的错误通常意味着您使用的是 LLVM 的 libc++,而不是 GNU 的 libstdc++
  • @Macmade 好点让我稍后重新安排我的问题...

标签: c++ stl libc++


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2021-09-29
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多