私にとって、C ++の美しさは、主に言語の許容性と恐ろしい力にあります。 Cの場合と同じくらい厳密にメモリを操作できますが、同時にテンプレートやSTLなどの抽象化ツールもあり、あらゆるものをパラメーター化できます。
これに対する料金は適切です-常にわかりやすいコンパイラーエラー(クラスを定義した後にセミコロンを入れるのを忘れないでください)、プログラマーの準備とトレーニングのための非常に長い時間ではありませんが、最も重要なことには、いくつかのバグはプログラムの実行中にのみ顕著になります。
私たちは、プログラムを開始する前に、より便利な情報を求めています。 必要なものを取得する1つの方法は、静的コード分析です。 静的とは、プログラムを実行しないことを意味します。 起こりうるエラー、未定義の動作のケース、メモリリークだけでなく、アクセス不能/未使用コード、プログラミングスタイルの直観性を高めるための推奨事項なども興味深いです。
この記事では、静的分析メソッドによって抽出されたソフトウェアメトリックを取得する手段は考慮されていません。 プログラミング標準に関連するコメント(中括弧は、oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo!さようなら)とは別の行に記述する必要があります。
評価基準は単純です-見つかったバグの数と有用性、使いやすさ(特に、コード変更の要件がないこと)、無料/リーズナブルな価格/良いクラック。
最初のレビューを行い、山へのリンクを発行します。
見つかったアイテム
GCCペダンティックキー
まず第一に、すべての可能な通常の手段を使用する必要があります。 gccは、コンパイラとプリプロセッサの警戒に関連する次の興味深いキーを提供します。
- -Wallには、新しい標準との互換性、配列境界(私の意見では、耕作はしませんが、-O2で動作すると言われます)、volatile / register変数(スマートワードを気にしない、 //登録//、そうでない場合、彼は自分で決める)、シーケンスポイント(i ++ + ++ i)
- -Wextra-ifsの別の空タイプのボディワーク、符号付きおよび符号なしの比較
- -pedantic-ISO C ++標準に従う。 たとえば、long long型の禁止。
- -Weffc ++にはオプションが必要です。 -Wextraまたは-Wallではオンにならず、Scott Meyersの推奨事項のチェックが含まれています。
- 項目11:動的に割り当てられたメモリを持つクラスのコピーコンストラクターと代入演算子を定義します。
- 項目12:コンストラクターでの割り当てよりも初期化を優先します。
- 項目14:デストラクタを基本クラスで仮想化します。
- 項目15:「operator =」に* thisへの参照を返させる。
- 項目23:オブジェクトを返さなければならないときに参照を返そうとしないでください。
- 項目6:インクリメント演算子とデクリメント演算子のプレフィックス形式とポストフィックス形式を区別します。
- 項目7:「&&」、「||」、または「、」をオーバーロードしないでください。
- -Woverloaded-virtual-仮想関数のオーバーロードは見た目が悪い。
- -Wctor-dtor-privacy-未使用のクラス-プライベートコンストラクターとデストラクター
- -Wnon-virtual-dtor-非仮想デストラクタ
- -Wold-style-cast-Cスタイルのキャストが悪い
- -Werr = '渦の種類'-渦をエラーとして認識します。 サムライのチューニング用-パラメーターなしのエラー
- -Wconversion -Wsign-conversion-タイプ変換の変動。 値が変更される可能性があります。 奇妙なことに、-wallには含まれていません
- -Winit-self-int i = i;
- -Wunreachable-code-決して実行されないコード
もちろん、私はそれほど賢くはありませんが
、警告に関連するキーについてこの
マニュアルのすべてを読みました
Cppcheck
おそらく、見つかったプログラムの中で最も価値のあるものです。
プログラムの公式ウェブサイトと日食の
プラグイン 。 非常に多くを認識し、次のエラーを見つけます。
- いくつかのメモリリーク、たとえば、削除および削除[]の不在、デストラクタでの削除の不在
- 発信アレイ
- デストラクタでスローされた例外
- NULLポインター逆参照
- メモリをクリアした後の逆参照
- 基本クラスのデストラクタの仮想性
- 異なるコンテナに同じイテレータを使用する
- 別の小さなもの
Qt4のGUIで、クラスをスマートポインターとしてマークすることができます(誤った模倣について報告しないようにするため)。
Vera ++
Vera ++は、cppcheckとは異なり、スタイルチェックに重点を置いています。 補充されたルールベースがあります。 デフォルトでは、データベースには「コロンの前にスペースが必要」など、本当にばかげた部分がたくさんあります。 唯一の便利な機能は、ヘッダーファイルで名前空間の使用を禁止することです。 ただし、ルールはTclで記述できます。 :)
ラット
RATSは、セキュリティとバッファオーバーフロー攻撃に関する非常に説得力のある恐怖物語を語っています。 保護されたコードについてあまり知らないので、よく見ませんでした。
プラスのないCのチェッカー
驚くべきことに、純粋なCプログラマーは静的分析を重視しているようです。 ここに
1回と
2回 リストがあります
プラスの開発者にとって有用でしょうか? クラスのないコードがあり、どのC ++プログラムがCコンパイラーによってコンパイルされないかを覚えている場合は、なぜですか?
スプリント
これは純粋なCの場合です。簡単に組み立てられますが、きれいに機能し、多くのことを探します-マニュアルを参照してください。
シミアン
Simian-類似度アナライザー。 コードの重複を探しているということです。 正直なところ、私は彼女の申請書を思いつきませんでした
チル
CIL-中間言語あり。 Cを簡易Cにコンパイルします! 簡略化されたCは、他のアナライザーに既に供給されている可能性があり、理論的には作業の品質を向上させるはずです。
わかりにくい、オフトピック
- オインク 。 使用する場合は注意してください。 コンパイルするとき、私は少なくともいくつかのエキゾチックなアーキテクチャ用のLinuxカーネルを構築しているように思えました。 FlexとBisonが必要です。長い間推測していました...(そして、コンパイル中に大量のエラーを修正する必要があります。プリプロセッサファイルで動作しますが、ナンセンスを与えます:配列境界で単純なエラーを設定-沈黙を取得します。そして、ソースコードのコンパイルと編集に3時間かかりました。
- Mozilla Dehydra-このまさにOink'eに基づいたもの。 今回のMozillaという言葉は「すべてがシンプルで明確」という意味ではなかったので、誰かがこの造語について語ってくれたら嬉しいです。 見つかったバグのリストが表示されませんでした。Oinkの後にコンパイルしたくありませんでした。
- 静的解析に基づいてより多くの機能を提供するコンパイラがまだあります。 たとえば、 ローズ
- Rational Purify-有名な会社IBM Rationalには、静的および動的分析のための独自のツールセットがあります。 Linuxのトライアルがx64アーキテクチャ専用であることが判明したため、誰かがこのプログラムについて語ってくれたら嬉しいです。
試用/うなり声ソフトウェア
そして、それは十分ではありません。 多くのアナライザーは多額の費用がかかり、亀裂がありません。
このようなアナライザーの例を次に示します。それらのWebサイトにアクセスして、Cleanscape
trivialを要求できます。 可能性はcppcheckとそれほど変わりません。
他に何が欲しいですか
静的に分析できるコード内のすべてのエラーが既存のプログラムで表示されたわけではありません。 私がしたい:
- Javaのような例外仕様ポリシー。
- STLコンテナでauto_ptrを使用し、別のauto_ptrに割り当てた後にauto_ptrを逆参照します。
- h-ファイルで名前空間を使用する
- 新規なしの新規削除または削除なしの新規削除
- 非配列に対してdelete []を呼び出します
- 内部にブール値を持つベクトルを使用する