在Solaris8.32位应用程序上用g++ 4.7.4编译。堆栈跟踪是
Core was generated by `./z3'.
Program terminated with signal 10, Bus error.
\#0 0x012656ec in vector<unsigned long long, false, unsigned int>::push_back (this=0x2336ef4 <g_prime_generator>, elem=@0xffbff1f0: 2) at ../src/util/vector.h:284
284 new (m_data + reinterpret_cast<SZ *>(m_data)[SIZE_IDX]) T(elem);
(gdb) bt
\#0 0x012656ec in vector<unsigned long long, false, unsigned int>::push_back (this=0x2336ef4 <g_prime_generator>, elem=@0xffbff1f0: 2) at ../src/util/vector.h:284
\#1 0x00ae66d4 in prime_generator::prime_generator (this=0x2336ef4 <g_prime_generator>) at ../src/util/prime_generator.cpp:24
\#2 0x00ae714c in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) at ../src/util/prime_generator.cpp:99
\#3 0x00ae71c4 in _GLOBAL__sub_I_prime_generator.cpp(void) () at ../src/util/prime_generator.cpp:130
\#4 0x00b16a68 in __do_global_ctors_aux ()
\#5 0x00b16aa0 in _init ()
\#6 0x00640b10 in _start ()
(gdb) list
279
280 void push_back(T const & elem) {
281 if (m_data == 0 || reinterpret_cast<SZ *>(m_data)[SIZE_IDX] == reinterpret_cast<SZ *>(m_data)[CAPACITY_IDX]) {
282 expand_vector();
283 }
284 new (m_data + reinterpret_cast\<Z *>(m_data)[SIZE_IDX]) T(elem);
285 reinterpret_cast<SZ *>(m_data)[SIZE_IDX]++;
286 }
287
288 void insert(T const & elem) {
(gdb) ptype SZ
type = unsigned int
(gdb) ptype m_data
type = unsigned long long *Solaris上的SIGBUS通常表示未对齐的访问,但我不确定这是否是由于字符顺序问题上的强制转换所致
发布于 2015-10-16 00:52:55
最有可能出现问题的是SPARC数据对齐要求。向量类中的m_data字段由用于存储向量的大小和容量的两个字段表示。您可以通过显示(打印或使用调试器)指针m_data及其对齐来对其进行调试。
一种选择是提供单独的向量实现,其中大小和容量字段直接存储在向量中的字段中,以便移植此库实用程序。
Z3与内存对齐在其他一些地方交互(但并不是太多)。其他主要的潜在位置是监视列表(sat_solver和smt_context)、区域内存分配器(region.h)以及可能的哈希表。
https://stackoverflow.com/questions/33153105
复制相似问题