Joh*_*han 6 c static-analysis lint splint c99
你知道我怎么能忽略我声明变量的地方?
我知道旧学校c告诉你在每个函数的开头都声明变量,但由于我是一个坏人,我喜欢声明接近我使用它们的地方.一个很好的例子就是把int i; 就在for(i = 0; ...)之前.
我们来看一个非常简单的例子
#include <stdio.h>
int main()
{
printf("Hello splint test\n");
int i;
for(i=5;i>0;i--)
{
printf("%2d...\n",i);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里夹板和大多数旧的c编译器想移动int i; 向上一行,或者放置{}循环声明和for循环.
现在问题是,如何关闭此检查?但保持其他检查是好的吗?
谢谢约翰
注1:我已经使用gcc警告(见下文)作为第一道防线,而valgrind作为第二道防线.但是我正在考虑将夹板添加到可以控制我的愚蠢的事情列表中;-)但是这个检查只是烦人的,
我使用的gcc警告:-Wall -W -Wextra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings -Werror
注2:我知道这种不良行为可能带来的潜在可移植性问题.但我觉得它增加了可读性,也就是说不需要跳起来搜索这种类型的声明更有价值(我们可以在另一个线程中讨论).
更新:更多信息,我把上面的代码放在一个名为main.c的文件中.使用的平台是Ubuntu 8.04和gvim作为编辑器,这是我运行时splint的输出:
splint +gnuextensions main.c
Splint 3.1.1 --- 03 Nov 2006
Command Line: Setting +gnuextensions redundant with current value
main.c:8:8: Parse Error. (For help on parse errors, see splint -help
parseerrors.)
Run Code Online (Sandbox Code Playgroud)
这开辟了另外两个我以前没想过的问题.
"冗余与当前价值",现在有什么价值?
为什么它是解析错误而不是警告?
更新::有补丁夹板支持这个问题的可能性,我还没有尝试过,但我认为这是解决方案.
小智 7
这是一个补丁:http: //www.cs.virginia.edu/pipermail/splint-discuss/attachments/20080718/52cc25f6/attachment.obj
如果你在splint/src目录中,你应该能够通过补丁-p2提供它,然后它应该只是重建.
这是来自这封电子邮件:http: //www.cs.virginia.edu/pipermail/splint-discuss/2008-July/001190.html
(对不起它的间距.)
你会发现最终如果你跟着与之相关的线程蓝星,但我想我会为你跳到最后.
不幸的是,Splint现在似乎没有维护者.如果我不那么忙,我会考虑加紧做更多的事情.
可靠的人