CAST AIP提供扩展默认情况下标准测量集的可能性。可以使用名为XXXCastMetrics.xml的XML文件定义“开箱即用”配置的这个插件。对于要在其上定义自定义测量标准的每种技术,必须创建一个对应的文件。
自定义指标可以为:
- 标准CAST支持技术
- 自定义技术通过CAST通用分析器配置(参见使用CAST 通用分析器框架创建或修改自定义插件)
自定义度量是基于grep的度量,使用正则表达式生成所需的数据。不是基于技术的语法——如果存在。
请注意:
- 存储在CAST安装文件夹中的旧版CastMetrics.xml文件在分析/快照生成期间不再使用。如果以前已经自定义这个文件,那么内容必须被移动到一个或多个XXXCastMetrics.xml文件中。强烈建议为每种自定义语言提供一个文件,或者为标准语言提供一个自定义指标文件。
- 不需要在CAST服务管理器中使用来自硬盘的Load元模型选项——只要在运行分析/生成快照时出现XXXCastMetrics.xml文件,那么就会生效。
文件命名约定
XML文件名称中的XXX表示,只要文件名的末尾保留CastMetrics.xml,可以自由选择如何命名文件。CAST建议使用技术名称作为CastMetrics.xml的前缀,但这不是必需的。此外不限于三个字符。例如可以使用一个名为CASTXSLCastMetrics.xml的文件。
确保考虑到XXXCastMetrics.xml文件
步骤 1——文件位置
必须手动将XXXCastMetrics.xml文件复制到以下位置,以便在分析过程中生效:
%PROGRAMDATA%\CAST\CAST\<version>\Configuration\Languages\<technology folder name>\XXXCastMetrics.xml
插件自定义UA语言包分析的技术指标时
- 当插件由自定义UA语言包分析的技术指标时,<technology folder name>文件夹将已经存在。它与用于存储语言包中使用的XXXMetaModel.xml文件和XXXLanguagePattern.xml文件的文件夹相同。
- 此外该文件夹中可能已经存在XXXCastMetrics.xml文件——如果是这种情况,CAST建议创建一个附加的XXXCastMetrics.xml文件来配置自定义的指标,以避免修改为语言包配置的XXXCastMetrics.xml文件。以这个PHP语言包为例——已经有一个PHPCastMetrics.xml文件,并且为自定义的度量标准创建了一个附加的PHPCustomCastMetrics.xml文件:
当插件由标准CAST AIP分析器分析的技术指标时
- 当为Cobol、VB或标准CAST AIP分析器支持的其它技术扩展指标时,需要创建<technology folder name>文件夹。可以通过使用与AIP中相同的文件夹名称找到要使用的名称——跳转到以下位置,查看核心AIP技术名称列表:
<CAST_AIP_installation_folder>\Configuration\Languages\
- 以扩展Cobol技术为例——CobolCastMetrics.xml文件应该位于一个名为Cobol的文件夹中:
步骤2——使用CAST 服务管理器安装<all users dir>插件
现在需要运行CAST Server Manager > Manage Extensions来安装<all users dir>插件。这将确保自定义的XXXCastMetrics.xml被正确安装。
在为自定义的UA语言包和核心AIP技术创建自定义度量时,必须完成此步骤。
XML 文件编码
语言包中使用的XXXCASTMetrics.xml文件必须使用UTF-8编码,如下所示:
- XML声明(文件的第一行)必须包含UTF-8编码属性:
<?xml version="1.0" encoding="utf-8" ?>
- XML文件必须以UTF-8格式保存。
结构
文件XXXCastMetrics.xml的通用结构
下面是一个示例XXXCastMetrics.xml文件:
<METRIC_LIST> <METRIC Name="<Name of the metric>" TYPE="<INF SUB TYP>"> <LANGUAGE NAME="AAA-LANGUAGE"> <!-- description of the metric --> </LANGUAGE> </METRIC> <METRIC Name="<Name of the another metric>" TYPE="<INF SUB TYP>"> <LANGUAGE NAME="AAA-LANGUAGE"> <!-- Description of the metric --> </LANGUAGE> </METRIC> </METRIC_LIST>
每个<METRIC>标记定义要创建的指标的名称和类型。类型是指标的ID,在CAST分析服务中也称为InfSubTyp。
该指标的名称和ID对于CAST分析服务中的所有指标必须唯一(有关ID的更多信息,请参见位于CAST安装文件夹中的Configuration\ metrics \Configuration\MetricsName.xml)。
希望使其可用的每种技术声明必须为每个度量。在下面的示例中,度量"Use of printf in a do/while"的ID为3000000,可用于c++。
<METRIC Name="Use of printf in a do/while" TYPE=3000000> <LANGUAGE Name="C-LANGUAGE"> <!-- Description of the metric for C/C++ --> </LANGUAGE> </METRIC>
注意用户指标的ID必须高于2000000。
语言名称
每个指标必须包含<LANGUAGE NAME>标记。例如:
<LANGUAGE NAME="C-LANGUAGE">
请使用下列其中一种:
- ASP-LANGUAGE
- ASPX-LANGUAGE
- ABAP-LANGUAGE
- ANSISQL-LANGUAGE
- ASETSQL-LANGUAGE
- BO-LANGUAGE
- C-LANGUAGE
- COBOL-LANGUAGE
- C-SHARP-LANGUAGE
- DB2-LANGUAGE
- DB2ZOS-LANGUAGE
- PROPFORMS-LANGUAGE
- FORMS-LANGUAGE
- HTML-LANGUAGE
- IMS-LANGUAGE
- JSP-LANGUAGE
- JAVA-LANGUAGE
- JCL-LANGUAGE
- JAVA-SCRIPT-LANGUAGE
- MSTSQL-LANGUAGE
- PB-LANGUAGE
- VB-LANGUAGE
- VB-SCRIPT-LANGUAGE
- VB-DOTNET-LANGUAGE
- UNIVERSAL-LANGUAGE
配置搜索模式
为了优化代码搜索,可以激活如下标签:
- 对于源代码中的搜索,使用标签:<SEARCH_IN_CODE>
- 对于注释中的搜索,使用标签 <SEARCH_IN_COMMENT>
- 对于字符串中的搜索,使用标签<SEARCH_IN_STRING>
- 对于嵌入式SQL中的搜索,使用标签<SEARCH_IN_EMBEDDEDSQL>
- 对于区分大小写的搜索,使用标签<SEARCH_CASE_SENSITIVE>
- 如果只需要匹配整个字,那么使用标记 <MATCH_WHOLE_WORD_ONLY>
搜索部分和正则表达式
有两种方法可以用来搜索代码:
- 简单搜索
- 嵌套搜索
标签<INIT>提供了模式匹配指标初始化值的可能性。例如,如果度规包含:
< INIT > 3 < / INIT >
这意味着值3将被添加到推入CAST分析服务度量的每个值中。对于不匹配的对象,不存在指标的初始化。
简单搜索
简单搜索基于一个或多个正则表达式(RegExp)。如果一个或多个正则表达式匹配,则搜索成功。
嵌套搜索
建议使用以下模式进行搜索:
BEGIN CONTENT END
示例:
... <EMBEDDED> <BEGIN> <REGEXP> RegExp for the begining of the Pattern </REGEXP> </BEGIN> <VALUE> <REGEXP> RegExp for the content of the pattern</REGEXP> </VALUE> <END> <REGEXP> RegExp for the END of the Pattern </REGEXP> </END> </EMBEDDED> ...
附加的选项
<THRESHOLD>
<THRESHOLD>选项为给定对象提供匹配数量定义阈值的可能性。如果该值低于阈值,则忽略该值。如果不是这种情况,则在CAST分析服务中为该指标设置值“1”。
例如,考虑以下指标:
... <EMBEDDED> <THRESHOLD>5</THRESHOLD> <BEGIN> <REGEXP>do</REGEXP> </BEGIN> <VALUE> <REGEXP>printf</REGEXP> </VALUE> <END> <REGEXP>while</REGEXP> </END> </EMBEDDED> ...
关于以下c++源代码:TestThreshold.cpp
void testThreshold() { printf("Out of the loop"); do { printf("Hello World!"); printf("Hello World!"); printf("Hello World!"); printf("Hello World!"); } while(true); }
度量将匹配四次(do/while中出现的每个printf匹配一次)。但是由于阈值设置为5,所以CAST分析服务中不会保存任何值。如果阈值被设置为更低的4,值1将被保存。
<ADD>
<ADD>标签提供了一种强制指标来计算匹配模式嵌套级别的可能性。这里定义的值将被添加到每个嵌套的BEGIN/END语句的度量值中。
示例1:考虑以下指标:
... <EMBEDDED> <ADD>2</ADD> <BEGIN> <REGEXP>do</REGEXP> </BEGIN> <VALUE> <REGEXP>printf</REGEXP> </VALUE> <END> <REGEXP>while</REGEXP> </END> </EMBEDDED> ...
下面的C++源代码:TestAdd.cpp
void testAdd() { printf("Out of the loop"); do { do { do { printf("Hello World!"); } while(true); } while(true); } while(true); }
对于上面的示例,该指标将为BEGIN/CONTENT/END找到一个匹配项,为三个do/while嵌套循环找到六个匹配项。因此值7将保存在CAST分析服务中。
示例2:考虑用(简化语法)定义的度量A:
INIT=5 ADD=2 BEGIN=AAA VALUE=ZZZ END=BBB
度量B有:
INIT=5 ADD=0 BEGIN=AAA VALUE=ZZZ END=BBB
那么对于以下代码:
AAA ZZZ BBB
- metric A will be valued 5 + 2 + 1 = 8 (i.e. INIT + ADD + Number of MATCHES)
- metric B will be valued 5 + 1 = 6 (i.e. INIT + Number of MATCHES)
而对于以下代码:
AAA AAA ZZZ BBB BBB
- metric A will have 5 + 2 + 2 + 1 = 10 (i.e. INIT + 2 x ADD + Number of MATCHES)
- metric B will have 5 + 1 = 6 (i.e. INIT + 2 x ADD + Number of MATCHES)