Loading
0

自动化测试工具Parasoft如何发现资源泄露问题

在使用Parasoft C/C++test执行BugDetective数据流分析时,可能会遇到用户自定义的资源API,那在这种情况下,若要判断是否存在资源问题,如资源泄露等,则需要手动配置测试配置。

>>点击获取Parasoft C/C++test试用

1、打开测试配置对话框

在打开的C++test窗口中,点击菜单“Parasoft”->“测试配置”

2、复制BD测试配置

右键“内建”-》“BugDetective Fast”,选择“拷贝”到“用户自定义”

3、修改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

在成功配置了Parasoft C/C++test以识别自定义资源API后。无论是直接返回资源的分配函数,还是通过参数传递资源句柄的复杂场景,正确配置后BugDetective都能准确发现潜在的资源泄露问题。Parasoft还提供强大的静态编码规范检查、单元测试与覆盖率分析等功能,全面帮助客户在开发早期发现代码缺陷、强制执行编码标准并验证代码逻辑,从而系统性地提升软件质量、可靠性与安全性,降低项目风险并满足严格的行业合规要求。

关于慧都

慧都是一家行业数字化解决方案公司,专注于软件、石油与工业领域,以深入的业务理解和行业经验,帮助企业实现智能化转型与持续竞争优势。在软件工程领域,我们提供开发控件、研发管理、代码开发、部署运维等软件开发全链路所需的产品,提供正版授权采购、技术选型、个性化维保等服务,帮助客户实现技术合规、降本增效与风险可控。

慧都科技作为Parasoft公司在中国区的官方授权合作伙伴,为国内企业提供Parasoft C/C++test产品的正版授权、定制化部署与全生命周期技术支持与服务。我们致力于助力客户精准贯彻功能安全标准、全面提升软件开发效率、有效管控项目风险,最终构建符合国际标准的高质量软件体系。