如何使夹板忽略我声明变量的位置?
-
21-08-2019 - |
题
你知道如何让夹板忽略我声明变量的位置吗?
我知道老派 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 循环中。
现在的问题是,如何关闭此检查?但保留其他检查那好呢?
谢谢 Johan
注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.)
这又提出了两个我以前没有想到的问题。
“与当前值冗余”,当前值是多少?
为什么它是解析错误而不是警告?
更新::有可能修补夹板来支持这个问题, 我还没有尝试过,但我认为这是解决方案。
解决方案
这是一个补丁:http://www.cs.virginia.edu/pipermail/splint-discuss/attachments/20080718/52cc25f6/attachment.obj
如果您位于 splint/src 目录中,您应该能够通过 patch -p2 提供该文件,然后它应该会重建。
这是来自这封电子邮件:http://www.cs.virginia.edu/pipermail/splint-discuss/2008-July/001190.html
(抱歉,上面有空格。)
如果你按照starblue链接的线索进行操作,你最终会发现这一点,但我想我会为你跳到最后。
不幸的是,Splint 目前似乎没有维护者。如果我不那么忙的话,我会考虑站出来做更多的事情。
杰克
其他提示
我对夹板不熟悉,但从 他们的常见问题解答:
夹板独立于您的 编译器。它检查标准 C 代码, 根据 ISO C99 规范。夹板支持大多数, 但不是全部,C99 扩展 ANSI C.夹板支持一些 GCC 编译器扩展(如果 +GNUEXTENSIONS)。
您的声明位置在 C99 下完全符合要求,因此也许您可以认为这是夹板中的错误。或者它是夹板尚未支持的“扩展”之一。无论哪种方式,他们可能对您的反馈感兴趣。符合 C99 的 lint 工具应该没有理由抱怨变量声明。
通常,使用夹板,如果可以抑制某些内容,它会显示“使用 +thisflag 或 -thisflag 抑制它”
您可以尝试 splint +gnuextensions foo.c ,它会打开(大多数)GNU/GCC 扩展,否则 splint 会出现问题。
我使用夹板的频率几乎和使用 valgrind 的频率一样。
编辑:
正如其他人所说,您遇到了解析器(而不是分析器),因此标志在这种情况下确实没有帮助。