変数を宣言した場所を Splint が無視するにはどうすればよいですか?
-
21-08-2019 - |
質問
変数を宣言した場所をスプリントに無視させる方法をご存知ですか?
古い学校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はエディターとして、これは私がそれを実行したときのSprintからの出力です。
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 つの疑問が浮かび上がります。
「現在値と冗長」、現在値は何ですか?
警告ではなく解析エラーになるのはなぜですか?
アップデート::この問題をサポートするためにスプリントをパッチする可能性がありますが、私はこれを試していませんが、まだ解決策だと思います。
解決
パッチは次のとおりです。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-April/001190.html
(間隔が空いてしまい申し訳ありません。)
starblue がリンクしているスレッドをたどっていけば、最終的にはわかりますが、最後まで飛ばしておこうと思います。
残念ながら、Splint には現在メンテナーがいないようです。それほど忙しくなければ、ステップアップしてもう少しやることを検討したいと思います。
ジェイク
他のヒント
このスレッド Splint メーリング リストでこの問題について議論しています。
パーサーはほとんどC89/C90のようで、ライブラリのみC99のようです。
この問題はパーサーにあるため、フラグを設定しても問題を解決することはできません。
スプリントについては詳しくないのですが、 よくある質問:
スプリントはコンパイラから独立しています。ISO C99仕様に従って、標準Cコードをチェックします。スプリントは、ANSI CへのC99拡張機能のすべてではありませんが、すべてではありません。Sprintは、GCCコンパイラ拡張機能の一部をサポートしています( +Gnuextensionsが使用されている場合)。
あなたの宣言の位置は C99 に完全に準拠しているため、おそらくこれを Splint のバグと考えることができます。または、これは Splint でまだサポートされていない「拡張機能」の 1 つです。いずれにせよ、彼らはあなたのフィードバックに興味を持っているかもしれません。C99 準拠の lint ツールが変数宣言について文句を言う理由はありません。
通常、スプリントでは、何かを抑制できる場合は、「+thisflag または -thisflag でこれを抑制する」と表示されます。
splint +gnuextensions foo.c を試してみると、 splint が問題を起こす (ほとんどの) GNU/GCC 拡張機能が有効になります。
私は valgrind を使用するのとほぼ同じくらい頻繁にスプリントを使用します。
編集:
他の人が言ったように、(アナライザーではなく)パーサーに遭遇するため、この場合、フラグは実際には役に立ちません。