引言 #
在使用C++test执行BugDetective数据流分析时,可能会遇到用户自定义的资源API,那在这种情况下,若要判断是否存在资源问题,如资源泄露等,则需要手动配置测试配置。本文主要强调的内容即是如何自定义BD测试配置,如何实现检测这类资源问题。
C++test中操作 #
- 打开测试配置对话框
在打开的C++test窗口中,点击菜单“Parasoft”-> “测试配置” - 复制BD测试配置
右键“内建”-》“BugDetective Fast”,选择“拷贝”到“用户自定义” - 修改BD的资源选项卡
示例1 #
下面的代码即为用户自定义的资源API:
void myAlloc(void) ---- 申请内存函数
void myDealloc(void) ---- 释放函数
/ returns NULL on allocation failure /
void myAlloc(void);
void myDealloc(void);
static void createMyResource_Leak()
{
void resource = myAlloc();
} / 'res' is not closed on the path where it is not NULL /
static void createMyResource_NoLeak()
{
void resource = myAlloc();
if (!resource) {
return; / no leak here, if res is NULL, it means allocation failed /
}
/ use the resource /
myDealloc(resource);
}
我们希望定义分配 / 关闭资源的方法,因此 BugDetective 可以用来找到这个非标准资源的泄露。要做到这一点, 我们需要执行以下步骤:
1). 在资源选项卡中, 单击 添加 (Add) 并定义新资源的名称。 此名称将会用于报告与此资源相关的违规。
2). 禁用 Do not report violations at application termination 选项。
3). 单击 编辑 (Edit) 来指定此资源是如何操作的。
4). 如下所示定义 myAlloc 为一个分配器:
• 完全修饰的类型名称或命名空间 : 空
• 函数名称 : myAlloc
•+ 子类中的定义 : 不勾选
• “此” 对象是一个资源 : 不勾选
• 返回一个资源对象 : 勾选
• 返回值错误的约束 : 空
• 参数是资源对象的序号 : 空
5). 如下所示指定关闭器:
• 完全修饰的类型名称或命名空间 : 空
• 函数名称 : myDealloc
•+ 子类中的定义 : 不勾选
• “此” 对象是一个资源 : 不勾选
• 参数是资源对象的序号 : 1
示例2 #
现在让我们考虑一个不同的例子。在这里,资源开放函数接收一个指向资源句柄的指针作为一个参数并初始化该句柄最新分配的资源。如果分配失败,返回错误代码为 -1。
int openMyResource(int* pHandle);
void closeMyResource(int handle);
static void openMyResource_Leak()
{
int handle;
openMyResource(&handle);
} // 'res' is not closed
static void openMyResource_NoLeak()
{
int handle;
int status = openMyResource(&handle);
if (status == -1) {
return; // no leak here, status == -1 indicates allocation failure
}
// use the resource
closeMyResource(handle);
}
现在让我我执行以下操作在 BugDetective 中添加支持这种资源类型 :
1). 在"资源"选项卡,单击 添加(Add) 并定义新资源的名称。 此名称将用于报告与此资源相关的违规。
2). 禁用 Do not report violations at application termination 选项。
3). 单击 编辑 (Edit) 来指定如何操纵这种资源。
4). 如下所示定义 openMyResource 为一个分配器 :
• 完全修饰的类型名称或命名空间 : 空
• 函数名称 : openMyResource
•+ 子类中的定义 : 不勾选
• “此” 对象是一个资源 : 不勾选
• 返回一个资源对象 : 不勾选
• 返回值约束错误 : ==-1
• 参数是资源对象的序号 : 1
5). 如下所示指定一个关闭器 :
• 完全修饰的类型名称或命名空间 : 空
• 函数名称 : closeMyResource
•+ 子类中的定义 : 不勾选
• “此” 对象是一个资源 : 不勾选
• 参数是资源对象的序号 : 1
图1 添加用户自定义资源类型
图2 添加用户自定义资源API
运行该测试配置检查结果 #
参考:
示例项目参见“BD_Resource.zip”
示例测试配置参见“BugDetective Fast For BD_Res.properties”