我想使用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做"强大"类型检查这样?
答案 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 时收到警告,即使是演员也是如此。