error: ordered comparison of pointer with null pointer [-Werror=extra]

error: ordered comparison of pointer with null pointer [-Werror=extra]

我在 linux arm 体系结构中尝试比较 void pointer addr>(void *)0XFFFE00000000 时出现以下错误。此处 addr 的类型为 void pointer error: ordered comparison of pointer with null pointer [ -Werror=extra]

这仅在 Linux arm 架构中发生,在其他架构中它工作正常

地址>(void *)0XFFFE00000000

如何解决?

可能整数字面量溢出到32位,变成0或者NULL

但是无论如何,您不应该四处比较随机 (void) 指针是否大于某个随机整数。将指针转换为 uintptr_t,并确保字面量也是合适的类型,然后它开始变得更有可能工作。似乎没有 UINTPTR_C() 宏,但使用 UINTMAX_C()?

也许有意义

当然,如果您未指定的 "ARM" 是 32 位的,那么地址就超出了范围,并且可能比指针还大……这会很混乱。

比较两个指针的顺序没有意义,除非两个指针都指向同一个数组(即便如此,它充其量也是有问题的;通常你会使用不等式而不是顺序)。

因为你的实际问题是

my signal's address higher bytes is getting overwritten by 0XFFFE0

首要任务是找出发生这种情况的原因以及是否可以避免:如果地址被覆盖,则表明代码存在严重错误,您应该修复根本原因,而不是比症状。

就是说,如果所需要做的只是将指针的高字节、覆盖字节归零,可移植的方法是将指针转换为整数并操作 that,而不是直接操纵指针:

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*