代码之家  ›  专栏  ›  技术社区  ›  Vicky

哈佛建筑平台上的空指针问题

  •  17
  • Vicky  · 技术社区  · 15 年前

    这周我们遇到了一个有趣的问题。

    我们在一个哈佛架构嵌入式平台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。

    目前,我们有大量的代码,其中包含对空值的显式检查。它们中的大多数将是数据指针,但其中一些将是函数指针。一个快速的grep != NULL == NULL 结果显示有3000多个,要经过多次人工检查。

    所以,我们现在想要的是

    1. 一种查找函数指针(但不是数据指针)进行比较的所有情况的方法(因此,我们可以将它们与我们将定义为32位0的fp_空值进行比较),或者

    2. 以正确的方式重新定义空值。

    3. (或者,我想,是为了 更新GCC端口以检测和 正确处理此案)。

    我想不出任何适合1的方法。对于2,我唯一能想到的方法是将空值重新定义为0函数指针,这对于与数据指针进行的绝大多数比较来说是非常浪费的。(32位比较是4条指令,16位比较是1条指令)。

    有什么想法或建议吗?

    6 回复  |  直到 9 年前
        1
  •  18
  •   schot    15 年前

    NULL 0

    5.8


    4.13

    (void *) 0

    • (void *)
    • == !=

    fp == (void *) 0 fp = fp = (void *) 0;

        2
  •  3
  •   jv42    15 年前

    #ifdef NULL
      #undef NULL
    #endif
    #define NULL 0
    
        3
  •  3
  •   pmg    15 年前

    0 (void*)0

    gcc -E

        4
  •  3
  •   jeb    15 年前

        5
  •  2
  •   Bart van Ingen Schenau    15 年前

    1. (char*)0 (*)(

    2. 0

        6
  •  1
  •   R.. GitHub STOP HELPING ICE    15 年前

    #define NULL ((void *)0)
    

    #define NULL 0