SlideShare a Scribd company logo
1© 2017 Rogue Wave Software, Inc. All Rights Reserved. 1
Klocwork
C/C++解析チューニング
概要
Masaru Horioka
Sales Engineering Manager,
APAC
2© 2017 Rogue Wave Software, Inc. All Rights Reserved. 2
はじめに
• 本文書はKlocworkドキュメンテーション C/C++解析のチューニング
(https://support.roguewave.com/documentation/klocwork/jp/current/tuning
/)の内容を抜粋・加筆修正したものです。
3© 2017 Rogue Wave Software, Inc. All Rights Reserved. 3
チューニングの基本概念
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© 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© 2017 Rogue Wave Software, Inc. All Rights Reserved. 6
Native Build+実行のシミュレーション
• kwcc
– klocworkコンパイラによるソースコードのコンパイ
ル
– 解析用.oファイルを生成
• kwlef
– 関数振る舞い情報(kb)の生成
– 解析
7© 2017 Rogue Wave Software, Inc. All Rights Reserved. 7
誤検知や未検知が起きるとき
• Nativeビルドの再現が完全ではない
–コンパイル条件、対象の不一致
• 実行シミュレーションが完全ではない
–コンパイル結果としての振る舞い情報の不
一致
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© 2017 Rogue Wave Software, Inc. All Rights Reserved. 9
1. __KLOCWORK__マクロの使用
• kwccは__KLOCWORK__を定義してKlocwork用コンパイルを実行する
– 「__」はアンダーバー*2
• 誤検知、未検知への対応として、ソースコードを変更して
Klocwork解析時のみ使用されるコードを有効化する
Klocwork解析で使用
Native Buildで使用
MY_ASSERTの解釈
が解析結果に影響
10© 2017 Rogue Wave Software, Inc. All Rights Reserved. 10
2. kw解析専用ヘッダーファイルの使用
• 誤検知の原因=>マクロの解釈
• kw解析時にのみ使用されるヘッダーファイルを作成
• klocworkサーバーまたはローカル解析プロジェクトにインポート
• 解析時にのみ特別なマクロ展開が行われる
Klocworkが解釈でき
ないコード
Klocworkが解釈でき
るコード
11© 2017 Rogue Wave Software, Inc. All Rights Reserved. 11
2. kw解析専用ヘッダーファイルの使用
Klocworkの解析時には
このように展開される
ソースの変更は不要
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© 2017 Rogue Wave Software, Inc. All Rights Reserved. 13
ボトムアップで関数の振る舞い情報を生成
14© 2017 Rogue Wave Software, Inc. All Rights Reserved. 14
KB=関数の振る舞い情報
• あくまで静的解析の(チェッカーの)観点
– システムリソース(メモリ、ファイル等)の取得、解放
– 配列へのアクセス
– ポインタへのアクセス
• ソースコードから生成
– ソースコードが無いもの(システムコール、解析対象外
のライブラリ)はkbが無いので、準備(チューニング)
してあげる必要がある
• 生成されてたkbが間違っている場合も、チューニングで対応
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© 2017 Rogue Wave Software, Inc. All Rights Reserved. 16
3. knowledge base (ナレッジベース) レ
コードによるチューニング
• 誤検知や未検知の原因が以下の場合に使用
– 呼び出した関数のKBが無い
• 呼び出し先関数が解析対象外
– ビルトインKB or 生成されたKBが間違っている
17© 2017 Rogue Wave Software, Inc. All Rights Reserved. 17
例
試す場合はリンクなし(例:gcc –c
test.cpp) でコンパイル
18© 2017 Rogue Wave Software, Inc. All Rights Reserved. 18
解析結果
19© 2017 Rogue Wave Software, Inc. All Rights Reserved. 19
解析結果
知らない関数=KWに教えないといけないかな?
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© 2017 Rogue Wave Software, Inc. All Rights Reserved. 21
チューニング – kbの作成
• kbはテキストファイルで作成
• フォーマット
– <function_name> <function_key> <record_kind>
<specification>
• 例
• __special_abort__ - NORET
シグニチャ
振る舞い
タイプ
詳細条件
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© 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© 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© 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© 2017 Rogue Wave Software, Inc. All Rights Reserved. 26
my.kbの適用前後でgenerated.kbを比較してみ
ると
• my_abortにNORETが追加されている!!!
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© 2017 Rogue Wave Software, Inc. All Rights Reserved. 28
ヒント
• KBのフォーマットは覚えにくい。特に詳細条件の箇所
– ビルトインKBやgenerated.kbをみる
– 簡単なコードを書いて、どんなkbが生成されるか見てみる
(kb_converter.pyを使用)
時間があったら
試してみよう
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© 2017 Rogue Wave Software, Inc. All Rights Reserved. 30
その他重要なポイント
• サーバー解析とコネクテッドデスクトップ解析
– KlocworkサーバーのprojectにimportされたユーザーKBはコネ
クテッドデスクトップ解析すると、デスクトップ側にダウン
ロードされて、解析に使用されます。
• 本番解析で適用可能な、ユーザーKBができたら、構成管理に入れ
とこう
31© 2017 Rogue Wave Software, Inc. All Rights Reserved. 31
Q&A
32© 2017 Rogue Wave Software, Inc. All Rights Reserved. 32

More Related Content

What's hot

Java 9で進化する診断ツール
Java 9で進化する診断ツールJava 9で進化する診断ツール
Java 9で進化する診断ツール
Yasumasa Suenaga
 
Klocwork カスタムチェッカー紹介
Klocwork カスタムチェッカー紹介Klocwork カスタムチェッカー紹介
Klocwork カスタムチェッカー紹介
Masaru Horioka
 
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
Shinya Sugiyama
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
Daisuke Morishita
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
Masatoshi Tada
 
ライセンスを理解してますか?知っておきたいWordPressとGPLライセンス
ライセンスを理解してますか?知っておきたいWordPressとGPLライセンスライセンスを理解してますか?知っておきたいWordPressとGPLライセンス
ライセンスを理解してますか?知っておきたいWordPressとGPLライセンス
Jun Nogata
 
静的解析ツール Klocworkによる 機能安全規格への対応
静的解析ツール Klocworkによる 機能安全規格への対応静的解析ツール Klocworkによる 機能安全規格への対応
静的解析ツール Klocworkによる 機能安全規格への対応
Masaru Horioka
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術
Kiyokuni Kawachiya
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
 
エンジニア必見!Sreへの第一歩
エンジニア必見!Sreへの第一歩エンジニア必見!Sreへの第一歩
エンジニア必見!Sreへの第一歩
Takuya Tezuka
 
Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~
Yuta Matsumura
 
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
cloudconductor
 
DevOps勉強会
DevOps勉強会DevOps勉強会
DevOps勉強会
Shuntaro Saiba
 
ZOZOTOWNのアーキテクトという役割を紹介します
ZOZOTOWNのアーキテクトという役割を紹介しますZOZOTOWNのアーキテクトという役割を紹介します
ZOZOTOWNのアーキテクトという役割を紹介します
Hiromasa Oka
 
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)
Keigo Suda
 
Springを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイントSpringを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイント
土岐 孝平
 
Zabbix概論
Zabbix概論Zabbix概論
Zabbix概論
真乙 九龍
 
インターネットにおける悪評 - 高野光弘編
インターネットにおける悪評 - 高野光弘編インターネットにおける悪評 - 高野光弘編
インターネットにおける悪評 - 高野光弘編
TAKANO Mitsuhiro
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
Takakiyo Tanaka
 
Terraformディレクトリ構成のベスプラを考えてみた
Terraformディレクトリ構成のベスプラを考えてみたTerraformディレクトリ構成のベスプラを考えてみた
Terraformディレクトリ構成のベスプラを考えてみた
山下 達也
 

What's hot (20)

Java 9で進化する診断ツール
Java 9で進化する診断ツールJava 9で進化する診断ツール
Java 9で進化する診断ツール
 
Klocwork カスタムチェッカー紹介
Klocwork カスタムチェッカー紹介Klocwork カスタムチェッカー紹介
Klocwork カスタムチェッカー紹介
 
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
MySQL InnoDB Clusterによる高可用性構成(DB Tech Showcase 2017)
 
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
エンジニアのためのOSSライセンス管理~OSS管理ツールの池の水全部抜く~
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
 
ライセンスを理解してますか?知っておきたいWordPressとGPLライセンス
ライセンスを理解してますか?知っておきたいWordPressとGPLライセンスライセンスを理解してますか?知っておきたいWordPressとGPLライセンス
ライセンスを理解してますか?知っておきたいWordPressとGPLライセンス
 
静的解析ツール Klocworkによる 機能安全規格への対応
静的解析ツール Klocworkによる 機能安全規格への対応静的解析ツール Klocworkによる 機能安全規格への対応
静的解析ツール Klocworkによる 機能安全規格への対応
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
エンジニア必見!Sreへの第一歩
エンジニア必見!Sreへの第一歩エンジニア必見!Sreへの第一歩
エンジニア必見!Sreへの第一歩
 
Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~Jenkins使ってみた~Windows編~
Jenkins使ってみた~Windows編~
 
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
Consulによる運用自律化体験ハンズオンとConsul活用事例紹介
 
DevOps勉強会
DevOps勉強会DevOps勉強会
DevOps勉強会
 
ZOZOTOWNのアーキテクトという役割を紹介します
ZOZOTOWNのアーキテクトという役割を紹介しますZOZOTOWNのアーキテクトという役割を紹介します
ZOZOTOWNのアーキテクトという役割を紹介します
 
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)
Apache Kafka & Kafka Connectを に使ったデータ連携パターン(改めETLの実装)
 
Springを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイントSpringを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイント
 
Zabbix概論
Zabbix概論Zabbix概論
Zabbix概論
 
インターネットにおける悪評 - 高野光弘編
インターネットにおける悪評 - 高野光弘編インターネットにおける悪評 - 高野光弘編
インターネットにおける悪評 - 高野光弘編
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
 
Terraformディレクトリ構成のベスプラを考えてみた
Terraformディレクトリ構成のベスプラを考えてみたTerraformディレクトリ構成のベスプラを考えてみた
Terraformディレクトリ構成のベスプラを考えてみた
 

Similar to Klocwork C/C++解析チューニング 概要

Openstack ceph 20171115 vtj
Openstack ceph 20171115 vtjOpenstack ceph 20171115 vtj
Openstack ceph 20171115 vtj
Takehiro Kudou
 
OSSで作るOpenStack監視システム
OSSで作るOpenStack監視システムOSSで作るOpenStack監視システム
OSSで作るOpenStack監視システム
satsuki fukazu
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
Yu Nobuoka
 
継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキングTakayuki Kondou
 
ビルドサーバで使うDocker
ビルドサーバで使うDockerビルドサーバで使うDocker
ビルドサーバで使うDocker
Masashi Shinbara
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング
Kiyokazu Kaba
 
ASP.NET vNextの全貌
ASP.NET vNextの全貌ASP.NET vNextの全貌
ASP.NET vNextの全貌
A AOKI
 
ACI Kubernetes Integration
ACI Kubernetes IntegrationACI Kubernetes Integration
ACI Kubernetes Integration
Takehiro Yokoishi
 
IBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみたIBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみた
You&I
 
130329 04
130329 04130329 04
130329 04openrtm
 
20130329 rtm4
20130329 rtm420130329 rtm4
20130329 rtm4openrtm
 
Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-
recotech
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
Hiroshi SHIBATA
 
[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005
Microsoft Tech Summit 2017
 
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Yahoo!デベロッパーネットワーク
 
Jenkins study jenkins build-cicdi
Jenkins study jenkins build-cicdiJenkins study jenkins build-cicdi
Jenkins study jenkins build-cicdi
昌桓 李
 
サーバー設定自動化は経営課題
サーバー設定自動化は経営課題 サーバー設定自動化は経営課題
サーバー設定自動化は経営課題
Maho Takara
 
Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月
Emma Haruka Iwao
 
Jenkins 2.0 (日本語)
Jenkins 2.0 (日本語)Jenkins 2.0 (日本語)
Jenkins 2.0 (日本語)
Kohsuke Kawaguchi
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
Kentaro Ebisawa
 

Similar to Klocwork C/C++解析チューニング 概要 (20)

Openstack ceph 20171115 vtj
Openstack ceph 20171115 vtjOpenstack ceph 20171115 vtj
Openstack ceph 20171115 vtj
 
OSSで作るOpenStack監視システム
OSSで作るOpenStack監視システムOSSで作るOpenStack監視システム
OSSで作るOpenStack監視システム
 
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング
 
ビルドサーバで使うDocker
ビルドサーバで使うDockerビルドサーバで使うDocker
ビルドサーバで使うDocker
 
誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング誰にでもできるパフォーマンスチューニング
誰にでもできるパフォーマンスチューニング
 
ASP.NET vNextの全貌
ASP.NET vNextの全貌ASP.NET vNextの全貌
ASP.NET vNextの全貌
 
ACI Kubernetes Integration
ACI Kubernetes IntegrationACI Kubernetes Integration
ACI Kubernetes Integration
 
IBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみたIBM Rational Team Concertに触れてみた
IBM Rational Team Concertに触れてみた
 
130329 04
130329 04130329 04
130329 04
 
20130329 rtm4
20130329 rtm420130329 rtm4
20130329 rtm4
 
Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005[Japan Tech summit 2017] DEP 005
[Japan Tech summit 2017] DEP 005
 
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
 
Jenkins study jenkins build-cicdi
Jenkins study jenkins build-cicdiJenkins study jenkins build-cicdi
Jenkins study jenkins build-cicdi
 
サーバー設定自動化は経営課題
サーバー設定自動化は経営課題 サーバー設定自動化は経営課題
サーバー設定自動化は経営課題
 
Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月Docker事始めと最新動向 2015年6月
Docker事始めと最新動向 2015年6月
 
Jenkins 2.0 (日本語)
Jenkins 2.0 (日本語)Jenkins 2.0 (日本語)
Jenkins 2.0 (日本語)
 
How to run P4 BMv2
How to run P4 BMv2How to run P4 BMv2
How to run P4 BMv2
 

More from Masaru Horioka

JetBrainsライセンス購入方法
JetBrainsライセンス購入方法JetBrainsライセンス購入方法
JetBrainsライセンス購入方法
Masaru Horioka
 
Klocwork 2018.0 アップデート
Klocwork 2018.0 アップデートKlocwork 2018.0 アップデート
Klocwork 2018.0 アップデート
Masaru Horioka
 
Klocwork 2017.1アップデート
Klocwork 2017.1アップデートKlocwork 2017.1アップデート
Klocwork 2017.1アップデート
Masaru Horioka
 
Klocwork 2017.0アップデート
Klocwork 2017.0アップデートKlocwork 2017.0アップデート
Klocwork 2017.0アップデート
Masaru Horioka
 
Klocworkバージョン11.2アップデート
Klocworkバージョン11.2アップデートKlocworkバージョン11.2アップデート
Klocworkバージョン11.2アップデート
Masaru Horioka
 
Mentoring
MentoringMentoring
Mentoring
Masaru Horioka
 
静的解析のROI
静的解析のROI静的解析のROI
静的解析のROI
Masaru Horioka
 

More from Masaru Horioka (7)

JetBrainsライセンス購入方法
JetBrainsライセンス購入方法JetBrainsライセンス購入方法
JetBrainsライセンス購入方法
 
Klocwork 2018.0 アップデート
Klocwork 2018.0 アップデートKlocwork 2018.0 アップデート
Klocwork 2018.0 アップデート
 
Klocwork 2017.1アップデート
Klocwork 2017.1アップデートKlocwork 2017.1アップデート
Klocwork 2017.1アップデート
 
Klocwork 2017.0アップデート
Klocwork 2017.0アップデートKlocwork 2017.0アップデート
Klocwork 2017.0アップデート
 
Klocworkバージョン11.2アップデート
Klocworkバージョン11.2アップデートKlocworkバージョン11.2アップデート
Klocworkバージョン11.2アップデート
 
Mentoring
MentoringMentoring
Mentoring
 
静的解析のROI
静的解析のROI静的解析のROI
静的解析のROI
 

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) でコンパイル
  • 18. 18© 2017 Rogue Wave Software, Inc. All Rights Reserved. 18 解析結果
  • 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ができたら、構成管理に入れ とこう
  • 31. 31© 2017 Rogue Wave Software, Inc. All Rights Reserved. 31 Q&A
  • 32. 32© 2017 Rogue Wave Software, Inc. All Rights Reserved. 32