静的コード解析 (せいてきコードかいせき、static code analysis ) または静的プログラム解析 (static program analysis ) とは、コンピュータ のソフトウェア の解析手法の一種であり、実行ファイル を実行することなく解析を行うこと。逆にソフトウェアを実行して行う解析を動的プログラム解析 と呼ぶ[ 1] 。静的コード解析はソースコード に対して行われることが多いが、少数ながらオブジェクトコード に対して行う場合もある。また、この用語は以下に列挙するツールを使用した解析を意味することが多い。人間が行う作業はインスペクション 、コードレビュー などと呼ぶ。日本語では静的コード分析 とも訳される[ 2] 。
概要
ツールが行う静的コード解析の洗練度は、個々の文や宣言だけを検証するものから、プログラム全体を解析するものまで様々である。解析結果の利用も様々で、Lint のように単に指摘するだけのものから、形式手法 を使ってそのプログラムの特性を数学的に証明する(仕様記述と振る舞いが一致しているかどうかを検証する)ものまである。
ソフトウェア測定法 やリバースエンジニアリング も静的解析の一部とみなすこともある。特に組み込みシステム の開発において、ソフトウェア測定法と静的コード解析が品質向上の一助として活用されることが多くなっている[ 3] 。
静的解析の商業利用が増えているのは、重要なコンピュータシステムで使用されるソフトウェアの検証や潜在的なセキュリティホール を検出する必要性が増大したことを意味する[ 4] 。以下のような分野で、複雑さを増していくソフトウェアの品質向上に静的コード解析が使われている。
VDC Research が行った調査(2012年)によれば、組み込みシステムのソフトウェア技術者の28.7%が静的コード解析ツールを既に使っており、39.7%が2年以内に使いたいと答えた[ 7] 。
アプリケーションのセキュリティの分野では Static Application Security Testing (SAST) という用語が使われている。
形式手法
形式手法 は、ソフトウェア やハードウェア の解析に用いられる用語であり、厳密に数学的な手法によって解析結果を得ることを意味する。数学的手法としては、表示的意味論 、公理的意味論 、操作的意味論 、抽象解釈 などがある。
実行時エラーを全て検出することは不可能であることが証明されており、任意のプログラムが正しく動作するかエラーになるかを判定する機械的手法はない。これは1930年代 のアラン・チューリング やライスの研究で判明した(チューリングマシンの停止問題 およびライスの定理 )。決定不能な問題 ではあるが、近似的な解でも有効である。
形式的な静的コード解析の実装方法には以下のようなものがある:
モデル検査 は、有限の状態を持つシステム を対象とし、無限に状態を持つシステムを抽象化 によって状態数を有限個に減らして行うこともある。
データフロー解析 は、プログラムの各点で変数群の取りうる値についての情報を集める技法である。
抽象解釈 は、プログラムの個々の文が抽象機械 の状態に何らかの影響を与える様子をモデル化したものである(つまり、ソフトウェアを個々の文の数学的属性と宣言に基づいて「実行」する)。抽象機械は解析しやすいようになるべく単純化されるので、実際のプログラムを完全に表すわけではない(もとのシステムで真である属性が抽象システムで常に真とは限らない)。うまくいけば、抽象解釈は「健全」とされる(抽象システムで真である全属性はもとのシステムでも真だといえる)[ 8] 。例えば、Frama-c やPolyspace といったツールは、抽象解釈の技法を使っている。
表明 をプログラム内で使うことは、ホーア論理 で最初に示唆された。一部のプログラミング言語は表明をツールとしてサポートしている[ 注釈 1] 。
静的コード解析ツール
事前コンパイラ (AOTコンパイラ)は、言語仕様には適合しているもののロジックの正当性が疑わしいようなコードや、未定義動作 を引き起こすようなコードを検出して、警告を出すものがほとんどである。ただし、コンパイラではカバーしきれない事項もあるため、独立した静的コード解析専用のツールを補助的に併用することも多い。統合開発環境 に標準搭載されているものもあれば、プラグイン やアドオン として開発者が追加できるようになっているものもある。コードエディター上で問題のある個所をハイライト表示するなど、ソースコードをコンパイルすることなくリアルタイムに指摘してくれるものもある。
C言語とC++
C#
CoffeeScript
FORTRAN
HTML
Go
Java
AndroidのJava言語
Perl
PHP
Python
JSP
Checkmarx CxSuite (商用)
Fortify SCA [ 9] (商用)
RIPS (商用)
VB.NET
Checkmarx CxSuite (商用)
Fortify SCA [ 9] (商用)
Parasoft dotTEST (商用)
Visual Studio
SonarQube (商用)
ASP.NET
Checkmarx CxSuite (商用)
Fortify SCA [ 9] (商用)
Cold Fusion
SAP の ABAP
SQL
JavaScript
ASP
Checkmarx CxSuite (商用)
Fortify SCA [ 9] (商用)
COBOL
WSDL
Ruby
Objective-C
脚注
注釈
出典
^ Wichmann, B. A., A. A. Canning, D. L. Clutterbuck, L. A. Winsbarrow, N. J. Ward, and D. W. R. Marsh. "Industrial Perspective on Static Analysis". Software Engineering Journal Mar. 1995: 69-75
^ 静的コード分析ツールと IBM Rational Team Concert との統合 - IBM Documentation
^ Software Quality Objectives for Source Code . Proceedings Embedded Real Time Software and Systems 2010 Conference , ERTS2, Toulouse, France: Patrick Briand, Martin Brochet, Thierry Cambois, Emmanuel Coutenceau, Olivier Guetta, Daniel Mainberte, Frederic Mondot, Patrick Munier, Loic Noury, Philippe Spozio, Frederic Retailleau
^ Improving Software Security with Precise Static and Runtime Analysis , Benjamin Livshits, section 7.3 "Static Techniques for Security," Stanford doctoral thesis, 2006.
^ FDA (2010年9月8日). “Infusion Pump Software Safety Research at FDA ”. Food and Drug Administration. 2010年9月9日 閲覧。
^ Computer based safety systems - technical guidance for assessing software aspects of digital computer based protection systems,
^ “Automated Defect Prevention for Embedded Software Quality ”. VDC Research (2012年2月1日). 2012年4月10日 閲覧。
^ Jones, Paul (2010年2月9日). “A Formal Methods-based verification approach to medical device software analysis ”. Embedded Systems Design. 2010年9月9日 閲覧。
^ a b c d e f g h i j k l m n o p 多言語(17)混在のシステムでの横断的解析が可能
^ C/C++ code analyzers | Microsoft Learn
^ Clang-Tidy — Extra Clang Tools git documentation
^ PhpMetrics, static analysis for PHP - by Jean-François Lépine
^ Find and fix problems in your JavaScript code - ESLint - Pluggable JavaScript Linter
参考文献
Syllabus and readings for Alex Aiken ’s Stanford CS295 course.
Nathaniel Ayewah, David Hovemeyer, J. David Morgenthaler, John Penix, William Pugh, "Using Static Analysis to Find Bugs ," IEEE Software, vol. 25, no. 5, pp. 22–29, Sep./Oct. 2008, doi :10.1109/MS.2008.130
Brian Chess, Jacob West (Fortify Software) (2007). Secure Programming with Static Analysis . Addison-Wesley. ISBN 978-0-321-42477-8
Flemming Nielson, Hanne R. Nielson, Chris Hankin (1999, corrected 2004). Principles of Program Analysis . Springer. ISBN 978-3-540-65410-0
"Abstract interpretation and static analysis," International Winter School on Semantics and Applications 2003, by David A. Schmidt
関連項目
外部リンク
The "box" approach テストレベル Testing types, techniques, and tactics 関連項目
カテゴリ