Clang Static Analyzer

提供: C言語入門
移動: 案内検索
スポンサーリンク

Clang Static Analyzer とは、ソースコード解析ツール です。

読み方

Clang Static Analyzer
くらんぐ すたてぃっく あならいざー

概要

Clang Static Analyzer は、C, C++, Objective-C プログラムのバグを発見するツールです。 コマンドラインツールと Xcode で使えるツールが提供されています。

Clang Static Analyzer は、clang のパッケージで提供されます。

grep みたいなソースコード解析とは違い、しっかりソースを見てくれるので、信頼できるレポートが期待できます。 

インストール

sudo pkg install clan38

コマンド

ソースコードコードの解析には、以下のコマンドを利用します。

scan-build
解析コマンド
scan-view
解析結果の閲覧コマンド

環境によって異なるかもしれませんが、FreeBSD では clang のバージョンごとのコマンドが提供されます。 FreeBSD の clang38 では、

  • scan-build38
  • scan-view38

が提供されています。

使い方

解析を実行するコマンド

make や cc コマンドで利用できます。

scan-build38 make
scan-build38 cc a.c

結果を見るコマンド

scan-build で作成されたファイルを利用して、レポートを表示します。

scan-view38 /tmp/scan-build-XXXX...

結果をウェブブラウザで見る方法

解析結果を CUI (w3m) で見ても良いのですが、Chrome や Firefox などのウェブブラウザでみたいよ、という方もいらっしゃると思います。 GUIのブラウザで確認したい場合は、ポート番号などを指定して、scan-view を実行します。 リモートからアクセスする場合は、認証で弾かれてしまうので、 --allow-all-hosts を指定すれば、リモートからでもアクセスできるようになります。この設定をする場合は、その設定をしても問題ないのか、よく考えてから設定してください。

scan-view36 --host=0.0.0.0 --port=8081 --allow-all-hosts /tmp/scan-build-2017-10-21-165519-33335-1

ウェブブラウザから http:// scan-view を実行しているホスト :8081/ でアクセスできます。

実行例

$ cat i.c
/*
 * i.c
 * Copyright (C) 2017 kaoru <kaoru@localhost>
 *
 * Distributed under terms of the MIT license.
 */
 
int
main(int argc, char *argv[])
{
        int i = 9;
        i = 0;
        return 0;
}
 
$ scan-build38 cc i.c
scan-build: Using '/usr/local/llvm38/bin/clang-3.8' for static analysis
i.c:12:2: warning: Value stored to 'i' is never read
        i = 0;
        ^   ~
1 warning generated.
scan-build: 1 bug found.
scan-build: Run 'scan-view /tmp/scan-build-2017-10-22-111146-70312-1' to examine bug reports.

上記の例では、 scan-view コマンドを実行する、となっていますが、 scan-view38 に置き換えて実行します(FreeBSDではscan-viewという名前ではコマンドが用意されていないため)。

scan-view38 /tmp/scan-build-2017-10-22-111146-70312-1

scan-view38 を実行すると w3m (テキストブラウザ) が実行されます。

tmp - scan-build results
 
      User:        kaworu@a1.local
Working Directory: /tmp
  Command Line:    cc i.c
  Clang Version:   clang version 3.8.1 (tags/RELEASE_381/final)
      Date:        Sun Oct 22 11:11:46 2017
 
Bug Summary
 
Bug Type         Quantity Display?
All Bugs         1          [ ]
   Dead store
Dead assignment  1          [ ]
 
Reports
 
Bug Group  Bug Type ▾      File Function/Method Line Path Length
Dead store Dead assignment i.c  main            12   1           View Report Report Bug Open File

View Report を開くと、ソースコード付きで、問題を確認できます。

Summary > Report a60a1d
 
Bug Summary
 
File:        i.c
Location:    line 12, column 2
Description: Value stored to 'i' is never read
 
Report Bug
 
Annotated Source Code
 
1  /*
2  * i.c
3  * Copyright (C) 2017 kaoru <kaoru@localhost>
4  *
5  * Distributed under terms of the MIT license.
6  */
7
8  int
9  main(int argc, char *argv[])
10 {
11 int i = 9;
12 i = 0;
   Value stored to 'i' is never read
13 return 0;
14 }
15
16

関連項目




スポンサーリンク