Tag: 哈佛建筑

哈佛架构平台上的NULL指针问题

我们本周在这里遇到了有趣的问题。 我们在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 for != NULL或== NULL显示超过3000个结果,许多人通过手动检查。 所以,我们现在想要的也是 找到比较函数指针(但不是数据指针)的所有情况的方法(所以我们可以将它们与我们定义为32位0的FP_NULL进行比较),或者 以这样的方式重新定义NULL,以便它做正确的事情。 (或者,我想,更新我们的gcc端口以检测并正确处理这种情况)。 我无法想到任何适用于1的方法。我能想到的唯一方法是将NULL重新定义为0函数指针,这对于绝大多数针对数据指针的比较来说都是非常浪费的。 (32位比较是4条指令,16位比较是1条指令)。 有什么想法或建议吗?