C++ 使用decNumber库的内部C应用程序的分段错误

C++ 使用decNumber库的内部C应用程序的分段错误,c++,memory,segmentation-fault,memory-address,C++,Memory,Segmentation Fault,Memory Address,我遇到了一个使用decNumber的内部应用程序的分段错误。它在debian挤压上像一个符咒,但在喘息时seg会出错!!比较内存位置,我的发现如下: decNumber.h #if DECDPUN<=2 #define decNumberUnit uint8_t #elif DECDPUN<=4 #define decNumberUnit uint16_t #else #define decNumberUnit uint32_t #endif /* The number o

我遇到了一个使用decNumber的内部应用程序的分段错误。它在debian挤压上像一个符咒,但在喘息时seg会出错!!比较内存位置,我的发现如下:

decNumber.h

#if   DECDPUN<=2
 #define decNumberUnit uint8_t
#elif DECDPUN<=4
 #define decNumberUnit uint16_t
#else
 #define decNumberUnit uint32_t
#endif
/* The number of units needed is ceil(DECNUMDIGITS/DECDPUN)         */
#define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)

/* The data structure... */
typedef struct {
int32_t digits;      /* Count of digits in the coefficient; >0    */
int32_t exponent;    /* Unadjusted exponent, unbiased, in         */
                     /* range: -1999999997 through 999999999      */
uint8_t bits;        /* Indicator bits (see above)                */
                     /* Coefficient, from least significant unit  */
decNumberUnit lsu[DECNUMUNITS];
} decNumber;
在压缩日志上显示: &a:0x7fff7dd66880和b:0x7fff7dd66870和c:0x7fff7dd66850

喘息日志显示: &a:0x7fff09167078&b:0x7fff09167084&c:0x7fff0916709c

挤压上的地址从最高位置移动到最低位置是有意义的。有人能解释一下呼吸机上发生了什么吗

// values before the call on Squeeze machine: c.digits = 3 ,   &a:0x7fff7dd66880 &a.exponent:0x7fff7dd66884 &a.bits:0x7fff7dd66888 &a.lsu:0x7fff7dd6688a lsu size=2 . Similarly for b &b:0x7fff7dd66870...
// values before the call on Wheezy machine : c.digits = 3 , &a:0x7fff09167078 &a.exponent:0x7FFF0916707C &a.bits:0x7FFF09167080 &a.lsu:0x7FFF09167082 lsu size=2. Similarly for b &b:0x7fff09167084...
decNumberMultiply(&res, &a, &b, &set);
// value after the call on Squeeze mahcine: c.digits = 3
// value after the call on Wheezy mahcine: c.digits = 721007 -- modified!!!!. Why??

即使结构没有在Wheezy上的16字节边界对齐,我也看不到跨结构a、b和c的地址重叠。那么decNumberMultiply修改结构c的调用是如何实现的呢?

您需要提供一个自包含的测试用例。人们可以尝试测试并重现问题。检查
decnumbernit lsu[DECNUMUNITS]
的地址在两种平台上是否与4字节对齐。如果不是,那么您应该在上面添加
uint8\u t reserved[3]
“谢谢您的回复。在两种平台上,lsu(和位字段)的大小均为2字节。但是,只有12个字节被分配给Wheezy中的结构,而挤压则分配16个字节以到达4字节边界。其他信息://调用挤压机之前的值:c.digits=3,&a:0x7fff7dd66880&a.index:0x7fff7dd66884&a.bits:0x7fff7dd66888&a.lsu:0x7fff7dd6688a lsu size=2。同样适用于b&b:0x7fff7dd66870…//在呼吸机上调用之前的值:c.digits=3,&a:0x7fff09167078&a.index:0x7FFF0916707C&a.bits:0x7FFF09167080&a.lsu:0x7FFF09167082 lsu size=2。同样适用于b&b:0x7fff09167084。。。decNumberMultiply(&rs,&a,&b,&set);//调用挤压机后的值:c.digits=3//调用喘息机后的值:c.digits=721007-修改!!。为什么?
// values before the call on Squeeze machine: c.digits = 3 ,   &a:0x7fff7dd66880 &a.exponent:0x7fff7dd66884 &a.bits:0x7fff7dd66888 &a.lsu:0x7fff7dd6688a lsu size=2 . Similarly for b &b:0x7fff7dd66870...
// values before the call on Wheezy machine : c.digits = 3 , &a:0x7fff09167078 &a.exponent:0x7FFF0916707C &a.bits:0x7FFF09167080 &a.lsu:0x7FFF09167082 lsu size=2. Similarly for b &b:0x7fff09167084...
decNumberMultiply(&res, &a, &b, &set);
// value after the call on Squeeze mahcine: c.digits = 3
// value after the call on Wheezy mahcine: c.digits = 721007 -- modified!!!!. Why??