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*
。
我在 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*
。