尝试比较 void 指针 addr>(void *)0XFFFE00000000 时,我在 linux arm 体系结构中遇到以下错误。这里 addr 的类型为 void 指针错误:指针与空指针的有序比较 [-Werror=extra]
这只发生在 Linux arm 架构中,在其他架构中它工作正常
地址>(void *)0XFFFE00000000
如何解决这个问题?
尝试比较 void 指针 addr>(void *)0XFFFE00000000 时,我在 linux arm 体系结构中遇到以下错误。这里 addr 的类型为 void 指针错误:指针与空指针的有序比较 [-Werror=extra]
这只发生在 Linux arm 架构中,在其他架构中它工作正常
地址>(void *)0XFFFE00000000
如何解决这个问题?
可能整数文字溢出到 32 位,变成 0 或NULL
.
但是无论如何,您不应该到处比较随机 ( void
) 指针是否大于某个随机整数。将指针转换为uintptr_t
,并确保文字也是合适的类型,然后它开始变得更有可能工作。似乎没有UINTPTR_C()
宏,但使用UINTMAX_C()
?
当然,如果您未指定的“ARM”是 32 位的,那么地址超出范围并且可能大于指针会......非常混乱。
比较两个指针的顺序是没有意义的,除非两个指针都指向同一个数组(即使这样它充其量也是有问题的;通常你会使用不等式而不是排序)。
因为你的实际问题是
我的信号地址高字节被 0XFFFE0 覆盖
首要任务是找出为什么会发生这种情况以及是否可以防止它:如果地址被覆盖,这表明代码存在严重错误,您应该解决根本原因而不是症状。
也就是说,如果所需要的只是将指针的更高、覆盖的字节归零,那么可移植的方法是将指针转换为整数并对其进行操作,而不是直接操作指针:
const uintptr_t mask_bytes = 0xFFFE;
const int mask_width = 4 * CHAR_BIT; // ?!
const uintptr_t mask = mask_bytes << ((sizeof(uintptr_t) * CHAR_BIT) - mask_width);
uintptr_t uaddr = (uintptr_t) addr;
if ((uaddr & mask) == mask) {
addr = (void*) (uaddr & ~ mask);
}
…void*
用您的实际指针类型替换。