如何触发Splint的抽象类型检查器?

时间:2013-05-10 08:43:24

标签: c typedef splint

我想使用Splint来检测具有相同基础类型的typedef之间的隐式转换,例如在以下代码中:

typedef int counter;
typedef int delta;

static int func(int a, int b, int c)
{
    return a + b + c;
}

int main(void)
{
    int a = 5;
    counter b = a;
    delta c = (int) 8;
    return func(a, b, c);
}

看起来我可以使用Splint,但它不会产生任何警告。即使将typedef标注为abstract也不会触发它。

我如何让Splint做"强大"类型检查这样?

1 个答案:

答案 0 :(得分:1)

由于您正在使用声明它们的同一文件中的类型,因此Splint假定该文件可以访问抽象类型。您需要告诉Splint该文件无法使用 @noaccess @ 访问抽象类型的内部。例如,你可以做

typedef /*@abstract@*/ int counter; /*@noaccess counter@*/
typedef /*@abstract@*/ int delta; /*@noaccess delta@*/

int main(void)
{
  int a = 5;
  counter /*@unused@*/ b = a;
  delta /*@unused@*/ c = (int) 8;
  return 0;
}

请注意,您不仅会在分配到 b 时收到警告,还会在 c 时收到警告,即使是演员也是如此。