C 错误:指针与空指针的有序比较[-Werror=extra]

C 错误:指针与空指针的有序比较[-Werror=extra],c,pointers,arm,archlinux-arm,C,Pointers,Arm,Archlinux Arm,在尝试比较void pointer addr>(void*)0XFFFE00000000时,我在linux arm体系结构中遇到以下错误。此处addr的类型为void pointer error:指针与空指针的有序比较[-Werror=extra] 这只发生在Linux arm体系结构中,在其他体系结构中工作正常 地址>(无效*)0XFFFE00000000 如何解决这个问题?可能整数文本溢出到32位,变成0或NULL 但无论如何,您不应该到处比较随机(void)指针是否大于某个随机整数。将指针

在尝试比较void pointer addr>(void*)0XFFFE00000000时,我在linux arm体系结构中遇到以下错误。此处addr的类型为void pointer error:指针与空指针的有序比较[-Werror=extra]

这只发生在Linux arm体系结构中,在其他体系结构中工作正常

地址>(无效*)0XFFFE00000000


如何解决这个问题?

可能整数文本溢出到32位,变成0或
NULL

但无论如何,您不应该到处比较随机(
void
)指针是否大于某个随机整数。将指针投射到
uintptr\u t
,并确保该文本也是合适的类型,然后它就开始工作。似乎没有
uintpttr_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);
}
const uintptpr\u t mask\u bytes=0xFFFE;
常数int mask_WITH=4*字符位;/?!

const uintpttr_t mask=掩码字节您忘记询问question@OznOg问题是如何解决这个问题,因为我的代码已在除linux之外的所有其他平台上编译,请尝试显示一些代码。。难以确定的描述errors@OznOgaddr>(void*)0XFFFE00000000这是一行代码,用于排序的比较指针没有任何意义,除非两个指针都指向同一个数组(即使这样,它也有问题)。ARM编译器拒绝代码是正确的,理想情况下,其他编译器也会拒绝它。解决方法是使用相等比较,而不是小于。为什么我检查这个随机地址可以归因于这个问题:我在另一个问题中问了我的实际问题,为什么信号会偏移。您建议的上述代码在32位中没有左移,所以掩码将为0XFFFE。问题是我的地址是28-32位,对于32位,如果地址的下两个字节是0XFFFE,它将遇到if条件并屏蔽地址,这将再次导致问题。为了更清楚地了解我的问题,偏移量不是在32位中发生的,当地址的较高16位被覆盖时,偏移量是在64位中随机发生的。更好的方法是包括64位的宏,但是我不允许这样做,因为代码必须是32位和64位的通用代码。信号的用户ID正在更改为NONOBY(65534),因此偏移量0XFFFE