GCC 在不应该的地方添加取消引用
GCC adding dereference where there shouldn't be
我正在使用 gcc
为 mips32
编译,我在全局范围内声明了一个指向名为 OSEvent
的结构的指针,如下所示:
OSEvent *__osMainEventQueue = NULL;
此外,某个函数中的代码在函数调用期间引用了此指针:
__osEnqueueEvent(event, __osMainEventQueue);
该函数声明如下:
extern void __osEnqueueEvent (OSEvent *event, OSEvent *queue);
然而,在调试此代码时,gcc
似乎取消引用指向 __osMainEventQueue
的指针,尽管我没有在其中放置任何内容。您可以在反汇编中看到这一点,如下所示:
118: 3c020000 lui v0,0x0
118: R_MIPS_HI16 __osMainEventQueue
11c: 8c420000 lw v0,0(v0)
11c: R_MIPS_LO16 __osMainEventQueue
120: 00402825 move a1,v0
124: 8fc40018 lw a0,24(s8)
128: 0c000000 jal 0 <osScheduleEvent>
128: R_MIPS_26 __osEnqueueEvent
12c: 00000000 nop
gcc 取消引用该指针有什么原因吗?我需要用 &
引用它吗? (这会导致类型不匹配警告,所以我认为这不是一个令人满意的解释/答案)
没有指针解除引用。代码只是将 __osMainEventQueue
的 value 加载到 $a1
(即它指向的地址)。
考虑以下情形:__osMainEventQueue
位于地址 0x12345678
并包含值 0xDEADBEEF
。所以 lui
和 lw
组合所做的是首先用值 0x12340000
加载 $v0
。然后它从 0x5678($v0)
加载,即从 (0x12345678)
加载,所以你最终在 $v0
中得到 0xDEADBEEF
。在此代码中从来没有尝试读取 (0xDEADBEEF)
。
我正在使用 gcc
为 mips32
编译,我在全局范围内声明了一个指向名为 OSEvent
的结构的指针,如下所示:
OSEvent *__osMainEventQueue = NULL;
此外,某个函数中的代码在函数调用期间引用了此指针:
__osEnqueueEvent(event, __osMainEventQueue);
该函数声明如下:
extern void __osEnqueueEvent (OSEvent *event, OSEvent *queue);
然而,在调试此代码时,gcc
似乎取消引用指向 __osMainEventQueue
的指针,尽管我没有在其中放置任何内容。您可以在反汇编中看到这一点,如下所示:
118: 3c020000 lui v0,0x0
118: R_MIPS_HI16 __osMainEventQueue
11c: 8c420000 lw v0,0(v0)
11c: R_MIPS_LO16 __osMainEventQueue
120: 00402825 move a1,v0
124: 8fc40018 lw a0,24(s8)
128: 0c000000 jal 0 <osScheduleEvent>
128: R_MIPS_26 __osEnqueueEvent
12c: 00000000 nop
gcc 取消引用该指针有什么原因吗?我需要用 &
引用它吗? (这会导致类型不匹配警告,所以我认为这不是一个令人满意的解释/答案)
没有指针解除引用。代码只是将 __osMainEventQueue
的 value 加载到 $a1
(即它指向的地址)。
考虑以下情形:__osMainEventQueue
位于地址 0x12345678
并包含值 0xDEADBEEF
。所以 lui
和 lw
组合所做的是首先用值 0x12340000
加载 $v0
。然后它从 0x5678($v0)
加载,即从 (0x12345678)
加载,所以你最终在 $v0
中得到 0xDEADBEEF
。在此代码中从来没有尝试读取 (0xDEADBEEF)
。