C++ quickfix给出的错误

C++ quickfix给出的错误,c++,solaris,quickfix,C++,Solaris,Quickfix,我试图在solaris上运行一个简单的演示quickfix程序,也就是说,在让它做我想做的事情之前 不幸的是,主要应用程序在 FIX::SocketInitiator initiator( application, storeFactory, settings, logFactory); 被称为 用gdb检查内核转储,我明白了 (gdb) where #0 FIX::SessionFactory::create (this=0xffbfee90, sessionID=@0x101fe8, s

我试图在solaris上运行一个简单的演示quickfix程序,也就是说,在让它做我想做的事情之前

不幸的是,主要应用程序在

FIX::SocketInitiator initiator( application, storeFactory, settings, logFactory);
被称为 用gdb检查内核转储,我明白了

(gdb) where
#0  FIX::SessionFactory::create (this=0xffbfee90, sessionID=@0x101fe8, settings=@0x100e34)
at FieldConvertors.h:113
#1  0xff2594ac in FIX::Initiator::initialize (this=0xffbff108) at stl_tree.h:246
#2  0xff25b270 in Initiator (this=0xffbff108, application=@0xffbff424, 
messageStoreFactory=@0xffbff1c4, settings=@0xffbff420, logFactory=@0xffbff338)
at Initiator.cpp:61
#3  0xff25f8a8 in SocketInitiator (this=0xffbff108, application=@0xffbff3c8, 
factory=@0xffbff388, settings=@0xffbff408, logFactory=@0xffbff338) at SocketInitiator.cpp:52
#4  0x0004a900 in main (argc=2, argv=0xffbff4c4) at BondsProClient.cpp:42
我查了FieldConverters.h,我们有了代码

inline char* integer_to_string( char* buf, const size_t len, signed_int t )
{
    const bool isNegative = t < 0;
    char* p = buf + len;

    *--p = '\0';

    unsigned_int number = UNSIGNED_VALUE_OF( t );

    while( number > 99 )
    {
        unsigned_int pos = number % 100;
        number /= 100;
        p -= 2;
        *(short*)(p) = *(short*)(digit_pairs + 2 * pos);
    }

    if( number > 9 )
    {
        p -= 2;
        *(short*)(p) = *(short*)(digit_pairs + 2 * number);  //LINE 113 bus error line
    }
    else
    {
        *--p = '0' + char(number);
    }

    if( isNegative )
        *--p = '-';

    return p;
} 
inline char*integer\u to\u string(char*buf,const size\t len,signed\u int t)
{
常数布尔为负=t<0;
char*p=buf+len;
*--p='\0';
无符号整数值=(t)的无符号整数值;
而(数量>99)
{
无符号的位置=数字%100;
数目/=100;
p-=2;
*(短*)(p)=*(短*)(数字对+2*pos);
}
如果(数量>9)
{
p-=2;
*(短*)(p)=*(短*)(数字对+2*号);//第113行总线错误线路
}
其他的
{
*--p='0'+字符(数字);
}
如果(为负)
*--p='-';
返回p;
} 

看看这个,我其实并不觉得奇怪。它将取消引用作为short传递给函数的char*指针,而不检查对齐方式,这是未知的。这对于任何C/C++标准都是非法的,而且由于SPARC处理器不能执行不对齐的内存访问,所以这个东西显然崩溃了。我在这里真的很胖,还是这是一个在quickfix标题中占很大比例的冰冷虫子?quickfix(根据他们的网站)应该可以在solaris sparc上编译和使用。有人知道这方面的工作吗?我想到了将W标题编辑为sprintf的选项,就像对齐一些东西一样。或者是由于其他原因导致缓冲区未对齐而引起的误会?

如果由于加载/存储未对齐而导致缓冲区崩溃,则您可以更换以下线路:

*(short*)(p) = *(short*)(digit_pairs + 2 * number);
使用memcpy的安全等效物:

memcpy((void *)p, (const void *)(digit_pairs + 2 * number), sizeof(short));

我确信这只是这段代码的冰山一角。阿卡<例如,代码>p-=2。假设
sizeof(short)==2
并不完全正确。如果真的出现了妄想症,你可以自己把两个八位组取出来,然后组装短的。另外,看看这个,我也在想,虽然gcc通常不提供未对齐的内存,但是,
*--p='\0'
实际上会保证指针未对齐。真的,但这并不是我对库标题的想法。我目前正在考虑bug report timeSure-无论是哪种方式,此代码都需要修复-无论对齐问题如何,
*(short*)p
类型双关都会打破严格的别名规则,并可能使用某些编译器/优化设置生成错误代码-可能现在,可能将来…我接受,由于对标头进行了此修改,并且标头在内部被调用,因此除了演示应用程序本身之外,重新编译整个quickfix库使测试应用程序能够实际工作。