-1

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

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

地址>(void *)0XFFFE00000000

如何解决这个问题?

4

2 回答 2

1

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

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

当然,如果您未指定的“ARM”是 32 位的,那么地址超出范围并且可能大于指针会......非常混乱。

于 2019-06-12T19:51:16.033 回答
0

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

因为你的实际问题是

我的信号地址高字节被 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*用您的实际指针类型替换。

于 2019-06-21T09:31:45.433 回答