【问题标题】:How can I make splint ignore where I declare my variables?如何让夹板忽略我声明变量的位置?
【发布时间】:2023-11-10 17:17:01
【问题描述】:

你知道如何让夹板忽略我声明变量的位置吗?

我知道老派的 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;
}

这里夹板和大多数旧的 c 编译器都想移动 int i;上一行, 或将 {} 放在声明和 for 循环周围。

现在的问题是,如何关闭此检查? 但保留其他支票好吗?

谢谢 约翰


注 1:我已经使用 gcc 警告(见下文)作为第一道防线, 和 valgrind 作为第二个。 但我正在考虑在我的清单中添加夹板来控制我的愚蠢;-) 但是这个检查很烦人,

我使用的 gcc 警告: -Wall -W -Wextra -Wconversion -Wshadow -Wcast-qual -Wwrite-strings -Werror

注2: 我知道这种不良行为可能带来的潜在可移植性问题。 但我觉得它增加了可读性,也就是不需要上下跳来搜索这种类型的 off 声明更有价值(这个我们可以在另一个线程中讨论)。


更新: 再多一点信息,我把上面的代码放在一个名为 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. 为什么是解析错误而不是警告?


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

【问题讨论】:

  • 当您使用它时,您应该在 for 语句中声明 int。
  • 您是否收到烦人的警告或解析器错误?
  • 是“int”和“i”之间的空格破坏了夹板?
  • "当你这样做时,你应该在 for 语句中声明 int。"为什么?事实上,我过去曾遇到过一些编译器这样做的问题(当时这让我感到惊讶)。问题是我记不起问题了……

标签: c static-analysis c99 lint splint


【解决方案1】:

这是一个补丁: 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 现在似乎没有维护者。如果我不那么忙,我会考虑加强并做更多的事情。

杰克

【讨论】:

  • 我刚刚尝试将该补丁应用到夹板 3.1.2 源。当我尝试构建它时出现语法错误。当我尝试构建夹板 3.1.2 没有补丁时,我也遇到了语法错误。
【解决方案2】:

Splint 邮件列表中的This thread 讨论了这个问题。

解析器好像大部分是C89/C90,只有库好像是C99。

由于问题出在解析器上,因此您无法通过设置标志来解决问题。

【讨论】:

【解决方案3】:

我不熟悉夹板,但来自their FAQ

夹板独立于您的 编译器。它检查标准 C 代码, 根据 ISO C99 规格。夹板最支持, 但不是所有的 C99 扩展 ANSI C. Splint 支持一些 gcc 编译器扩展(如果 +gnuextensions 被使用)。

您的声明位置完全符合 C99,所以也许您可以认为这是夹板中的错误。或者它是夹板尚未支持的“扩展”之一。无论哪种方式,他们都可能对您的反馈感兴趣。符合 C99 的 lint 工具应该没有理由抱怨变量声明。

【讨论】:

    【解决方案4】:

    通常,使用夹板,如果可以抑制某些东西,它会说“用 +thisflag 或 -thisflag 抑制它”

    您可以尝试 splint +gnuextensions foo.c ,它会打开(大多数) GNU/GCC 扩展,否则 splint 会出现问题。

    我使用夹板的频率几乎和使用 valgrind 一样频繁。

    编辑:

    正如其他人所说,您遇到了解析器(而不是分析器),所以在这种情况下,标志真的无济于事。

    【讨论】:

    • -“命令行:设置 +gnuextensions 与当前值冗余”,有东西阻塞。
    最近更新 更多