你知道如何在我声明变量的地方忽略夹板吗?
我知道旧学校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;
}
这里的splint和大多数旧的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 +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.)
这开启了另外两个我以前没想过的问题。
“当前值多余”,当前值是多少?
为什么它是解析错误而不是警告?
更新: 有补丁夹板支持这个问题的可能性, 我还没试过,但我认为这是解决方案。
答案 0 :(得分: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现在似乎没有维护者。如果我不那么忙,我会考虑加紧做更多的事情。杰克
答案 1 :(得分:5)
答案 2 :(得分:3)
我不熟悉夹板,但来自their FAQ:
Splint独立于你的 编译器。它检查标准C代码, 根据ISO C99 规格。夹板支持最多, 但不是全部,C99扩展 ANSI C. Splint支持一些 gcc编译器扩展(如果 使用+ gnuextensions)。
你的声明的位置完全符合C99,所以也许你可以认为这是夹板中的一个错误。或者它是夹板尚未支持的“扩展”之一。无论哪种方式,他们可能会对您的反馈感兴趣。应该没有理由让C99兼容的lint工具抱怨变量声明。
答案 3 :(得分:2)
通常,使用夹板,如果可以抑制某些东西,它会说“使用+ thisflag或-thisflag来抑制它”
您可以尝试使用splint + gnuextensions foo.c,它会打开(大多数)夹板否则会引起问题的GNU / GCC扩展。
我使用夹板几乎和使用valgrind一样频繁。
编辑:
正如其他人所说的那样,你进入解析器(而不是分析器),所以在这种情况下,标志确实没有帮助。