「Clang Static Analyzer」の版間の差分
(ページの作成:「Clang Static Analyzer とは、ソースコード解析ツール です。 '''読み方''' ;Clang Static Analyzer:くらんぐ すたてぃっく あなら...」) |
(相違点なし)
|
2017年10月22日 (日) 11:24時点における最新版
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