More Related Content
Similar to Klocwork C/C++解析チューニング 概要
Similar to Klocwork C/C++解析チューニング 概要 (20)
More from Masaru Horioka (7)
Klocwork C/C++解析チューニング 概要
- 1. 1© 2017 Rogue Wave Software, Inc. All Rights Reserved. 1
Klocwork
C/C++解析チューニング
概要
Masaru Horioka
Sales Engineering Manager,
APAC
- 2. 2© 2017 Rogue Wave Software, Inc. All Rights Reserved. 2
はじめに
• 本文書はKlocworkドキュメンテーション C/C++解析のチューニング
(https://support.roguewave.com/documentation/klocwork/jp/current/tuning
/)の内容を抜粋・加筆修正したものです。
- 3. 3© 2017 Rogue Wave Software, Inc. All Rights Reserved. 3
チューニングの基本概念
- 4. 4© 2017 Rogue Wave Software, Inc. All Rights Reserved. 4
kwinject
kwant
kwmaven
kwgradle
kwbuildproject kwadmin load
Native build
(make, ant,
mvn,etc)
Source
files
Build
Spec Table
s
Klocwork Server
Projects
DB
呼び出し
と監視
プロジェクト設定
解析結果
解析
結果
1. buildspecの生成 2. 解析 3. 解析結果のアップロード
4. 解析結果の確認
Klocwork 解析ステップ
- 5. 5© 2017 Rogue Wave Software, Inc. All Rights Reserved. 5
kwinject
kwant
kwmaven
kwgradle
kwbuildproject kwadmin load
Native build
(make, ant,
mvn,etc)
Source
files
Build
Spec Table
s
Klocwork Server
Projects
DB
呼び出し
と監視
プロジェクト設定
解析結果
解析
結果
1. buildspecの生成 2. 解析 3. 解析結果のアップロード
4. 解析結果の確認
Klocwork 解析ステップ
Native Build+実行
のシミュレーション
- 6. 6© 2017 Rogue Wave Software, Inc. All Rights Reserved. 6
Native Build+実行のシミュレーション
• kwcc
– klocworkコンパイラによるソースコードのコンパイ
ル
– 解析用.oファイルを生成
• kwlef
– 関数振る舞い情報(kb)の生成
– 解析
- 7. 7© 2017 Rogue Wave Software, Inc. All Rights Reserved. 7
誤検知や未検知が起きるとき
• Nativeビルドの再現が完全ではない
–コンパイル条件、対象の不一致
• 実行シミュレーションが完全ではない
–コンパイル結果としての振る舞い情報の不
一致
- 8. 8© 2017 Rogue Wave Software, Inc. All Rights Reserved. 8
C/C++ 解析のチューニングの3アプローチ
• https://support.roguewave.com/documentation/klocwork/jp/current/tuningccana
lysis/#concept463
1. KLOCWORK_ マクロを使用
2. kw解析専用ヘッダーファイルの使用
– #kw_override プリプロセッサディレクティブを使用し
てマクロ定義をオーバーライド
3. knowledge base (ナレッジベース) レコードを使用
その他にもkw解析用のincludeパスの追加、
コンパイラオプションの追加等がある
- 9. 9© 2017 Rogue Wave Software, Inc. All Rights Reserved. 9
1. __KLOCWORK__マクロの使用
• kwccは__KLOCWORK__を定義してKlocwork用コンパイルを実行する
– 「__」はアンダーバー*2
• 誤検知、未検知への対応として、ソースコードを変更して
Klocwork解析時のみ使用されるコードを有効化する
Klocwork解析で使用
Native Buildで使用
MY_ASSERTの解釈
が解析結果に影響
- 10. 10© 2017 Rogue Wave Software, Inc. All Rights Reserved. 10
2. kw解析専用ヘッダーファイルの使用
• 誤検知の原因=>マクロの解釈
• kw解析時にのみ使用されるヘッダーファイルを作成
• klocworkサーバーまたはローカル解析プロジェクトにインポート
• 解析時にのみ特別なマクロ展開が行われる
Klocworkが解釈でき
ないコード
Klocworkが解釈でき
るコード
- 11. 11© 2017 Rogue Wave Software, Inc. All Rights Reserved. 11
2. kw解析専用ヘッダーファイルの使用
Klocworkの解析時には
このように展開される
ソースの変更は不要
- 12. 12© 2017 Rogue Wave Software, Inc. All Rights Reserved. 12
Knowledge Base(KB)の話に行く前に
• Klocworkの解析エンジン
– http://www.roguewave.jp/getmedia/98eb773e-5505-4667-a854-
5c57372602c7/klocwork-paper-whole-program-analysis-jp
• 関数間解析
- 13. 13© 2017 Rogue Wave Software, Inc. All Rights Reserved. 13
ボトムアップで関数の振る舞い情報を生成
- 14. 14© 2017 Rogue Wave Software, Inc. All Rights Reserved. 14
KB=関数の振る舞い情報
• あくまで静的解析の(チェッカーの)観点
– システムリソース(メモリ、ファイル等)の取得、解放
– 配列へのアクセス
– ポインタへのアクセス
• ソースコードから生成
– ソースコードが無いもの(システムコール、解析対象外
のライブラリ)はkbが無いので、準備(チューニング)
してあげる必要がある
• 生成されてたkbが間違っている場合も、チューニングで対応
- 15. 15© 2017 Rogue Wave Software, Inc. All Rights Reserved. 15
KBの種類
• ビルトインKB
– <kw install>/config/kb以下
– システムライブラリ、よく使われるライブラリ
• 生成された(generated) KB
– <kwtables>/clef/generated.kb
– デスクトップ解析の場合.kwlp/workingcache/tables/clef
• ユーザーKB
– 自分で作って、サーバー解析、ローカル解析にimport
• kwadmin import-config <projectname> <kb file>
• kwcheck import <kb file>
- 16. 16© 2017 Rogue Wave Software, Inc. All Rights Reserved. 16
3. knowledge base (ナレッジベース) レ
コードによるチューニング
• 誤検知や未検知の原因が以下の場合に使用
– 呼び出した関数のKBが無い
• 呼び出し先関数が解析対象外
– ビルトインKB or 生成されたKBが間違っている
- 17. 17© 2017 Rogue Wave Software, Inc. All Rights Reserved. 17
例
試す場合はリンクなし(例:gcc –c
test.cpp) でコンパイル
- 19. 19© 2017 Rogue Wave Software, Inc. All Rights Reserved. 19
解析結果
知らない関数=KWに教えないといけないかな?
- 20. 20© 2017 Rogue Wave Software, Inc. All Rights Reserved. 20
KBの種類
KBの種類 関連するチェッカ例
ACQUIRE レコードおよび RELEASE レコード RLK.*
ALLOC レコード MLK.*
BAA レコードおよび IAA レコード ABV.* 等
バイトオーダーレコード BO.*
BPS レコード
CONC レコードおよび LOCK レコード CONC.*
FREE レコードおよび SAFE_FREE レコード MLK.*
ハッシュソルト レコード RCA.*
NNTS.SRC レコード NNTS.*
NPD レコード (x)NPD.*
R レコードおよび W レコード UNINIT.*
RET レコード
SETZERO レコード
SLEEP レコード CONC.*
汚染データレコードおよび安全でないデータレコード SV.TAINTED.* 等
ユーザー名およびパスワードのレコード HCC.*
XMRF レコード MLK.*
https://support.roguewave.com/documentation/klocwork/jp/current/ccknowledgebaserefe
- 21. 21© 2017 Rogue Wave Software, Inc. All Rights Reserved. 21
チューニング – kbの作成
• kbはテキストファイルで作成
• フォーマット
– <function_name> <function_key> <record_kind>
<specification>
• 例
• __special_abort__ - NORET
シグニチャ
振る舞い
タイプ
詳細条件
- 22. 22© 2017 Rogue Wave Software, Inc. All Rights Reserved. 22
試してみよう1
• test.cppを作成
#include <stdio.h>
void __special_abort__();
void my_abort() { __special_abort__();}
#define MY_ASSERT(x) do { if( !(x) ) my_abort(); } while(0)
void test_assert(int* piValue) {
MY_ASSERT(piValue != NULL);
*piValue = 1;
}
• gcc –c test.cpp できることを確認
- 23. 23© 2017 Rogue Wave Software, Inc. All Rights Reserved. 23
試してみよう2
• kwinject –o kwinject.out < gcc –c test.cpp 等>
• kwcheck create
• kwcheck import kwinject.out
• kwcheck run
- 24. 24© 2017 Rogue Wave Software, Inc. All Rights Reserved. 24
試してみよう3
• .kwlp/workingcache/tables/clef/nokbrecords_full.txt を開いてみる
• 参考
– generated.kbはencryptされている。decrypt するためには
kb_converter.pyが必要(製品に含まれていないので、Rogue
Waveまたは販売代理店から提供)
<python> kb_coverter.py workingcache/tables/clef/generated.kb
generated.kb.txt
- 25. 25© 2017 Rogue Wave Software, Inc. All Rights Reserved. 25
試してみよう4
• 以下を含むmy.kbを作成
__special_abort__ - NORET
• kwcheck import my.kb
• kwcheck list-conf で確認
– 参考:my.kbを破棄したい場合は
• kwcheck discard my.kb
• kwcheck run –r
• 指摘がなくなったかな?
- 26. 26© 2017 Rogue Wave Software, Inc. All Rights Reserved. 26
my.kbの適用前後でgenerated.kbを比較してみ
ると
• my_abortにNORETが追加されている!!!
- 27. 27© 2017 Rogue Wave Software, Inc. All Rights Reserved. 27
重要:KBチューニングのためのステップ
1. 本番解析環境での誤検知、未検知の発見
2. (小さなコードで)問題を再現させる
3. KBが存在しないこと、間違ってることを確認する
– <kwtables>/clef/nokbrecords_full.txt
– <kwtables>/clef/generated.kb,
<kwinstall>/config/kb
4. ユーザーKBを作る。小さなコードで誤検知、未検
知の解消を確認する
5. 本番解析環境でKBを適用して動作確認する
- 28. 28© 2017 Rogue Wave Software, Inc. All Rights Reserved. 28
ヒント
• KBのフォーマットは覚えにくい。特に詳細条件の箇所
– ビルトインKBやgenerated.kbをみる
– 簡単なコードを書いて、どんなkbが生成されるか見てみる
(kb_converter.pyを使用)
時間があったら
試してみよう
- 29. 29© 2017 Rogue Wave Software, Inc. All Rights Reserved. 29
ヒント2
• 小さな再現環境の作成に使えるツール(サポート用内部ツールなので、基
本テクニカルサポートの対象外ではあるが使用可)
– 本番マシンで、誤検知があるc/cppファイルとそれに関するファイル
郡のアーカイブ
<kw install>/kwpython "server installationbinkwcollect.py" --lef -f "full
path to c/cpp file" -o "archive.kwz" <tables directory>
– 別マシンで展開し、KBのテストを行う
<kw install>/kwpython "server installationbinkwunpack.py" archive.kwz
以下の場所にテスト用ビルドスペックができる
archive/specs/custom/buildspec.out
- 30. 30© 2017 Rogue Wave Software, Inc. All Rights Reserved. 30
その他重要なポイント
• サーバー解析とコネクテッドデスクトップ解析
– KlocworkサーバーのprojectにimportされたユーザーKBはコネ
クテッドデスクトップ解析すると、デスクトップ側にダウン
ロードされて、解析に使用されます。
• 本番解析で適用可能な、ユーザーKBができたら、構成管理に入れ
とこう