6

変数を宣言する場所をスプリントに無視させる方法を知っていますか?

古い学校の 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; を移動したいと考えています。1 行上げるか、宣言と for ループを {} で囲みます。

さて、質問ですが、このチェックをオフにするにはどうすればよいですか? しかし、良い他のチェックを続けますか?

ありがとうヨハン


注 1: 私はすでに gcc 警告 (以下を参照) を防御の最初の行として使用し、valgrind を 2 番目の行として使用しています。しかし、私の愚かさを制御できるもののリストに添え木を追加することを考えています;-)しかし、このチェックはただ面倒です.

私が使用する 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.)

これにより、以前は考えもしなかった 2 つの疑問が生じます。

  1. 「現在の値と冗長」、現在の値は?

  2. 警告ではなく解析エラーなのはなぜですか?


更新::この問題をサポートするためにスプリントにパッチを適用する可能性があります。これはまだ試していませんが、解決策だと思います。

4

4 に答える 4

5

Splint メーリング リストのこのスレッドでは、この問題について議論しています。

パーサーはほとんどが C89/C90 のようで、ライブラリだけが C99 のようです。

問題はパーサーにあるため、フラグを設定しても解決できません。

于 2009-03-21T12:35:10.683 に答える
3

私はスプリントに慣れていませんが、よくある質問から:

Splint はコンパイラから独立しています。ISO C99 仕様に従って、標準 C コードをチェックします。Splint は、ANSI C に対する C99 拡張機能のほとんどをサポートしていますが、すべてではありません。Splint は、gcc コンパイラ拡張機能の一部をサポートしています (+gnuextensions が使用されている場合)。

あなたの宣言の位置は C99 に完全に準拠しているため、おそらくこれは splint のバグと考えることができます。または、スプリントでまだサポートされていない「拡張機能」の 1 つです。いずれにせよ、彼らはあなたのフィードバックに興味があるかもしれません。C99 準拠の lint ツールが変数宣言について文句を言う理由はないはずです。

于 2009-03-21T10:38:50.060 に答える
2

通常、スプリントでは、何かを抑制できる場合、「+thisflag または -thisflag でこれを抑制してください」と表示されます。

splint +gnuextensions foo.c を試すことができます。これは、splint が問題を起こす (ほとんどの) GNU/GCC 拡張機能をオンにします。

私は valgrind とほぼ同じ頻度でスプリントを使用しています。

編集:

他の人が言ったように、(アナライザーではなく) パーサーを実行しているため、この場合、フラグは実際には役に立ちません。

于 2009-03-21T09:45:44.303 に答える