在 C99 中,平等==
似乎从来没有未定义过。它可以产生1
如果您意外地将其应用到无效地址(例如&x + 1 == &y
可能是偶然的事实)。它不会产生未定义的行为。许多(但不是全部)无效地址未定义为根据标准计算/使用,因此p == &x
with p
悬空指针,或者&x + 2 == &y
,无效地址导致未定义的行为,而不是==
.
另一方面,>=
当应用于不指向同一对象内的指针时,其他比较是未定义的。这包括测试q >= NULL
where q
是一个有效的指针。这个测试就是我的问题的主题。
我致力于低级嵌入式代码的静态分析器。此类代码执行标准允许之外的操作是正常的。例如,在这种代码中,可以使用以下方式初始化指针数组memset(...,0,...)
,尽管标准没有明确指出NULL
and 0
必须具有相同的表示。为了有用,分析器必须接受这种事情并按照程序员期望的方式解释它们。警告程序员将被视为误报。
所以分析器已经假设NULL
and 0
具有相同的表示(您应该根据分析器检查编译器以确保它们同意这种假设)。我注意到有些程序将有效指针与 NULL 进行比较>=
(这个图书馆 http://quicklz.com/是一个例子)。只要这样就可以按预期工作NULL
表示为0
指针比较被编译为无符号整数比较。
我只希望分析器对此发出警告,如果可能由于某些积极的优化,它可能被编译成与程序员在传统平台上的意思不同的东西。因此我的问题是:有没有程序不评估的例子q >= NULL
as 1
,在一个平台上NULL
表示为0
?
注意:这个问题不是关于在指针上下文中使用 0 来获取空指针。关于表示的假设NULL
是一个真实的假设,因为没有转换memset()
例子。
肯定有一些指针,当您将它们重新解释为指针大小的有符号整数时,它们将带有负号。
特别是 Win32 上的所有内核内存,如果您使用“大地址感知”,那么甚至 1GB 的用户空间,因为您将获得 3GB 的用户空间。
我不知道 c 指针算术的细节,但我怀疑这些在某些编译器中可能会比较为
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)