我想用Splint(严格模式)检查一个C程序。我使用语义注释注释了源代码,以帮助Splint 了解我的程序。一切都很好,但我就是无法摆脱一个警告:Splint警告“声明没有效果”,由于功能指针
声明没有效果(通过调用函数不受约束可能my_function_pointer修改undected)。
声明没有明显的效果---没有值被修改。它可以通过调用一个不受约束的函数来修改某些内容。 (使用-noeffectuncon来禁止警告)
这是由函数指针调用函数引起的。我更喜欢不使用no-effect-uncon
标志,而是写一些更多的注释来修复它。所以我用适当的@modifies
条款来装饰我的typedef
,但是Splint似乎完全忽略了它。这个问题可以简化为:
#include <stdio.h>
static void foo(int foobar)
/*@globals [email protected]*/
/*@modifies [email protected]*/
{
printf("foo: %d\n", foobar);
}
typedef void (*my_function_pointer_type)(int)
/*@globals [email protected]*/
/*@modifies [email protected]*/;
int main(/*@[email protected]*/ int argc, /*@[email protected]*/ char * argv[])
/*@globals [email protected]*/
/*@modifies [email protected]*/
{
my_function_pointer_type my_function_pointer = foo;
int foobar = 123;
printf("main: %d\n", foobar);
/* No warning */
/* foo(foobar); */
/* Warning: Statement has no effect */
my_function_pointer(foobar);
return(EXIT_SUCCESS);
}
我读过manual,但有没有关于函数指针及其语义标注多的信息,所以我不知道我是否做错事或者这是某种错误(顺便说一下,这里没有列出:http://www.splint.org/bugs.html)。
有没有人成功地用Splint在严格模式下检查这样的程序?请帮我找到让斯普林特高兴的方法:)
在此先感谢。 (windows版本)会产生警告,而splint-3.1.1(Linux x86版本)并不会抱怨它。
更新#2:夹板并不关心分配和调用是否短或长方式:
/* assignment (short way) */
my_function_pointer_type my_function_pointer = foo;
/* assignment (long way) */
my_function_pointer_type my_function_pointer = &foo;
...
/* call (short way) */
my_function_pointer(foobar);
/* call (long way) */
(*my_function_pointer)(foobar);
更新#3:我没兴趣禁止的警告。这很简单:
/*@[email protected]*/
my_function_pointer(foobar);
/*@[email protected]*/
什么我要找的是正道来表达:
“这个函数指针指向一个函数,它
@modifies
的东西,所以它确实有副作用 - 效果“
您可以使用一个函数指针,就好像它是在一个呼叫的函数名。 'my_function_pointer'是一个指向函数的指针,它接受一个int并返回void。 – 2011-04-20 14:39:46
我没有投入价值;我[通过函数指针调用函数](http://www.newty.de/fpt/fpt.html#call)。在这个特定的情况下,我通过'my_function_pointer'调用函数'foo'。 – 2011-04-20 15:35:11
我的不好。最后我错过了缺失的“_type”。 – 2011-04-21 06:43:45