Parasoft C/C++test针对C/C++开发的专业白盒自动化测试方案,能有效提高软件开发效率和代码质量。C++test 可以进行静态分析,全面代码审查,运行时错误检测,并在单元测试和组件测试中集成覆盖率分析。
配置流分析深度
Flow Analysis 通过分析的代码构建路径以检测不同类型的问题。由于对跨越整个应用程序的所有可能路径的分析可能不可行,因此您可以设置所需的分析深度级别。更深入的分析会得到更多的发现,但性能会变慢,内存消耗会略有增加。
可以使用 DTP 中的测试配置界面指定分析深度。转至 报告中心> 测试配置> 静态分析> 流分析高级设置> 性能> 分析深度, 然后通过选择单选按钮选择以下选项之一:
-
Shallowest(最快):只查找源代码中最明显的问题。它仅限于问题的原因位于靠近出现问题的代码的情况。此类分析发现的违规执行路径通常跨越单个函数中的多行代码。它们很少会跨越 3 个以上的函数调用。
-
Shallow(快速):和“Shallowest”分析类型一样,只查找源代码中最明显的问题。但是,它会产生更多的结果,并允许检查更长的执行路径。
-
标准:查找包含数十个元素的执行路径的许多复杂问题。标准分析超越了浅层分析,还寻找更复杂的问题,这些问题可能是由于单个功能中的流程不畅或由于所分析项目的不同部分中不同功能之间的交互不当而导致的。此类分析发现的违规行为通常会揭示所分析源代码中的重大错误,并且通常跨越数十行代码。
-
深度(慢):允许检测更多与“标准”深度定义的问题具有相同复杂性和性质的问题。这种类型的分析比标准分析慢。
-
彻底(最慢):发现更复杂的问题。这种类型的分析将对代码库进行彻底扫描;这需要更多时间,但会发现许多非常复杂的问题,这些问题的违规路径可能跨越扫描应用程序不同部分的一百多行代码。建议在夜间运行时使用此选项。
Flow Analysis 的深度 默认设置为 标准。
设置超时策略
除了分析深度之外,Flow Analysis 还使用额外的超时保护来确保分析在合理的时间内完成。使用 DTP 中的测试配置界面可以设置适当的策略。转至 报告中心> 测试配置> 静态分析> 流分析高级设置> 性能> 超时策略, 然后通过选择单选按钮选择以下选项之一:
-
time:在给定的热点上花费定义的时间后停止分析。注意:在某些情况下,使用此选项可能会导致报告的违规数量略微不稳定。
-
instructions:执行定义数量的 Flow Analysis 指令后,将停止对给定热点的分析。注意:要确定要为您的环境设置的正确指令数量,请在生成的报告的“设置问题”部分查看有关超时的信息。
-
off:没有超时。注意:使用此选项可能需要更多的时间来完成分析。
默认超时选项的 时间 设置为 60 秒。
在增量模式下运行流量分析
默认情况下,Flow Analysis 会对其运行的范围执行完整的分析。在大型代码库上运行时,这可能需要相当长的时间。
执行 Flow Analysis 分析的最常见方法是在每天都略有变化的单个代码库上运行夜间测试。Flow Analysis 的增量分析模式旨在减少在这种典型场景中运行分析所需的时间。在增量分析模式下,Analysis 会在初始运行期间记住重要的分析数据,然后在后续运行中重新使用它——仅对已修改或与修改代码紧密相关的代码部分重新运行分析。
需要磁盘空间来存储必要的数据。增量分析选项控制增量分析功能。可用选项有:
-
启用增量分析:确定是否使用增量分析。
-
每隔 [天] 压缩增量缓存:确定运行增量缓存压缩的频率。增量分析针对速度进行了优化;尽管 Flow Analysis 力求始终保持较小的缓存大小并删除不必要的数据,但源代码更改可能会导致这些缓存包含一些不再使用的数据。按照此参数的定义定期运行的压缩会删除所有过时的数据。更准确地说,如果自上次压缩以来经过的时间大于为此选项指定的天数,则在 Flow Analysis 增量运行后立即执行压缩。
在启用分析数据交换的情况下运行流分析
在这种模式下,分析数据被写入磁盘。分析数据的交换使用相同的持久存储,并在与增量分析类似的过程中完成。如果在大型项目上运行分析,则表示所分析源代码的语义模型的分析数据可能会消耗可用于运行 Flow Analysis 的所有内存。如果发生这种情况,Flow Analysis 将从内存中删除当前不需要的分析数据部分,并稍后从磁盘中重新读取。
通常,我们建议在配置了 Xmx JVM 选项的大型 JVM 堆中运行 C/C++ 测试。这是为了最大限度地减少交换,从而提高性能。如果有足够的可用内存,则可以禁用分析数据的交换,这可以加快代码分析。
您可以使用 DTP 中的测试配置界面启用或禁用该模式:
启用将分析数据交换到磁盘:默认情况下启用。如果禁用此选项,则可能会加快分析速度,如果您正在对不需要大量内存的中小型项目运行 Flow Analysis 分析,或者有足够的内存可用(例如,对于 64 位系统) )。
配置流分析的详细程度
您可以使用 DTP 中的测试配置界面来配置以下选项:
-
无法显示原因时不报告违规:确定 Flow Analysis 是否报告无法显示原因的违规。
某些 Flow Analysis 规则要求 Flow Analysis 检查通向某个点的所有可能路径,并验证所有这些路径是否满足某个条件。在这种情况下,违规与一组路径相关联(而在简单情况下,违规仅由一条路径表示)。这种违例中的所有路径都以违例中所有路径共有的违例点结束。但是,不同的路径可能从代码中的不同点开始。每条路径的开头是一个违规原因(代码中的一个点,它规定了在违规点的代码中后面的某个条件的违规)。如果多路径违规的不同路径有不同的原因,Flow Analysis 将仅显示违规点(而不是违规原因)。
仅包含违规点的违规可能难以理解(与 Flow Analysis 显示从违规原因开始并导致违规点的完整路径的常规情况相比)。这就是为什么我们提供了一个选项来隐藏无法显示原因的违规行为。
-
每个点不显示多个违规: 限制每个违规点报告一次违规(针对单个规则)。例如,当 Flow Analysis 检测到具有多个空值来源的潜在空取消引用时,将报告一次违规。当详细程度设置为该级别时,Flow Analysis 性能会稍快一些。
指定终止函数
您可以定义终止应用程序执行的函数。C/C++ 开发人员有时会使用在发生无法恢复的致命错误时终止应用程序执行的函数。这些功能的示例是abort()与exit()从标准库。由于 Flow Analysis 分析应用程序的执行流程,因此了解通过立即停止应用程序而中断执行流程的终止函数很重要。如果没有这些知识,Flow Analysis 可能会对应用程序流程做出错误的假设。
Flow Analysis 知道标准库中定义的终止函数。然而,这通常是不够的,因为非标准库定义了它们自己的终止函数。如果您的应用程序使用这些函数之一,您应该通过在 Terminators 选项卡中指定自定义终止函数将其传达给 Flow Analysis。否则,Flow Analysis 可能会在执行路径通过终止函数时产生误报。
使用列出支持的 API 的表格来启用/禁用来自各种 API 的终止符,以及定义您自己的包含终止函数的 API。要从某个库中添加有关终止函数的信息:
-
单击表格顶行中的+按钮。
-
单击箭头以展开终止应用程序执行的功能选项卡。
-
完成打开的表格;该表包含以下列:
• 已启用:指定在分析过程中是否应考虑内置或自定义终止符。
•完全限定的类型名称或命名空间(通配符):指定特定终止符的实体。如果此字段留空,则只有在“函数名称”列中指定名称的全局函数才会被视为终止符。例如: 如果终止符是在来自 'myNameSpace' 命名空间的 'myClass' 中声明的,则字段值可能是“myNameSpace::myClass”。或者,如果它未在类型中声明,而仅属于“myNameSpace”,则它可能是“myNameSpace”。
•函数名称(通配符):指定终止函数的名称。
:指示子类中的终止函数定义是否也应视为终止函数。这适用于实例函数和非实例函数,并且只有在指定了它的完全限定类型名称时才有意义。
指定多线程选项
的多线程标签允许你以及以激活线程之间限定用于同步的功能/停用已知多线程功能。此处定义的信息会影响来自 BD.TRS(线程和同步)类别的规则的行为。这些规则将检查在此选项卡上定义和激活的所有功能。
使用列出支持的 API 的表来启用/禁用来自各种 API 的同步功能,以及定义您自己的包含同步功能的 API。要从某个库中添加有关同步函数的信息:
-
单击表格顶行中的 + 按钮。
-
在 API 字段中输入库的名称。
-
单击箭头展开选项卡并完成表格以定义以下类型的功能(下面提供了有关完成表格的详细信息):
• 锁定功能(例如,获取互斥锁)
• 解锁功能(例如,释放互斥锁)
• 睡眠功能
• 销毁锁定功能
锁定功能
使用以下信息完成表格:
-
已启用:指定在分析过程中是否应考虑锁定功能。
-
完全限定的类型名称或命名空间(通配符):声明函数的类型或命名空间的完全限定名称。如果要描述在任何类型或命名空间中声明的函数,或者在任何类型之外声明的全局函数,请使用“*”。
-
函数名称(通配符):锁定函数的名称。'*' 可用于表示任意数量的任意符号。
-
+ 子类中的定义:一个复选框,指示子类中的定义(具有给定名称的函数)是否也应视为锁定函数。请注意,这适用于实例函数和静态函数。
-
“this”对象是一个互斥体:一个复选框,表示该函数在调用该函数的对象中锁定了一个互斥体。
-
返回一个互斥体:一个复选框,指示该函数返回一个互斥体。
-
错误时的返回值约束:如果资源分配器返回整数值,则指定分配失败时的返回值约束。按以下格式输入条件:<比较运算符><整数值>。例如,如果函数在失败时返回非零值,请在字段中输入“!=0”(不带引号)。如果错误返回码为 -1,请在此处输入“==-1”。除了“!=”和“==”,您还可以使用以下运算符来指定错误条件:“>”、“>=”、“<”和“<=”。
-
互斥量参数:指定函数在其参数之一中锁定互斥量。
解锁功能
使用以下信息完成表格:
-
Enabled:指定在分析时是否应考虑解锁功能。
-
完全限定的类型名称或命名空间(通配符):声明函数的类型或命名空间的完全限定名称。如果要描述在任何类型或命名空间中声明的函数,或者在任何类型之外声明的全局函数,请使用“*”。
-
函数名(通配符):解锁函数的名称。'*' 可用于表示任意数量的任意符号。
-
+ 子类中的定义:一个复选框,指示子类中的定义(具有给定名称的函数)是否也应视为解锁函数。请注意,这适用于实例函数和静态函数。
-
“this”对象是一个互斥锁:一个复选框,指示调用该函数的对象中的互斥锁已解锁
-
互斥量参数:指定参数之一中的互斥量被解锁。
睡眠功能
使用以下信息完成表格:
-
Enabled : 指定在分析过程中是否应考虑睡眠功能。
-
完全限定的类型名称或命名空间(通配符):声明函数的类型或命名空间的完全限定名称。如果要描述在任何类型或命名空间中声明的函数,或者在任何类型之外声明的全局函数,请使用“*”。
-
函数名称(通配符):睡眠函数的名称。'*' 可用于表示任意数量的任意符号。
-
+ 子类中的定义:一个复选框,指示子类中的定义(具有给定名称的函数)是否也应视为睡眠函数。请注意,这适用于实例函数和静态函数。
破坏锁功能
使用以下信息完成表格:
-
Enabled:指定在分析过程中是否应考虑锁破坏功能。
-
完全限定的类型名称或命名空间(通配符):声明函数的类型或命名空间的完全限定名称。如果要描述在任何类型或命名空间中声明的函数,或者在任何类型之外声明的全局函数,请使用“*”。
-
函数名称(通配符):锁破坏函数的名称。'*' 可用于表示任意数量的任意符号。
-
+ 子类中的定义:一个复选框,指示子类中的定义(具有给定名称的函数)是否也应视为破坏锁的函数。请注意,这适用于实例函数和静态函数。
-
“this”对象是一个互斥锁:一个复选框,指示调用该函数的对象中的互斥锁已被销毁。
-
互斥量参数:指定参数之一中的互斥量被销毁。
指定资源
在 资源 选项卡允许您定义BD.RES类(资源)规则应该检查哪些资源。这些规则检查在此选项卡上定义和启用的所有资源的正确使用。
-
指定资源类型。
-
选中启用复选框。
-
如果合适/需要,禁用终止时不报告泄漏选项。
-
单击箭头展开Resource Allocators、Resource Closers、Resource checkers和Safe functions选项卡并完成打开的表格,其中包含有关分配器、关闭器、检查器和安全功能的信息。下面提供了有关完成这些选项卡的详细信息。
配置资源分配器
该资源分配器表可以用能够产生资源的功能描述中完成。该表包含以下列:
-
已启用:指定在分析期间是否应考虑分配器。
-
完全限定的类型名称或命名空间(通配符):声明函数的类型或命名空间的完全限定名称。如果要描述在任何类型或命名空间中声明的函数,或者在任何类型之外声明的全局函数,请使用“*”。
-
函数名称(通配符):分配函数的名称。'*' 可用于表示任意数量的任意符号。
-
资源参数:指定函数在其一个或多个参数中分配资源。在这种情况下,要么指定函数分配的参数的从 1 开始的编号,要么使用“*”表示所有参数都已分配。
-
+ 子类中的定义:一个复选框,指示子类中的定义(具有给定名称的函数)是否也应视为分配器。请注意,这适用于实例函数和静态函数。
-
“this”对象是一个资源:一个复选框,指示该函数在调用该函数的对象中分配资源。
-
返回资源对象:一个复选框,指示该函数返回已分配的资源。
-
错误时的返回值约束:如果资源分配器返回整数值,则指定在分配失败的情况下的返回值约束。按以下格式输入条件:<比较运算符><整数值>。例如,如果函数在失败时返回非零值,请在字段中输入“!=0”(不带引号)。如果错误返回码为 -1,请在此处输入“==-1”。除了“!=”和“==”,您还可以使用以下运算符来指定错误条件:“>”、“>=”、“<”和“<=”。
分配函数返回错误代码以指示分配失败是很常见的。当分配函数返回指向资源的指针时,NULL 指针通常表示分配失败。Flow Analysis 在寻找资源泄漏时,需要了解分配是成功还是失败;这有助于它仅报告在实际发生分配的路径上丢失的对释放函数的调用。在资源分配器函数返回指向资源的指针的情况下,如果指针不为 NULL,则 Flow Analysis 假定资源已成功分配。
配置资源关闭器
该资源成交表可以与功能的描述,可以关闭资源完成。该表包含以下列:
-
已启用:指定在分析期间是否应考虑关闭器。
-
完全限定的类型名称或命名空间(通配符):声明函数的类型或命名空间的完全限定名称。如果要描述在任何类型或命名空间中声明的函数,或者在任何类型之外声明的全局函数,请使用“*”。
-
函数名称(通配符):关闭函数的名称。'*' 可用于表示任意数量的任意符号。
-
+ 子类中的定义:一个复选框,指示子类中的定义(具有给定名称的函数)是否也应被视为更接近。请注意,这适用于实例函数和静态函数。
-
“this”对象是一个资源:一个复选框,指示调用该函数的对象中的资源已关闭。
-
资源参数:指定一个资源在它的一个或多个参数中是关闭的。在这种情况下,要么指定由函数关闭的参数的从 1 开始的编号,要么使用“*”表示所有参数都已分配。
配置资源检查器
该资源跳棋表可以与功能的描述,可以检查资源是开放的完成。该表包含以下列:
-
已启用:指定在分析期间是否应考虑检查器。
-
完全限定的类型名称或命名空间(通配符):声明函数的类型或命名空间的完全限定名称。如果要描述在任何类型或命名空间中声明的函数,或者在任何类型之外声明的全局函数,请使用“*”。
-
函数名称(通配符):检查函数的名称。'*' 可用于表示任意数量的任意符号。
-
+ 子类中的定义:一个复选框,指示子类中的定义(具有给定名称的函数)是否也应视为检查器。请注意,这适用于实例函数和静态函数。
-
'this' 对象是一个资源:一个复选框,指示该函数检查调用该函数的对象中的资源。
-
资源参数:指定函数在其一个或多个参数中检查资源。在这种情况下,要么指定函数检查的参数的从 1 开始的数字,要么使用“*”表示检查所有参数。
-
资源打开时返回值:指定资源打开时检查函数的返回值。可接受的值为true或false。
配置安全功能
该安全功能表可以用的,可以安全地调用在一个封闭的资源功能的描述完成-不触发BD-RES-FREE规则。该表包含以下列:
-
已启用:指定在分析过程中是否应考虑安全功能。
-
完全限定的类型名称或命名空间(通配符):声明函数的类型或命名空间的完全限定名称。如果要描述在任何类型或命名空间中声明的函数,或者在任何类型之外声明的全局函数,请使用“*”。
-
函数名称(通配符):安全函数的名称。'*' 可用于表示任意数量的任意符号。
-
+ 子类中的定义:一个复选框,指示子类中的定义(具有给定名称的函数)是否也应该被认为是安全的。请注意,这适用于实例函数和静态函数。
扩展分析范围
在执行代码分析时,Flow Analysis 会处理在被测源文件和头文件中定义的函数定义。在测试范围之外的头文件中定义的函数不会被分析,并且 Flow Analysis 不知道它们的语义。如果 Flow Analysis 需要有关在测试范围之外的头文件中定义的函数定义的信息,您可以配置以下选项:
要分析的外部文件:指定要由 Flow Analysis 分析的其他头文件的绝对路径。使用通配符指定模式。
要分析的外部函数:指定要由 Flow Analysis 分析的附加函数。使用以下信息完成表格:
-
已启用:指定在分析期间是否应考虑该功能
-
完全限定的类型名称或命名空间(通配符):声明函数的类型或命名空间的完全限定名称。如果要描述在任何类型或命名空间中声明的函数,或者在任何类型之外声明的全局函数,请使用“*”。
-
函数名(通配符):函数名。'*' 可用于表示任意数量的任意符号。
-
数参数:指定的函数的参数个数。“-1”可用于表示任意数量的参数。
-
+ 子类中的定义:一个复选框,指示是否还应包括子类中的定义(具有给定名称的函数)。请注意,这适用于实例函数和静态函数。
指定始终被分析的函数
将始终分析功能选项允许您定义的执行路径上遇到的时候,将永远被分析的功能。这有助于您确保规则将分析检查给定路径时通常不会输入的函数。
选择启用复选框并提供以下信息:
-
完全限定的类型名称或命名空间(通配符):包含函数的类型或命名空间的完全限定名称。
-
函数名(通配符):函数名。
-
+ 子类中的定义:指示是否也应在子类中考虑该函数。
特定于编译器的设置
“ errno ”值的内部表示:Standarddefineserno 是 int 类型的可修改左值。未指定 errno 是宏还是使用外部链接声明的标识符。实现可以使用全局变量“errno”或“__errno”,或应用具有不同名称的被调用函数的“(*errno_function())”模式。此选项允许您使用正则表达式指定这些变量和函数的名称:
-
函数名称模式:使用“errno”值时调用的函数名称。必须使用正则表达式指定名称。
-
变量名模式:使用“errno”值时调用的变量名。必须使用正则表达式指定名称。
从头文件 <ctype.h> 调用函数的内部表示:标准指定了要在头文件 <ctype.h> 中定义的几个函数。一些实现(例如 C 模式下的 GNU GCC)将这些函数定义为宏,这些宏扩展到代码,该代码根据某些标志测试内部数组的元素。这可以是全局数组或函数返回的指针。此选项允许您使用正则表达式指定这些变量和函数的名称:
-
函数名称模式:内部调用的函数的名称,而不是头文件 <ctype.h> 中的函数之一(使用正则表达式定义)。必须使用正则表达式指定名称。
-
变量名称模式:在从头文件 <ctype.h> 调用其中一个函数后在内部使用的变量名称。必须使用正则表达式指定名称。
重用流动分析数据进行桌面分析
使用 Flow Analysis 提高桌面性能的一种方法是重用桌面上的服务器分析数据。为此,您需要定义一个映射,以允许 Flow Analysis 将服务器文件路径与相应的桌面文件路径相匹配。
此外,您可以重用数据以在小范围(例如,一个文件)上运行分析,并构建包含在定义的分析范围之外的文件中定义的方法的路径,前提是这些文件已经过分析。
Parasoft——领先的自动化测试工具,满足绝大多数行业标准
Parasoft是一家专门提供软件测试解决方案的公司,帮助企业打造无缺陷的软件。
从开发到质量检查,Parasoft的技术通过集成静态和运行时分析,单元、功能和API测试,以及服务虚拟化,在不牺牲质量和安全性的情况下加快软件交付,节约交付成本。
强大的报告和分析功能可帮助用户快速查明有风险的代码区域,并了解新代码更改如何影响其软件质量,而突破性的技术将人工智能和机器学习添加到软件测试中,使组织更容易采用和扩展跨开发和测试团队的有效的软件测试实践。
Parasoft针对C/C++、Java、.NET和嵌入式的开发测试都有着30多年的深入研究,很多全国500强企业使用Parasoft的产品实现了软件快速、高质量的交付。
标签:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn