主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

slcoverage.CodeSelector 类

命名空间: slcoverage

为覆盖率过滤器选择自定义 C 或 C++ 代码

描述

使用 slcoverage.CodeSelector 类的对象为过滤器规则指定自定义 C 或 C++ 代码选择准则。

slcoverage.CodeSelector 类是 handle 类。

创建对象

sel = slcoverage.CodeSelector(type,fileName) 根据指定的 type 创建指定 fileNameCodeSelector 对象,并设置 TypeFileName 属性。

sel = slcoverage.CodeSelector(type,fileName,functionName) 根据文件中指定的 C 或 C++ functionName 创建 CodeSelector 对象并设置 FunctionName 属性。过滤所有包含另一个函数的调用点的函数不会自动过滤被调用函数。您必须手动将被调用函数添加到过滤文件中。

sel = slcoverage.CodeSelector(type,fileName,functionName,expr,exprIndex) 为指定的表达式和表达式索引创建一个 CodeSelector 对象并设置 ExprExprIndex 属性。

sel = slcoverage.CodeSelector(type,fileName,functionName,expr,exprIndex,outcomeIndex) 根据指定的覆盖率结果创建一个 CodeSelector 对象并设置 OutcomeIndex 属性。

sel = slcoverage.CodeSelector(type,fileName,functionName,expr,exprIndex,outcomeIndex,parentExprIndex) 根据指定的覆盖率结果创建一个属于 parentExprIndex 拥有的表达式的 CodeSelector 对象,并将 DecOrCondIndex 属性设置为 parentExprIndex

属性

全部展开

要选择的自定义 C 或 C++ 代码的类型,指定为 slcoverage.CodeSelectorType 类的枚举:

  • slcoverage.CodeSelectorType.File - 自定义 C 或 C++ 代码文件名。

  • slcoverage.CodeSelectorType.Function - 自定义 C 或 C++ 代码函数名称。

  • slcoverage.CodeSelectorType.Decision - 自定义 C 或 C++ 代码决策。

  • slcoverage.CodeSelectorType.Condition - 自定义 C 或 C++ 代码条件。

  • slcoverage.CodeSelectorType.DecisionOutcome - 自定义 C 或 C++ 代码决策结果。

  • slcoverage.CodeSelectorType.ConditionOutcome - 自定义 C 或 C++ 代码条件结果。

  • slcoverage.CodeSelectorType.MCDCOutcome - 自定义 C 或 C++ 代码 MCDC 结果。

  • slcoverage.CodeSelectorType.RelationalBoundaryOutcome - 自定义 C 或 C++ 代码关系边界结果。

示例: slcoverage.CodeSelectorType.Function

属性

SetAccess
受保护

数据类型: slcoverage.CodeSelectorType

要选择的 C 或 C++ 文件,指定为字符数组或字符串数组。

示例: 'myfile.c'

属性

SetAccess
受保护

数据类型: char | string

要选择的 C 或 C++ 函数,指定为字符数组或字符串数组。

示例: 'counterbusFcn'

属性

SetAccess
受保护

数据类型: char | string

要选择的决策或条件表达式,指定为字符数组或字符串数数组。

示例: 'x | y'

属性

SetAccess
受保护

数据类型: char | string

表达式索引,指定为整数。如果您正在过滤结果,此属性就是拥有该结果的表达式的索引。如果您正在过滤表达式,则此属性是函数主体内该表达式的索引。

示例: 2

属性

SetAccess
受保护

数据类型: single | double | int

要选择的结果索引,指定为整数:

  • 对于布尔表达式,输入 1 表示 F 结果,或者输入 2 表示 T 结果。

  • 对于 switch/case 语句,第一个 case 输入 1,第二个 case 输入 2,依此类推。

  • 对于关系边界

    • 整数类型:

      • 输入 1 作为类型 -1

      • 输入 2 作为类型 +1

      • 输入 3 作为类型 0

    • 浮点类型:

      • 输入 1 替换 [-tol 0][-tol 0)

      • 输入 2 得到 (0 tol][0 tol] 则结果为 2

    有关关系边界覆盖率的更多信息,请参阅关系边界覆盖率

示例: 2

属性

SetAccess
受保护

数据类型: single | double | int

父表达式索引,指定为整数。当您过滤父决策或条件所拥有的表达式时,请使用此输入。该属性是相对于函数的父决策或条件的索引。

示例: 2

属性

SetAccess
受保护

数据类型: single | double | int

用于创建此选择器对象的代码,以字符向量形式返回。

属性:

GetAccess
public
SetAccess
受保护

选择器的描述,以字符向量形式返回。Simulink® Coverage™ 根据选择器创建描述。

属性:

GetAccess
public
SetAccess
受保护

对于 slcoverage.CodeSelector 类,此属性为空。

属性

SetAccess
受保护

数据类型: char | string | handle | integer

方法

全部展开

示例

全部折叠

此示例显示如何选择要添加过滤器规则的自定义 C 或 C++ 代码。

加载模型。

modelName = 'slcovCCallerExample';
Simulink.importExternalCTypes('my_func.h','EnumClass','dynamic');
load_system(modelName)

使用 Simulink.SimulationInput 对象配置覆盖率设置。

covSet = Simulink.SimulationInput(modelName);
covSet = covSet.setModelParameter('CovEnable','on');
covSet = covSet.setModelParameter('CovMetricStructuralLevel','MCDC');
covSet = covSet.setModelParameter('CovSFcnEnable','on');
covSet = covSet.setModelParameter('CovSaveSingleToWorkspaceVar','on');
covSet = covSet.setModelParameter('CovSaveName','covData');
covSet = covSet.setModelParameter('SimAnalyzeCustomCode','on');

使用 covSet 对象作为输入来仿真模型。

simOut = sim(covSet);
covData = simOut.covData;

创建一个选择器对象来过滤自定义 C 函数 timesK

sel = slcoverage.CodeSelector(slcoverage.CodeSelectorType.Function,...
                              'my_func.c', 'timesK');

创建一个过滤器对象并根据选择器创建规则,然后将规则添加到过滤器。

filt = slcoverage.Filter;
rule = slcoverage.FilterRule(sel,'Tested elsewhere',...
           slcoverage.FilterMode.Exclude);
addRule(filt,rule);
setFilterName(filt,'Code Filter')

将过滤器保存为 codefilter 并将其添加到 cvdatamy_func.c 对象中。由于覆盖率数据存储在 cv.cvdatagroup 对象中,因此使用 get 方法来设置属性。

save(filt,'codefilter');
covData.get('my_func.c').filter = 'codefilter';

生成覆盖率报告。

cvhtml('codeCovReport',covData);

审查报告。在自定义代码文件下,点击 my_func.c 并找到在“从覆盖率分析中过滤的对象”下添加的过滤器规则。

此示例显示如何使用 slcoverage.CodeSelector 对象来过滤由 C Caller 模块调用的自定义 C 或 C++ 程序中的代码结果。

打开模型并启用覆盖率分析

打开模型。

modelName = 'slcovCCallerExample';
Simulink.importExternalCTypes('my_func.h','EnumClass','dynamic');
load_system(modelName)

使用 Simulink.SimulationInput 对象配置覆盖率设置。

covSet = Simulink.SimulationInput(modelName);
covSet = covSet.setModelParameter('CovEnable','on');
covSet = covSet.setModelParameter('CovMetricStructuralLevel','ConditionDecision');
covSet = covSet.setModelParameter('CovSFcnEnable','on');
covSet = covSet.setModelParameter('CovSaveSingleToWorkspaceVar','on');
covSet = covSet.setModelParameter('CovSaveName','covData');

使用 covSet 作为输入来仿真模型。

simOut = sim(covSet);
covData = simOut.covData;

当对模型和自定义代码进行覆盖率分析时,仿真会将覆盖率数据作为 cv.cvdatagroup 对象返回。要提取代码覆盖率数据,请使用 get 类的 cvdatagroup 方法。

codeCovData = get(covData,'my_func.c');

以缺失结果进行申述

在此示例中,您申述 F 决策中 inputGElower 条件的 (u1->limits.upper_saturation_limit >= limit) && inputGElower 结果,该决策位于 counterbusFcn 源文件中的 my_func.c 函数内。

使用 slcoverage.CodeSelector 创建一个选择器对象。第一个输入是 CodeSelectorType 枚举。为了申述条件结果,请使用 ConditionOutcome 枚举。第二个输入是代码源文件 my_func.c。第三个输入是包含结果的函数名称,counterbusFcn。第四个输入是包含结果 (u1->limits.upper_saturation_limit >= limit) && inputGElower 的表达式。第五个输入是拥有结果的表达式的索引。在这种情况下,inputGElower 是其父条件中的第二个条件,因此此输入是 2。第六个输入是条件结果索引,对于布尔表达式的 1 结果,它是 F。第七个输入是父决策或条件的索引,对于 1 而言为 (u1->limits.upper_saturation_limit >= limit) && inputGElower,因为它是函数中的第一个决策。

enum = slcoverage.CodeSelectorType.ConditionOutcome;
sel = slcoverage.CodeSelector(enum,'my_func.c','counterbusFcn',...
    '(u1->limits.upper_saturation_limit >= limit) && inputGElower',2,1,1);

创建一个 Filter 对象和一个 FilterRule 对象并将规则应用于过滤器。

filt = slcoverage.Filter;
rule = slcoverage.FilterRule(sel,'condition does not apply');
addRule(filt,rule);

将过滤器保存到过滤器文件,然后将过滤器应用于 cvdata 对象。

save(filt,'codeOutcomeFilter');
codeCovData.filter = 'codeOutcomeFilter';

查看覆盖率报告

通过使用 cvhtml 生成覆盖率报告来验证结果是否被过滤。

cvhtml('filteredCodeCovReport',codeCovData);

版本历史记录

在 R2018b 中推出

全部展开