2009-03-21 4 views
6

私は変数を宣言するところでsplintを無視する方法を知っていますか?私の変数を宣言する場所で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; 
} 
ここ

スプリントで最も古いCコンパイラがI intを移動したいのは、非常に簡単な例を見てみましょう。 1つの行、 または{}を宣言とforループの周りに置くことができます。

これで質問には、どうすればこのチェックを無効にできますか? しかし、他の小切手は元気?

おかげヨハン


注1:私はすでに第二のような防衛、 とvalgrindのオフ最初の行としてGCC警告を(下記参照)を使用します。 しかし、私は私の愚かさ;-) を制御することができ、物事の私のリストに副木を追加することを考えている。しかし、このチェックは単なる迷惑です、

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.) 

そして、これは私が前に考えていなかった2つの以上の質問を開きます。

  1. 「現在の値で冗長」、現在の値は何ですか?

  2. なぜそれは解析エラーであり、警告ではありませんか?


更新:: この問題をサポートするためのパッチスプリントに働かがあり、 私はこれを試していないが、まだ私はそれが解決策だと思います。

+1

あなたはそれにいる間に、intステートメントを宣言する必要があります。 – starblue

+0

迷惑な警告、またはパーサーエラーが発生していますか? –

+0

これはsplintを破る "int"と "i"の間のスペースですか? – Johan

答えて

7

ここパッチです: http://www.cs.virginia.edu/pipermail/splint-discuss/attachments/20080718/52cc25f6/attachment.obj

あなたがスプリント/ srcディレクトリにいる場合は、パッチ-P2を通じてそのを供給することができるはずですし、それだけで再構築する必要があります。このメールからだ

http://www.cs.virginia.edu/pipermail/splint-discuss/2008-July/001190.html

(。その上の間隔については申し訳ありません)

あなたがにリンクされているスレッドstarblueに従いますが、あれば最終的に、私は私がジャンプしようと思いましたことがわかりますあなたのために最後まで。

スプリントは残念なことにメンテナをまだ持っていないようです。もし私が忙しくなければ、私は足を伸ばしてもう少しやりたいと考えています。

Jake

+0

私はそのパッチをsplint 3.1.2のソースに適用しようとしました。私はそれを構築しようとしたときに構文エラーがあります。私はsplint 3.1.2 *をパッチなしでビルドしようとしたときにも構文エラーが発生しました。 –

2

何かを抑制することができる場合には通常、スプリントで、それは「+ thisflagまたは-thisflagでこれを抑える」

を言うだろうあなたは(ほとんど)GNU/GCCをオンスプリント+ gnuextensionsのfoo.cのを、試してみてくださいsplintが他の点で問題になる拡張機能。

私はvalgrindを使うほど頻繁に副子を使用します。

編集:

他の人が言ったように、パーサ(ではないアナライザ)にあなたのランニング、フラグが本当にこのケースで助けに行くされていませんので。

+0

- "コマンドライン:現在の値で冗長な+ gnuextensionsを設定する"、何かがブロックされています。 – Johan

3

私はスプリントに慣れていないんだけど、their FAQから:

スプリントは、あなたの コンパイラから独立しています。 ISO C99 仕様に従って標準Cコード をチェックします。 Splintは、 のすべてをサポートしていますが、 のC99拡張のANSI Cをサポートしています。Splintは、 の一部をサポートしています( + gnuextensionsが使用されている場合)。

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

5

This thread(Splintメーリングリスト)で問題が説明されています。

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

問題はパーサーにあるので、フラグを設定することでそれを取り除くことはできません。

+1

あなたは正しいと思いますが、私はそのリストにメールを送って調べます。 http://www.cs.virginia.edu/pipermail/splint-discuss/2009-March/001288.html何が起こるか見てみましょう。 – Johan

関連する問題