gpt4 book ai didi

c - 编译器-调试器的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 16:16:15 24 4
gpt4 key购买 nike

这个问题与我在此分享的上一个问题密切相关。然而....

我有一个相当大的项目,我正在对其进行单元测试和集成测试。不幸的是,我无法共享代码,除了小片段之外,无论如何,它都需要一个大型项目来共享。

我会尽力总结...类型定义如下:

typedef struct { 
s32 s32IntLimitHigh;
s32 s32IntLimitLow;
s32 s32RegLimitHigh;
s32 s32RegLimitLow;
u16 u16IntGain;
u16 u16PropGain;
u16 u16IntStep;
BOOL BOOLFreeze;
} structPIreg;

从名字上就可以清楚地看出单个成员的类型。
两个数组定义如下:

structPIreg expected_VectParPI[VECT_PI_LENGTH];
structPIreg VectParPI[VECT_PI_LENGTH];

由于它用于单元测试,我有原始变量及其期望值。该数组有 8 个元素。

sizeof (VectParPI[1]) is 29 :

4*s32 + 3*u16 + BOOL = 4*4+3*4+1 = 29
u16 在原始机器上是 16 位,在 x86 架构上它是 32 位。

我编译,运行测试,然后得到奇怪的结果。所以我开始调试 session ,事情变得更加奇怪。

现在的问题是两个变量的结构大小似乎不同。我在调试器上看到的内容是一致的。

我将贴两张变量监 window 口的图片来让您理解。在此监 window 口中,我计算两个数组的第二个元素和第一个元素之间的字节偏移量。

(char*)&VectParPI[1]-(char*)&VectParPI[0]   long    32  
(char*)&expected_VectParPI[1]-(char*)&expected_VectParPI[0] long 29

watch windows

正如您所看到的,偏移量是不同的。但我不明白为什么。在目标文件中,同一类型的两个不同变量的偏移量/大小如何不同?

更有趣的是,当我启动调试器并且 gdb 在 main 上暂停时,这两个大小是正确的(各 29)。然后我在某处设置了一个断点,当断点被击中时,我看到大小为 32 和 29。

内存地址怎么可能改变?就好像结构在内存中发生了转移。我就是不明白为什么......

作为我不是在做梦的“证明”,我附上了与以前相同的观察窗。您可以看到 eclipse/gdb 以黄色突出显示了大小和偏移量,因为在某些时候它们从 29 更改为 32。够有趣的......:)

highlighted watch window

最佳答案

4*s32 + 3*u16 + BOOL = 4*4+3*4+1 = 29

不是此结构的预期sizeof。由于填充,预期的 sizeof 为 32。

您获得 29 的原因是该结构具有 __attribute__((packed)),而您获得两种不同尺寸的事实意味着您的某些编译单元具有 packed 属性,而其他编译单元则没有。

这违反了单一定义规则,并且是未定义的行为。

您需要找到这个打包的来源,并使其在整个程序中保持一致。

关于c - 编译器-调试器的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56700536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com