如何在我声明变量的地方忽略splint?

时间:2009-03-21 09:17:14

标签: c static-analysis c99 lint splint

你知道如何在我声明变量的地方忽略夹板吗?

我知道旧学校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.)

这开启了另外两个我以前没想过的问题。

  1. “当前值多余”,当前值是多少?

  2. 为什么它是解析错误而不是警告?


  3. 更新: 有补丁夹板支持这个问题的可能性, 我还没试过,但我认为这是解决方案。

4 个答案:

答案 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)

Splint邮件列表中的

This thread讨论了这个问题。

似乎解析器主要是C89 / C90,只有库似乎是C99。

由于问题在于解析器,因此无法通过设置标志来消除它。

答案 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一样频繁。

编辑:

正如其他人所说的那样,你进入解析器(而不是分析器),所以在这种情况下,标志确实没有帮助。