22
1 © 2016 Rogue Wave Software, Inc. All Rights Reserved. 1

Klocwork カスタムチェッカー紹介

Embed Size (px)

Citation preview

1© 2016 Rogue Wave Software, Inc. All Rights Reserved. 1

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作業日まで)

• 仕様変更やバージョンアップ時のテスト、調整

• 問い合わせ先

[email protected]

6© 2016 Rogue Wave Software, Inc. All Rights Reserved. 6

KAST チェッカーの作成

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チェッカーでは無いので機能拡張要求を上げて

もらったほうがベター

22© 2016 Rogue Wave Software, Inc. All Rights Reserved. 22