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

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)

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

  1. "冗余与当前价值",现在有什么价值?

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


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

小智 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现在似乎没有维护者.如果我不那么忙,我会考虑加紧做更多的事情.

可靠的人


sta*_*lue 5

Splint邮件列表中的这个主题讨论了这个问题.

似乎解析器大多是C89/C90,只有库似乎是C99.

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