2015-02-23 49 views
1

libC++是否维护一个进程范围的内部状态,其中在代码的一部分中发生的操作可以通过调用std :: * classes(例如std :: set)来影响代码的某些远端部分?要多一点具体的我见过崩溃像这样(只显示堆栈跟踪的顶部):libC++是否保持内部状态?

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问题可能会对此产生影响,并且怀疑标准库本身是否存在某种状态损坏?

+3

全局'operator new'和'operator delete'维护每个进程的堆。它们被'std :: allocator'使用,所以(默认情况下)被任何分配内存的标准类使用,并且似乎在这里被牵连。破坏堆可能会破坏使用它的任何其他代码。 – 2015-02-23 18:27:27

+1

'std :: __ 1'的错误通常表示您使用的是LLVM的** libC++ **,而不是GNU的** libstdC++ **。 – Macmade 2015-02-23 18:27:37

+0

@Macmade好点让我重新安排我的问题在一瞬间...... – wilsonmichaelpatrick 2015-02-23 18:33:23

回答

5

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

其实通常的问题是,错误只是显然不会造成任何伤害,因为该程序(显然)只是工作。

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

在特定的std::setstd::map在某些实施方式中已知取决于标记,因此覆盖全局变量甚至会影响稍后创建的映射和集合。

几乎在C++中的所有内容都依赖于动态分配的内存,并且违反ABI的程序可能会破坏与之相关的数据结构,并且该效果可能会在稍后显示数百万条执行的指令(例如,损坏的空闲块被重新分配给某些内容其他)。