C++test7.3 バグ探偵 リソースリークのカスタマイズ - テクマトリックス

C++test7.3 バグ探偵
リソースリークのカスタマイズについて
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
(V1.0)
2010/07/14
テクマトリックス株式会社
1 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
目 次
1
はじめに............................................................................................................................................4
2
リソースリークのルールのカスタマイズ方法...................................................................................5
2.1
3
4
リソースリークのカスタマイズ .................................................................................................5
2.1.1
テストコンフィギュレーションの複製 ...............................................................................5
2.1.2
リソースのタイプの追加.....................................................................................................6
2.1.3
ルールパラメーターの変更 .................................................................................................7
リソース関数の設定項目...................................................................................................................8
3.1
リソースアロケーター ...............................................................................................................8
3.2
リソースクローザー...................................................................................................................9
リソース関数の設定例 ....................................................................................................................10
4.1
確保したリソースを戻り値として返す場合 .............................................................................10
4.1.1
サンプルコード.................................................................................................................10
4.1.2
設定例 ...............................................................................................................................11
4.1.3
リソースアロケーター ......................................................................................................11
4.1.4
リソースクローザー..........................................................................................................11
4.2
確保したリソースを引数に割り当てる場合 .............................................................................12
4.2.1
サンプルコード.................................................................................................................12
4.2.2
設定例 ...............................................................................................................................13
4.2.3
リソースアロケーター ......................................................................................................13
4.2.4
リソースクローザー..........................................................................................................14
4.3
関数が呼び出されたオブジェクトにリソースを確保する場合.................................................15
4.3.1
サンプルコード.................................................................................................................15
4.3.2
設定例 ...............................................................................................................................16
4.3.3
リソースアロケーター ......................................................................................................16
4.3.4
リソースクローザー..........................................................................................................17
2 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
改 版 履 歴
日付
2010/07/14
版
1.0
説明
新規作成
--以上--
3 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
1 はじめに
本書は、C++test7.3 のバグ探偵の 【BD-RES-LEAK: リソースが解放されていることを確認する】のルー
ルをカスタマイズする方法について記述した資料です。
4 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
2 リソースリークのルールのカスタマイズ方法
【BD-RES-LEAKS : リソースが解放されていることを確認する】
2.1 リソースリークのカスタマイズ
カスタマイズを行なうには、ビルトインのテストコンフィギュレーションを複製し、複製したユーザー定義のテスト
コンフィギュレーションをカスタマイズします。
2.1.1
テストコンフィギュレーションの複製
1.
メニューより[C++test]>[テストコンフィギュレーション]を選択する
2.
テストコンフィギュレーション画面の左側のツリーより[ビルトイン]>[Static Analysis]>[BugDetective
(License Required)]を選択し、右クリックしコンテキストメニューから[複製]を選択する
3.
[ユーザー定義]のカテゴリに[BugDetective (License Required)]が作成される
5 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
2.1.2
リソースのタイプの追加
1.
メニューより[C++test]>[テストコンフィギュレーション]を選択する
2.
複製したテストコンフィギュレーションを選択する
3.
[静的]>[バグ探偵オプション]>[リソース]タブを選択する
4.
[追加]ボタンでリソースのタイプを追加する
5.
追加した行を選択し、[リソースのタイプ]を入力する
6.
[編集]ボタンを選択し、リソース関数を登録する(*)
7. 追加したリソースのタイプを有効に設定し、バグ探偵を実行する
* リソース関数の登録方法については、[3.リソース関数の設定項目]を参照
6 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
2.1.3
ルールパラメーターの変更
1.
ルールを選択し、右クリックしコンテキストメニューから[ルールパラメーターの表示/変更]を選択する
2.
ルールパラメーター画面が表示される
9
[サードパーティのメソッドがリソース参照を格納する可能性があると仮定する]
¾
この設定が有効な場合
—
バグ探偵は任意のサードパーティ関数にリソースが渡された場合、関数がリソースへの参照を
格納する可能性があると仮定します。このように設定すると、格納された参照を使用して後でリ
ソースがクローズされている場合に、違反が誤検出されるのを防ぎますが、実際のリークが違反
として検出されない場合もあります。デフォルトではこの設定は有効です。
¾
この設定が無効な場合
—
バグ探偵は、より積極的なアプローチをとりサードパーティの関数がリソースには影響しないと
仮定します。このアプローチでは誤検出の可能性がありますが、設定を有効にした場合のチェッ
クでは、見逃される可能性のある実際のリークを検出することができます。
7 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
3 リソース関数の設定項目
3.1 リソースアロケーター
項目
詳細
有効
解析の対象にする場合は、チェックをオンにする
解析の対象から外す場合は、チェックをオフにする
完全修飾名または
[リソースアロケーター]で定義した関数の名前空間やクラス名を指定する
名前空間(ワイルドカード)
指定がない場合、グローバル関数とみなす
関数名(ワイルドカード)
リソースを確保する関数名を指定する
サブクラスの定義
派生クラスの関数もリソースを確保する場合は、チェックをオンにする
派生クラスの関数がリソースを確保しない場合は、チェックをオフにする
this オブジェクトがリソース
関数が呼び出されたオブジェクトにリソースを確保する場合は、チェックを
オンにする(*1)
リソースオブジェクトを返す
確保したリソースを戻り値として返す場合、チェックをオンに設定する(*2)
リソースを表すパラメーターの
確保したリソースを引数に割り当てる場合、その引数の番号を設定する
数(1 から開始)
(*3)
* 1 [4.3 関数が呼び出されたオブジェクトにリソースを確保する場合]を参照
* 2 [4.1 確保したリソースを戻り値として返す場合]を参照
* 3 [4.2 確保したリソースを引数に割り当てる場合]を参照
8 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
3.2 リソースクローザー
項目
詳細
有効
解析の対象にする場合は、チェックをオンにする
解析の対象から外す場合は、チェックをオフにする
完全修飾名または
[リソースクローザー]で定義した関数の名前空間やクラス名を指定する
名前空間(ワイルドカード)
指定がない場合、グローバル関数とみなす
関数名(ワイルドカード)
リソースを解放する関数名を指定する
サブクラスの定義
派生クラスの関数もリソースを解放する場合は、チェックをオンにする
派生クラスの関数がリソースを解放しない場合は、チェックをオフにする
this オブジェクトがリソース
関数が呼び出されたオブジェクトのリソースを解放する場合は、チェックを
オンにする
リソースを表すパラメーターの
解放したリソースを引数に指定する場合、その引数の番号を設定する
数(1 から開始)
9 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
4 リソース関数の設定例
4.1 確保したリソースを戻り値として返す場合
4.1.1
サンプルコード
int* int_Allocate(int size)
{
if ( size == 0 ){
return 0;
}
int *buffer ;
buffer = (int*)malloc(size);
return buffer;
}
void int_Free(int* p)
{
free(p);
}
// 呼び出し例
void fun()
{
int *p;
p = int_Allocate(sizeof(int));
}
10 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
4.1.2
設定例
4.1.3
リソースアロケーター
項目
設定例
有効
○
完全修飾名または名前空間(ワイルドカード)
--
関数名(ワイルドカード)
int_Allocate
サブクラスの定義
--
this オブジェクトがリソース
--
リソースオブジェクトを返す
○
リソースを表すパラメーターの数(1 から開始)
--
* チェックが ON の場合は、「○」
* 入力の必要がない場合、チェックが OFF の場合は、「--」
4.1.4
リソースクローザー
項目
詳細
有効
○
完全修飾名または名前空間(ワイルドカード)
--
関数名(ワイルドカード)
int_Free
サブクラスの定義
--
this オブジェクトがリソース
--
リソースを表すパラメーターの数(1 から開始)
1
11 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
4.2 確保したリソースを引数に割り当てる場合
4.2.1
サンプルコード
// 第1引数pにリソースを割り当てる
void int_Allocate1(int *p, int size)
{
p = (int *)malloc(sizeof(size));
}
// 第2引数pにリソースを割り当てる
void int_Allocate2(int size, int *p)
{
p = (int *)malloc(sizeof(size));
}
// int_Free
void int_Free(int* p)
{
free(p);
}
// 呼び出し例
void fun()
{
int *p;
int_Allocate1(p, sizeof(int));
}
12 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
4.2.2
設定例
4.2.3
リソースアロケーター
項目
設定例
有効
○
完全修飾名または名前空間(ワイルドカード)
--
関数名(ワイルドカード)
int_Allocate1
サブクラスの定義
--
this オブジェクトがリソース
--
リソースオブジェクトを返す
--
リソースを表すパラメーターの数(1 から開始)
1
* チェックが ON の場合は、「○」
* 入力の必要がない場合、チェックが OFF の場合は、「--」
13 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
4.2.4
リソースクローザー
項目
詳細
有効
○
完全修飾名または名前空間(ワイルドカード)
--
関数名(ワイルドカード)
int_Free
サブクラスの定義
--
this オブジェクトがリソース
--
リソースを表すパラメーターの数(1 から開始)
1
■ int_Allocate2 の設定例
14 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
4.3
関数が呼び出されたオブジェクトにリソースを確保する場合
4.3.1
サンプルコード
class CustomSample
{
public:
CustomSample();
virtual ~CustomSample();
void int_Allocate()
{
p = new int;
}
void int_Free()
{
delete p;
}
private:
int *p;
};
// 呼び出し例
void fun()
{
CustomSample u;
u.int_Allocate();
}
15 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
4.3.2
設定例
4.3.3
リソースアロケーター
項目
設定例
有効
○
完全修飾名または名前空間(ワイルドカード)
CustomSample
関数名(ワイルドカード)
int_Allocate
サブクラスの定義
--
this オブジェクトがリソース
○
リソースオブジェクトを返す
--
リソースを表すパラメーターの数(1 から開始)
--
* チェックが ON の場合は、「○」
* 入力の必要がない場合、チェックが OFF の場合は、「--」
16 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved
C++test7.3 バグ探偵
リソースリークのカスタマイズについて
4.3.4
リソースクローザー
項目
詳細
有効
○
完全修飾名または名前空間(ワイルドカード)
CustomSample
関数名(ワイルドカード)
int_Free
サブクラスの定義
--
this オブジェクトがリソース
○
リソースを表すパラメーターの数(1 から開始)
--
以上
17 / 17
Copyright © 2010 Techmatrix Corporation. All rights reserved