web-dev-qa-db-ja.com

静的コード分析とコードレビューの違いは何ですか?

静的コード分析とコードレビューの違いを知りたかっただけです。これら2つはそれぞれどのように行われますか?より具体的には、PHPのコードレビュー/静的分析に現在利用できるツールは何ですか?また、あらゆる言語のコードレビューに適したツールについても知りたいです。

9
Xander

コードレビューは人々が行うことであり、静的分析はマシンが行うことです。 (時には良い)静的分析ツールがあります。コードレビューは、同僚/メンター/教授/友人があなたのコードを調べ、建設的な批判を与えるときです。

一方、静的分析は自動化されたプロセスであり、マシンは、(通常は型システムから)分析している言語について知っていることによって通知され、プログラムを分析して、誤っている可能性のあるものを見つけようとします。非効率的、貧弱なスタイル、またはそれ以外の場合は最適ではありません。

19
Rafe Kettler

静的分析は、ソフトウェアを実行せずに分析するプロセスです。これは非常に良い方法であり、推奨されますが、

  1. 静的分析ツールが異なれば、調査中のコードも異なる理解であるため、異なる問題を通知する(または通知しない)可能性があります。 1つのツールは明確なレポートを提供でき、もう1つのツールは100万件について不満を言う可能性があります。
  2. 動的ツール(例を挙げると、valgrindのことを考えます)は、リソース消費(時間、メモリ使用量)に深刻な負担を負わせて、他の多くの問題を見つけることができます。これは、通常、計測されたバージョンのソフトウェアを実行しているためです。何らかの方法でインストルメント化されている(mallocをデバッグ用のmallocで置き換える)ことにより、ソフトウェアと完全に同じではないことに注意してください(実行時間から確認できます)。

これらのアプローチはどちらも、コンテキストの欠如に悩まされています。swが何を実現するのかわからないのです。

コードレビューは、おそらくそれを知っていてチェックできる別のコーダーによって行われます

  1. コードが正しい場合
  2. ソフトウェアが意味的に正しい場合。

それははるかに高価であり、再現性の程度はさまざまですが、非常に役立ちます。

いつものように、すべてのバグを修正してすべての問題を回避する単一の特効薬はありません。適用-場所、コード、時間、3つのチェック形式(静的、動的、より多くの目(および脳)が実際にコードを見る)を考慮して、可能な限り推奨されます。

ps:通常、ツールを最初から適用する方がはるかに優れていることに注意する必要があります。レガシーシステムの変換は、誤検知が原因で、それほど楽しいものではありません。ゼロから始め、常に分析ツールをクリーンに保つことを目的とする場合、多くの問題を回避することができます。

pps:ツールに関しては、それは言語に依存します。 CおよびC++の世界では、組み込みの静的分析ツールが含まれているVisual Studio自体を調べることから始めることができます。比較的完全な list はWikipediaにあります。

ppps:静的分析は、CやC++などの静的言語により適しています。 Pythonの場合、ある時点でリストを参照する名前がプログラムの残りのリストを参照するかどうかは、その動的プロパティのために、言うのは本当に難しい場合があります。これは、 PyPy のようなJITの取り組みが示すように、何も実行できないことを意味します。

11
Francesco

コードレビューとは、上級または専任の機関がコード、コードの方法、コードが従う標準、特にコードのロジックレベルをチェックすることです

静的分析に関する限り、ソフトウェアから構築されたプログラムを実際に実行せずに実行されるのはコンピュータソフトウェアの分析です(プログラムの実行時に実行される分析は動的分析と呼ばれます)。

テクノロジーごとのツールのリストは、以下のリンクに記載されています

静的分析用ツールのリスト

したがって、コードレビューと静的分析は完全に異なる用語です。

2
OM The Eternity

コードレビューはより定性的な評価であり、静的コード分析はより定量的な評価です。

こんにちは、このメソッドはもっと上手に書くことができます

対、f.e

パフォーマンスの低下。 'wcslen(str)> 0'構文を使用して空の文字列を識別することは非効率的です。より効率的な方法は、チェックすることです:str [0]!= '\ 0'。

パフォーマンスの低下。 strlen(MyStr.c_str())の種類の式は、MyStr.length()に書き換えられます。

パフォーマンスの低下。 'Order'がイテレータの場合、増分のプレフィックス形式を使用する方が効果的です。 iterator ++を++ iteratorに置き換えます。

実際のエラーは(明らかに)存在する可能性があり、SCAによって検出されます

形式が正しくありません。 「Foo」関数のN実引数を確認することを検討してください

式が括弧で2回囲まれました:((expression)) 1対の括弧が不要であるか、誤植が存在します

'memset'関数の呼び出しにより、バッファ 'dest.lfFaceName'のアンダーフローが発生します

1
Lazy Badger

静的分析とは、成果物を実行せずに分析することです。任意のアーティファクトに適用できますが、多くの場合、ソースコードまたはオブジェクトコードに適用され、特定のツールを使用してこれらの作業成果物に関する情報を分析および取得することを指します。これらのツールは、構築中のシステムの品質を決定する際に、および開発と保守の計画のガイドとして使用するためにエンジニアによって解釈されるレポートを生成します。 ウィキペディアには、静的分析用のツールのリストがあります 、言語ごとに整理され、機能の簡単な説明が付いています。

レビューは、一部の作業成果物の人間による評価であり、コードである可能性があります。デザインやその他のドキュメントについてもレビューを行うことができます。アイデアは、開発者以外の作業成果物に精通している人々が、セキュリティ問題からコーディング標準の違反に至るまで、間違いを見つけるためにそれを見ているというものです。

技術的には、コードは実際にはレビュー中に実行されないため、コードレビューは静的分析の一種と考えることができます。ただし、一般的な用語では、「静的分析」は通常、ソースファイルまたはオブジェクトファイルのマシン解析を指し、「レビュー」は人間が分析を行っていることを示します。

0
Thomas Owens