klocwork カスタムチェッカー紹介
TRANSCRIPT
2© 2016 Rogue Wave Software, Inc. All Rights Reserved. 2
静的解析ツールKlocwork
カスタムチェッカー入門
Masaru Horioka(堀岡 勝)Sales Engineering Manager , APAC
3© 2016 Rogue Wave Software, Inc. All Rights Reserved. 3
Klocworkカスタムチェッカーとは
• 標準チェッカーで(現時点で)カバーされないチェックを実施したいとき
に使う
• 標準チェッカーとは
– C/C++, Java, C#のチェッカー
• https://support.roguewave.com/documentation/klocwork/jp/curr
ent/checkersintro/
• MISRAチェッカー 忘れられがちだが数百のコーディングルールが実装されている。MISRAチェッカーの詳細は権利の
関係から、製品に付随するマニュアルでのみ提供されているので注意。
4© 2016 Rogue Wave Software, Inc. All Rights Reserved. 4
カスタムチェッカーの種類
種類 用途 利用形態
KASTチェッカー ASTパタンマッチング
によるコーディングルールの実装
• ユーザによる実装
• 代理店によるサービスとしてして提供
• Rogue Wave
Professional Service
による有償コンサルティングサービス※として提供
PATHチェッカー パス解析(仮想実行)によるチェッカー実装
Rogue Wave
Professional Serviceに
よる有償コンサルティングサービス※として提供
アーキテクチャ・チェッカー
アーキテクチャ解析(依存関係)によるチェッカー実装
Rogue Wave
Professional Serviceに
よる有償コンサルティングサービス※として提供
5© 2016 Rogue Wave Software, Inc. All Rights Reserved. 5
参考:Rogue Wave Professional Serviceによるカスタムチェッカー実装サービス
• 契約からデリバリーまでの流れ
– お客様からRogue Wave: 仕様、テストコード提供
– Rogue Waveからお客様: 見積もり
– お客さま/Rogue Wave: SOW(作業名明細書)作成、契約
– Rogue Waveからお客様:成果物提供、トレーニング
– お客様からRogue Wave:受け入れ確認
• 参考価格
– チェッカー構築費用:10-50 K USD (難易度やチェッカー数による)
– サポート費用: 10K USD /年 (5作業日まで)
• 仕様変更やバージョンアップ時のテスト、調整
• 問い合わせ先
7© 2016 Rogue Wave Software, Inc. All Rights Reserved. 7
KASTチェッカーの原理• 1 Translation Unit内(≒コンパイルされるファイル)の、(プリプロセス済
み)ASTに対して、パターンマッチを行い、問題を発見する
• 例:https://support.roguewave.com/documentation/klocwork/jp/current/ccka
stexamples/#concept447
8© 2016 Rogue Wave Software, Inc. All Rights Reserved. 8
KASTチェッカーの例
• 行マッチング
– 呼んではいけない関数
– Global変数を使っている
– 変数の命名規則
• 構造マッチング
– 中括弧の無いif節
– break文の無いcare文
9© 2016 Rogue Wave Software, Inc. All Rights Reserved. 9
KASTチェッカーで出来ないこと
• プリプロセス前のコードのチェック
– #define AAA 111
• プリプロセッサディレクティブに関するチェック
– #if xxx
• コメントのチェック
• スペース、インデント
• Translation Unitをまたぐ(.c/.ccファイルまたぎ)情報が必要なもの
• パス解析(実行シミュレーション)に関わるもの
MISRAチェッカー
ではカバーされているもの有り
10© 2016 Rogue Wave Software, Inc. All Rights Reserved. 10
KASTチェッカー作成ステップ
1. 仕様を考える
2. テストケースの作成
– コンパイルできること
– 発見したいパターン、発見してほしくないパターンの両方を作る
3. MISRAチェッカーも含む全チェッカーをONにしてみて、既
存チェッカーでカバーされていないか確認
4. Checker Studio等でCheckerパターンを開発
5. kwcreatecheckerコマンド等でチェッカー、チェッカーメッセージ、ヘルプ作
成
6. 小さなテストケースによるテスト
7. 本番コード/大規模コードによるテスト
8. 必要に応じてtaxonomy 作成、確認
9. 本番環境に展開
11© 2016 Rogue Wave Software, Inc. All Rights Reserved. 11
カスタムチェッカー作成ステップ補足
• 前提条件
– Klocworkコマンドラインデスクトップツールがインストール済み
– windows – visual studioのコンパイル環境がある
• .cppファイルでカスタム関数を作らない場合、make環境のみあれば良い
– linux – gccのコンパイル環境がある
• https://support.roguewave.com/documentation/klocwork/jp/current/creatingcckastchecker
s/#concept671 の補足
– 5.チェッカーをビルドします。
• nmake install を実行すると<checker name>.zipができる
• <checker name>.zipを展開しておく
– 6.チェッカーをテストします。
• xmlのみでチェッカーを作成した場合、<username>/. klocwork/<plugins>/
の下にStep 5で生成された<checker name>.zipに含まれる.xmlと.jarをコ
ピーする。.cppファイルでカスタムチェッカーを作成した場合、
<plugins>/<platform>へのコピーが必要。テストが終わったら要削除。
12© 2016 Rogue Wave Software, Inc. All Rights Reserved. 12
学習方法1
KASTチェッカーのパターンは一見すると複雑に見える。チュー
トリアルを一通りためしたら、例や標準チェッカーから学ぶのが
効率的
https://support.roguewave.com/documentation/klocwork/jp/current/kastcheck
ers/
のチュートリアル1および2を自分で試してみる
• サンプルを見る
https://support.roguewave.com/documentation/klocwork/jp/current/cckaste
xamples/#concept447
MISRAチェッカーに含まれる misra.xml
<Klocwork install dir>/plugins/builtin_ccxx_plugins.xml
13© 2016 Rogue Wave Software, Inc. All Rights Reserved. 13
学習方法2
• 構文リファレンスをみる
https://support.roguewave.com/documentation/klocwork/jp/current/cckasts
yntaxreference/#concept455
– 上方、下方検索
– 制約
14© 2016 Rogue Wave Software, Inc. All Rights Reserved. 14
Checker Studio
AST
テストケース
パターンを発見するためのKAST 表現
プログラミング言語
選択された要素のAttribute(属性) ウィンドウ
attributesの表示有無
テストケースのKASTツリー
15© 2016 Rogue Wave Software, Inc. All Rights Reserved. 15
Checker Studioのヘルプ
• Select node and press F1 or View > Context help window
16© 2016 Rogue Wave Software, Inc. All Rights Reserved. 16
Checker Studio ドキュメンテーション
• Help > Help Topics:
17© 2016 Rogue Wave Software, Inc. All Rights Reserved. 17
Checker fileの例
<checkers version="1.3"> <checkergroup language="C/C++" api="tree_pattern">
<checker id="MY.CHECKER1"> <error id=" MY.CHECKER1 "
enabled="false" severity="4" > <title locale="en" text="English Title" /> <title
locale="ja" text="日本語タイトル" /> <message locale="en" text="English Message" />
<message locale="ja" text="日本語メッセージ" /> <pattern>
//…</pattern> <pattern>
//…</pattern>
</error> </checker><checker id="MY.CHECKER2">
…</checker>
</checkergroup></checkers>
• 英語、日本語環境でメッセージを変えるためには、localeごとにtitleおよびmessageの指定が必要
• ファイルencodingはutf-8
既存のプロジェクトへの影響を避けるなら、デフォルトでは有効にならないよう、enabled="false"にしておく
18© 2016 Rogue Wave Software, Inc. All Rights Reserved. 18
taxonomyファイルの例
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<errors language="Any" version="1.4">
<categories name="My Company Custom Rule English"
locale="en"> <category name="KAST checkers">
<error id="MY.C.RULE"/>
</category>
</categories>
<categories name="My Company Custom Rule Japan" locale="ja">
<category name="KAST checkers">
<error id="MY.C.RULE"/>
</category>
</categories>
</errors>
• 日本語OS環境で分類基準が表示されるようにするためにはcategories
タグにname指定とlocale="ja"の指定が必要
• スタンドアロンデスクトップ環境でチェッカーとtaxonomyを同時管理したいなら、Checker fileにtaxonomy
もいれることもできる。
19© 2016 Rogue Wave Software, Inc. All Rights Reserved. 19
参考:Klocworkサポート利用時の注意
• 「xxxを検出したいのですが、どのようなパターンを書けばば良いですか?」
– と質問しても多分答えてくれない。代理店かコンサルティングサービス
に相談くださいと言われる。
• カスタムチェッカーに関してKlocworkが提供するのは「KAST開発環境と
API」
• Klocworkサポートが対応するのは「KAST開発環境とAPI」に関する質問やバ
グ報告
→APIの使用方法の質問であればOK
結論「何が分からないのか明確化した上で、質問の内容と質問先を選ぶ」
20© 2016 Rogue Wave Software, Inc. All Rights Reserved. 20
例 MISRA.LITERAL.SUFFIX.CASE (Literal suffix in lower
case)は、u/U, f/Fについても小文字を許容しないが、これを以下のように変更する。
u/U 小文字を正、大文字を不正とする。 -→大文字をチェックする
f/F どちらでもよい。→チェックしない
misra.xmlより
21© 2016 Rogue Wave Software, Inc. All Rights Reserved. 21
例:MISRA.VAR.HIDDEN (Variable declaration hides declaration in upper
scope)と同機能で、隠されている側の宣言の位置(ファイル名と行番号)が分かるもの。
MISRA.VAR.HIDDENはKASTチェッカーでは無いので機能拡張要求を上げて
もらったほうがベター