本周我们在这里遇到的有趣问题。
我们在哈佛架构嵌入式平台上使用 C 语言工作,该平台具有 16 位数据地址和 32 位代码地址。
当您使用函数指针时会出现此问题。如果你有类似的代码
if (fp) fp();
或者
if (fp != 0) fp();
一切安好。
但是,如果您有类似的代码
if (fp != NULL) fp();
然后,因为NULL
定义为(void *) 0
,所以编译器(在这种情况下为 gcc)a) 不会发出警告,并且 b) 对您的函数指针进行 16 位比较,而不是 32 位比较。只要您的函数指针不恰好位于 64k 边界上,所以所有底部 16 位都是 0,就可以了。
目前,我们有大量代码,其中包含针对 NULL 的显式检查。它们中的大多数将是数据指针,但其中一些将是函数指针。快速 grep!= NULL
或== NULL
显示 3000 多个结果,许多人需要手动检查。
所以,我们现在想要的是
一种查找比较函数指针(但不是数据指针)的所有情况的方法(因此我们可以将它们与我们定义为 32 位 0 的 FP_NULL 进行比较),或者
重新定义 NULL 以使其做正确的事情。
(或者,我想,更新我们的 gcc 端口以检测并正确处理这种情况)。
我想不出任何适用于 1 的方法。我能想到的唯一方法 2 是将 NULL 重新定义为 0 函数指针,这对于绝大多数针对数据指针的比较来说是非常浪费的。(32 位比较是 4 条指令,16 位比较是 1 条指令)。
有什么想法或建议吗?