「静的解析ツール」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Mono Book
(Mono Book がページ「静的コード解析」を「静的解析ツール」に移動しました)
imported>Mono Book
 
(同じ利用者による、間の6版が非表示)
1行目: 1行目:
'''静的コード解析'''とは、解析ソフトに[[ソースコード]]を食わせると、[[バグ]]の原因になりそうな箇所を指摘してくれるという物である。
+
'''静的解析ツール'''([[英語]]:static analysis)とは、[[ソースコード]]を食わせると、[[バグ]]の原因になりそうな箇所を指摘してくれる[[ソフトウェア]]の総称である。
  
 
==概要==
 
==概要==
静的解析を用いるとわざわざ[[デバッガー]]を雇い人力で[[プログラム]]を実行して[[デバッグ]]をせずとも人為的な[[コーディング]]時の[[バグ]]により[[エラー]]になるであろう箇所を見つけ出してくれる。たとえば「ある[[関数]]の[[引数]]は0から100の値をとる[[仕様]]」だとすると、それを呼び出す側でそれ以外になる例外パターンは無いか、などを[[芋づる式]]に調べてくれ、例外パターンがあると[[バグ]]として報告してくれる。
+
静的解析を用いると、わざわざ[[デバッガー]]を雇い、人力で[[プログラム]]を実行して[[デバッグ]]をせずとも、人為的な[[コーディング]]時の[[バグ]]により[[エラー]]になるであろう箇所を見つけ出してくれる。たとえば「ある[[関数]]の[[引数]]は0から100の値をとる[[仕様]]」だとすると、それを呼び出す側でそれ以外になる例外パターンは無いか、などを[[芋づる式]]に調べてくれ、例外パターンがあると[[バグ]]として報告してくれる。
  
[[契約による設計]]に対応している[[プログラミング言語]]の多くは、[[コンパイラ]]の機能のひとつとして実装していることが多い。
+
なんとも夢のような技術であるが、[[契約による設計]]に対応している[[プログラミング言語]]で[[ソースコード]]がきちんと記述されていれば凄い高い精度を叩き出すが、その他大勢の一般的な[[プログラミング言語]]では期待はずれな残念な結果しか得られないことが多い。
たとえば[[Visual Studio]]のお高いエディションがこれに対応しているが、[[ビルド]]が激遅になるうえに、[[C Sharp|C#]]でちょろっと書いた[[hello world]]すら[[エラー]]でまくりで焦ること請け合いである。
+
 
 +
==主な製品==
 +
[[契約による設計]]に対応している[[プログラミング言語]]の多くは[[コンパイラ]]の機能のひとつとして実装していることが多い。
 +
コンパイラに機能として付いているものとしては[[D言語]]が有名である。
 +
 
 +
[[C Sharp|C#]]などの[[.NET]]系では[[共通中間言語]]([[中間コード]])を食わせるツールで対応している。
 +
[[Visual Studio]]のお高いエディションがこれに対応しており、静的解析はビルドの過程で勝手に実行されるので[[コンパイラ]]の機能として提供されるものとの違いは特に感じないと思われる。静的解析を有効にすると、[[ビルド]]が激遅になるうえに、[[C Sharp|C#]]でちょろっと書いた[[hello world]]すら[[エラー]]でまくりで焦ること請け合いである。
  
なんとも夢のような技術であるが、[[契約による設計]]に対応している[[プログラミング言語]][[ソースコード]]がきちんと記述されていれば凄い高い精度を叩き出すが、その他大勢の一般的な[[プログラミング言語]]では期待はずれな残念な結果しか得られないことが多い。
+
==例==
 +
静的解析が[[コンパイラ]]に標準搭載されている[[D言語]]の記述例。
 +
関数square_rootを呼び出してる箇所で引数xが0未満になる可能性のあるところはすべて[[コンパイルエラー]]となる。
 +
<source lang="d">
 +
long square_root(long x)
 +
in
 +
{//事前条件
 +
    assert(0 <= x);
 +
}
 +
out (result)
 +
{//事後条件
 +
    assert((result * result) <= x && x < (result+1) * (result+1));
 +
}
 +
body
 +
{//関数本体
 +
    return cast(long)std.math.sqrt(cast(real)x);
 +
}
 +
</source>
  
 
==関連項目==
 
==関連項目==
 
*[[契約による設計]]
 
*[[契約による設計]]
 +
*[[コンパイラ]]
  
 
==参考文献==
 
==参考文献==

2014年8月7日 (木) 08:51時点における最新版

静的解析ツール英語:static analysis)とは、ソースコードを食わせると、バグの原因になりそうな箇所を指摘してくれるソフトウェアの総称である。

概要[編集 | ソースを編集]

静的解析を用いると、わざわざデバッガーを雇い、人力でプログラムを実行してデバッグをせずとも、人為的なコーディング時のバグによりエラーになるであろう箇所を見つけ出してくれる。たとえば「ある関数引数は0から100の値をとる仕様」だとすると、それを呼び出す側でそれ以外になる例外パターンは無いか、などを芋づる式に調べてくれ、例外パターンがあるとバグとして報告してくれる。

なんとも夢のような技術であるが、契約による設計に対応しているプログラミング言語ソースコードがきちんと記述されていれば凄い高い精度を叩き出すが、その他大勢の一般的なプログラミング言語では期待はずれな残念な結果しか得られないことが多い。

主な製品[編集 | ソースを編集]

契約による設計に対応しているプログラミング言語の多くはコンパイラの機能のひとつとして実装していることが多い。 コンパイラに機能として付いているものとしてはD言語が有名である。

C#などの.NET系では共通中間言語中間コード)を食わせるツールで対応している。 Visual Studioのお高いエディションがこれに対応しており、静的解析はビルドの過程で勝手に実行されるのでコンパイラの機能として提供されるものとの違いは特に感じないと思われる。静的解析を有効にすると、ビルドが激遅になるうえに、C#でちょろっと書いたhello worldすらエラーでまくりで焦ること請け合いである。

[編集 | ソースを編集]

静的解析がコンパイラに標準搭載されているD言語の記述例。 関数square_rootを呼び出してる箇所で引数xが0未満になる可能性のあるところはすべてコンパイルエラーとなる。

long square_root(long x)
in 
{//事前条件
    assert(0 <= x);
}
out (result) 
{//事後条件
    assert((result * result) <= x && x < (result+1) * (result+1));
}
body 
{//関数本体
    return cast(long)std.math.sqrt(cast(real)x);
}

関連項目[編集 | ソースを編集]

参考文献[編集 | ソースを編集]