UNIX環境でCでコーディングしているプロジェクトに取り組んでいます。私はlintツールを使用してソースコードをチェックしてきました。Lintは(1979年以来)長い間使用されてきましたが、誰かが私が使用できるより最近のコード分析ツールを提案できますか?できれば無料のツール。
15 に答える
コンパイラ自体を見落とさないでください。コンパイラのドキュメントを読んで、提供される可能性のあるすべての警告とエラーを見つけてから、意味のあるものをできるだけ多く有効にしてください。
また、警告をエラーのように扱うようにコンパイラに指示して、すぐに修正する必要があるようにしてください ( -Werror
gcc で)。ところで、-Wall
gcc がすべての警告を有効にするわけではないことにだまされないでください。
確認してみてくださいvalgrind
(無料!) — 「多くのメモリ管理とスレッド化のバグを自動的に検出し、プログラムを詳細にプロファイリングします」。これは静的チェッカーではありませんが、優れたツールです。
Cコードの場合は、間違いなくFlexelintを使用する必要があります。私はそれを15年近く使用し、それを誓います。それが持っている本当に素晴らしい機能の1つは、コード内のコメント( "/ * lint -e123 * /")を介して警告を選択的にオフおよびオンにできることです。これは、通常とは異なる何かをしたいときに強力なドキュメントツールであることがわかりました。「警告Xをオフにしているので、Xを実行しているのにはいくつかの理由があります。」
興味深いC/C ++の質問に興味がある人は、サイトにあるいくつかの例を見て、ヒントを見なくてもバグを理解できるかどうかを確認してください。
IIRC がバックエンドとして LLVM を使用しているclang static Analyzerについて良いことを聞いたことがあります。それがプラットフォームに実装されている場合、それは良い選択かもしれません。
私が理解していることから、それは構文解析だけではありません。たとえば、「自動バグ検出」。
Coverity Preventを使用して C++ ソース コードをチェックしています。
これは無料のツールではありませんが (オープン ソース プロジェクトの無料スキャンを提供していると思いますが)、最も優れた静的分析ツールの 1 つです。C++ よりも C の方が印象的だと聞いたことがありますが、これまでのところかなりの数のバグを回避するのに役立ちました。
Lintのようなツールは、一般に「誤警報」の問題に悩まされています。実際に存在するよりもはるかに多くの問題を報告します。本当に有用な警告の割合が低すぎる場合、ユーザーはツールを無視することを学びます。最新のツールは、最も可能性の高い/興味深い警告に焦点を当てるためにいくらかの努力を費やしています。
Uno ツールが役立つ場合があります。これは、おもちゃ以外の数少ない無料のオプションの 1 つです。lint や Flexelint などとは異なり、少数の「セマンティック」エラー (null ポインター逆参照、範囲外の配列インデックス、および初期化されていない変数の使用) に焦点を当てています。また、ロック/ロック解除の規律など、ユーザー定義のチェックも可能です。
後継ツールであるOrion の公開に向けて取り組んでいます(コンテンツは利用できません) 。
PC-lint/Flexelintは非常に強力で便利な静的解析ツールであり、高度な設定が可能ですが、残念ながら無料ではありません。
このようなツールを初めて使用すると、膨大な数の警告が生成される可能性があり、重大な警告と軽微な警告を区別するのが難しくなる可能性があります。したがって、プロジェクトのできるだけ早い段階でコードでツールの使用を開始し、その後はできるだけ頻繁にコードで実行して、新しい警告が表示されたときに対処できるようにすることをお勧めします。
このように継続的に使用すると、ツールによって適用される規則に準拠する方法でコードを記述する方法をすぐに学習できます。
このため、私は Lint のような比較的高速に実行されるツールを好み、たとえ使用したとしても使用頻度が低くなるような面倒なツールよりも、継続的に使用することをお勧めします。
G'day、
-Wallを設定した後、コンパイラーが指示している内容を読んで要約するという提案に完全に同意します。
セキュリティのための優れた静的分析ツールは、DavidWheelerによって作成されたFlawFinderです。さまざまなセキュリティエクスプロイトを探すのに適しています。
ただし、知識のある人にコードを読んでもらうことに代わるものではありません。デビッドが彼のウェブページで言っているように、「道具を持った愚か者はまだ愚か者です!」
乾杯、
ロブ
Sparseは、Linux カーネルで発生する可能性のあるコーディング エラーを検出するように設計された、Linux で既に利用可能なコンピューター ソフトウェア ツールです。
ロード可能なカーネル モジュールの品質を向上させることを目的とした、 Linux Verification Centerの 2 つのアクティブなプロジェクトがあります。
- Linux Driver Verification (LDV) - Linux デバイス ドライバーの静的ソース コード検証用の包括的なツールセット。
- KEDR フレームワーク - カーネル モジュールの動的分析と検証のための拡張可能なフレームワーク。
- もう 1 つの進行中のプロジェクトは、Linux ファイル システムの実装を検証するための専用ツールセットを開発することを目的とした Linux File System Verification です。
lintは常に更新されています。
ところでflexelintは糸くずです
一般に、複数の静的解析ツールを使用してバグを見つけるのが最善であることがわかりました。すべてのツールは異なる方法で設計されており、互いに非常に異なるものを見つけることができます。
ここ で は いくつか の 講演 で 良い 議論 が あります. これは、米国国土安全保障省が開催した静的分析に関する会議からのものです。
gccには「-Weffc++」オプションがあり、MacOSXのマニュアルページによると次のようになります。
ScottMeyersのEffectiveC++本からの次のスタイルガイドラインの違反について警告します。
[をちょきちょきと切る]
あなたがCについて尋ねたことは知っていますが、これは私が知っている最も近いものです。