1、A-SPICEC+test 操作手册撰写部门:手写算法组发行范围:全公司变更记录版本号 修改点说明 变更人 变更日期 审批人 审批日期V1.0 正式发布 赵哲 2017-6-11 张文涛 2017-10-31V1.1 修改,1. 加入附录-MISRA-C2012 规则2. 修改格式张文涛 2017-10-30 王杰 2017-10-31修改点说明的内容有如下几种:创建、修改(+修改说明)、删除( +删除说明)C+test 操作手册目 录1 C+TEST 介绍 .12 C+TEST 安装 .13 静态分析 .13.1 规则设定 13.2 静态测试实施 .23.3 查看结果 34 单元测试 .74
2、.1 生成测试套件 .74.2 生成单元测试用例 74.3 桩函数 84.4 测试实施 84.5 根据结果完善测试脚本 .94.6 查看结果 94.7 生成测试报告 .105 附录 MISRA-C2012 规则 .10C+test 操作手册第 1 页 共 10 页C+test 介绍Parasoft C+test 是一个集成解决方案,用于使一系列被广泛证明可改进软件开发团队生产力和软件质量的最佳实践得以自动化处理。通过 C+test,可进行编码策略增强、静态分析、综合代码复审、单元测试和组件测试、以及运行时错误检测,以此向团队提供一种确保 C 和 C+ 代码达到其预期功能的实用方法。 C+tes
3、t 安装第一步:打开安装源程序,同普通的 windows 应用程序一样,选择安装路径,完成安装。第二步:在安装目录搜索 libs_sp.jar 并删除;在安装目录找 lic_client.jar 并替换第三步:运行程序,打开许可证页面,许可证: 网络版本:定制版 定制:全选确定,至此完成安装过程静态分析在静态分析栏中的 Results 标签是对静态分析结果的一个罗列。每个红色精灵帽都代表 一种违规行为,而它旁边的数字则代表测试代码中出现这种违规的次数。紧接着的字母表明违规行为的严重级别。再后面就是对这条规范的大致描述以及规则编号。测试配置中的“静态”标签则是对这些规则的管理,当用户需要使用某条
4、规则的时候,只需要在相应规则左侧的方框内打上勾就表明选择了该条规则。而当用户不需要某条规则检查的时候,只需要去掉相应规则的勾就可以了。1.1 规则设定 开发人员在做静态测试时启用的规则为 MISRA C 2012 MISRA2012,规则详情参见附录C+test 操作手册第 2 页 共 10 页MISRA-C2012 中内容。MISRA-C2012 检查项分为两大类,一类称为 指导(Directives) ,另一类称为规则(Rules)。汉王项目要求选择全部规范进行静态分析检查。1.2 静态测试实施开发人员选择好被测源文件后依次选择 测试执行-内建-Static Analysis-MISRA-
5、C2012,即可开始运行测试程序。如需自定义启用禁用规则,可在测试配置中复制内建测试配置,然后再用户自定义中修改即可(内建项均为默认配置,不可修改,如需修改必须建自定义项),最后依次选择 测试执行-用户自定义-“MISRA-C2012 自定义名称”。C+test 操作手册第 3 页 共 10 页1.3 查看结果测试完成后,点击“proceed”来生成测试报告文档,结果保存在 htlm 中,可点击“configure.”设置生成路径,并可在首选项中按自己需求设置报表内容和保存格式等。C+test 操作手册第 4 页 共 10 页开发人员根据静态分析报告显示的问题修改代码,修改后再次利用静态分析工
6、具进行分析,得出分析结果。对于静态分析检查出来的问题,如果不予修改,给予放行,要经过项目经理批准,最终对放行的问题给出放行说明,开发人员负责编写项目静态分析结果说明MISRA-C 2012 检查结果说明,即对放行的问题进行说明。不能放行的规范条目如下 序号 指导:MISRA C 2012 Directives MISRA2012-DIR1 嵌入汇编程序时嵌入的过程应该是纯汇编程序 MISRA2012-DIR-4_3-3序号 规则:MISRA C 2012 Rules MISRA2012-RULE2字面量零 (0) 不得用作空指针常量 (null-pointer-constant) MISRA2
7、012-RULE-11_9_a-33 用 NULL 来代替字面零 (0) 作为空指针常量 MISRA2012-RULE-11_9_b-34 不应该使用逗号运算符 MISRA2012-RULE-12_3-45 初始化器列表不应该包含持久的副作用 MISRA2012-RULE-13_1_a-36逻辑 EXTERN_C_LINKAGE int CppTest_Stub_doSomething(int i)return i + 10;桩函数的声明必须在桩函数文件中可访问到。在大多数情况下,通过将相应的头文件包含到桩函数文件中来连接它。C+test 操作手册第 9 页 共 10 页1.7 测试实施到这里
8、我们的准备工作已基本完成,可以开始编写自己的单元测试脚本了,根据需要和源码罗辑改写生成的测试用例脚本,以便符合项目单元测试需求。C+test 可以对任意一条或多条测试用例执行步骤如下:首先找到测试用例浏览器,选取待测用例点击测试执行-内建-Unit Testing-Run Unit Tests 或 测试执行-测试历史-Run Unit Tests。1.8 根据结果完善测试脚本开发人员每次测试执行完成后,会在源代码上用颜色区分开已覆盖的代码行和未被覆盖到的代码行,可以此完善测试脚本(默认绿色是已覆盖,红色是未覆盖)。1.9 查看结果在测试用例浏览器中查看详细信息。这包括: 测试的通过 / 失败状
9、态将用不同的颜色加以显示 测试执行统计信息C+test 操作手册第 10 页 共 10 页1.10 生成测试报告同静态测试生成报告相同,测试完成后点击“proceed”生成本次此时执行后的测试结果报告。附录 MISRA-C2012 规则MISRA-C Coding Standard,C 语言编码标准,把所有的规范分为两大类,一类称为指导(Directives),另一类称为规则 (Rules)。共计 91 条。具体参见 MISRA-C2012index.html 详细规则说明。 MISRA C 2012 Directives MISRA2012-DIRo 使用多重包含保护机制 MISRA2012
10、-DIR-4_10-3 o 禁止使用动态内存分配 MISRA2012-DIR-4_12-3o 所有汇编程序的使用应该被注释说明 MISRA2012-DIR-4_2-4o 嵌入汇编程序时嵌入的过程应该是纯汇编程序 MISRA2012-DIR-4_3-3o 代码段落不应该被“注释掉” MISRA2012-DIR-4_4-4C+test 操作手册第 11 页 共 10 页o 函数应该优先于类似函数宏的使用 MISRA2012-DIR-4_9-4 MISRA C 2012 Rules MISRA2012-RULEo 禁止强制类型转换操作删除以指针指定的 const 或 volatile 限制 MISR
11、A2012-RULE-11_8-3o 字面量零 (0) 不得用作空指针常量 (null-pointer-constant) MISRA2012-RULE-11_9_a-3o 用 NULL 来代替字面零 (0) 作为空指针常量 MISRA2012-RULE-11_9_b-3o 不应该使用逗号运算符 MISRA2012-RULE-12_3-4o 初始化器列表不应该包含持久的副作用 MISRA2012-RULE-13_1_a-3o 包含自增 (+) 或自减 (-) 运算符的表达式不应该有其它潜在的副作用 MISRA2012-RULE-13_3-4o 不得使用一个内置赋值运算符的结果 MISRA201
12、2-RULE-13_4-4o 逻辑 & 或者 | 运算符的右边操作数不应该包含副作用 MISRA2012-RULE-13_5-3o sizeof 操作符的参数不应该是含副作用的表达式 MISRA2012-RULE-13_6_a-2o 不应该在 sizeof 操作符的操作数中访问由一个不稳定的数值指定的对象 MISRA2012-RULE-13_6_b-2o 函数调用不得是 sizeof 运算符的操作数 MISRA2012-RULE-13_6_c-2o 不应该使用 goto 语句 MISRA2012-RULE-15_1-4o goto 语句应该跳转到随后在同一个函数中声明的标签 MISRA2012
13、-RULE-15_2-3o 任何由 goto 语句引用的标签应该声明在同一个模块中,或者在一个包围 goto 语句的模块中 MISRA2012-RULE-15_3-3o 对于任何循环语句,不要有超过一个 break 或 goto 语句用于循环终止 MISRA2012-RULE-15_4-4o 函数应该在其最后有单一的出口 MISRA2012-RULE-15_5-4o switch, while, do.while 或 for 语句的主体应该是复合语句 MISRA2012-RULE-15_6_a-3o 在 if 和 else 之后应该紧跟着复合语句 MISRA2012-RULE-15_6_b-3
14、o 所有的 if.else-if 结构中应该由 else 分支结束 MISRA2012-RULE-15_7-3o 只能当最接近的封闭复合语句是 switch 语句主体部分时才能使用 switch 标签 MISRA2012-RULE-16_2-3o 无条件的 break 语句应该作为每一个非空 case 子句的结尾 MISRA2012-RULE-16_3_a-3o 无条件限制的 break 语句应作为所有非空 default 条件的终结。 MISRA2012-RULE-16_3_b-3o 需要为 switch 语句提供 default 分支 MISRA2012-RULE-16_4_a-3o de
15、fault 标签在结束 break 之前应该有一个语句或者一个注释 MISRA2012-RULE-16_4_b-3o 如果存在一个 default 标签,应该作为 switch 语句的第一个或最后一个 switch 标签 MISRA2012-RULE-16_5-3o 每一个 switch 语句应该含有至少两个 switch 子句 MISRA2012-RULE-16_6-3o switch 的表达式中不能出现有效的布尔类型值 MISRA2012-RULE-16_7_a-3o switch 表达式不应该表示一个有效的布尔值 MISRA2012-RULE-16_7_b-3o 不得使用 va_list
16、, va_arg, va_start, va_end, va_copy 标识符 MISRA2012-RULE-17_1_a-3C+test 操作手册第 12 页 共 10 页o 不得使用 va_list, va_arg, va_start, va_end 标识符 MISRA2012-RULE-17_1_b-3o 函数不应该直接或者间接地调用自己 MISRA2012-RULE-17_2-3o 函数原型应该总是对函数调用可见 MISRA2012-RULE-17_3-2o 非 void 返回类型的函数的所有退出路径应该有一个明确的包含表达式的返回语句 MISRA2012-RULE-17_4-2o 函
17、数参数对应的数组类型参数应该包含合适数量的元素 MISRA2012-RULE-17_5-4o 应该使用具有非 void 返回类型的函数返回值 MISRA2012-RULE-17_7_a-3o 不得使用一个非 void 返回类型函数返回的值 MISRA2012-RULE-17_7_b-3o 不应该修改函数参数 MISRA2012-RULE-17_8-4o 对象的申明需要包含不超过 2 成指针嵌套 MISRA2012-RULE-18_5-4o 不得声明灵活的数组成员 MISRA2012-RULE-18_7-3o 不得使用可变长数组类型 MISRA2012-RULE-18_8-3o 不得使用联合体关
18、键字 MISRA2012-RULE-19_2-4o #include 之前只允许有预处理命令和注释 MISRA2012-RULE-20_1-4o 禁止使用预处理操作符 # 和 # MISRA2012-RULE-20_10-4o 一个紧跟在#操作符的宏参数不应该在其后紧跟或在其前加上#操作符 MISRA2012-RULE-20_11-3o 一个被用作 # 或者 # 操作符的操作数的宏参数,并且它本身受制于进一步的宏替换,那么它应该只能被用作这些操作符的操作数 MISRA2012-RULE-20_12-3o 预处理指令即使被预处理器排除也必须有语法意义 MISRA2012-RULE-20_13-3
19、o 在同一个文件中 #else, #elif 和 #endif 必须对应有 #if 或 #ifdef 预处理指令 MISRA2012-RULE-20_14-3o 字符 , “, /* 或 / 不得出现在头文件的名称中 MISRA2012-RULE-20_2_a-3o 字符 不得出现在头文件的名称中 MISRA2012-RULE-20_2_b-3o #include 指令后面应当添加 或是 “filename“ MISRA2012-RULE-20_3-3o C90 中规定宏不应该与关键字定义为相同名称 MISRA2012-RULE-20_4_a-3o C99 中规定宏不应该与关键字定义为相同名称
20、 MISRA2012-RULE-20_4_b-3o 禁止使用 #undef MISRA2012-RULE-20_5-4o 类似函数的宏的参数不应该包含类似预处理命令的标识 MISRA2012-RULE-20_6-3o 在函数式宏定义中,每个参数的实例应该被括号括起来,除非它被用于 # 或 # 操作符 MISRA2012-RULE-20_7-3o 除在 #ifdef 预处理命令、#ifndef 预处理命令和 defined() 操作符之外,所有的宏变量在使用前必须定义 MISRA2012-RULE-20_9_a-3o 不要使用在编译单元中未定义的预编译器指令 #if 和 #elif 宏 MISR
21、A2012-RULE-20_9_b-3o 避免使用标准 C 库中与时间有关的函数 MISRA2012-RULE-21_10-3o 不得使用标准头文件 MISRA2012-RULE-21_11-3o 不得使用 中的异常处理功能 MISRA2012-RULE-21_12-4o 禁止使用动态内存分配 MISRA2012-RULE-21_3-3o 禁止使用 setjmp 宏和 longjmp 函数 MISRA2012-RULE-21_4_a-3o 不要使用标准头文件 MISRA2012-RULE-21_4_b-3o 禁止使用标准库文件 中的处理函数 MISRA2012-RULE-21_5_a-3o 禁
22、止使用信号处理文件 中的处理函数 MISRA2012-RULE-21_5_b-3o 不得使用标准的库的 input/output 函数 MISRA2012-RULE-21_6-3C+test 操作手册第 13 页 共 10 页o 禁止使用 stdlib.h 中库函数 atof, atoi 和 atol MISRA2012-RULE-21_7-3o 禁止使用 stdlib.h 中的库函数 abort, exit, getenv 和 system MISRA2012-RULE-21_8-3o 不得使用在中的 bsearch 和 qsort 库函数 MISRA2012-RULE-21_9-3o 函数
23、不应该包含未使用的标签声明 MISRA2012-RULE-2_6-4o 在函数中不应该有未使用的参数 MISRA2012-RULE-2_7-4o 禁止在 C 语言风格的注释中使用 /* 字符序列 MISRA2012-RULE-3_1_a-3o 字符序列 / 不得被用于 C 语言风格的注释中 MISRA2012-RULE-3_1_b-3o 字符序列 /* 不得被用于 C+ 语言风格的注释中 MISRA2012-RULE-3_1_c-3o 不得在 / 注释中使用行合并 MISRA2012-RULE-3_2-3o 八进制和十六进制转义序列将被终止 MISRA2012-RULE-4_1-3o 禁止使用
24、三字母词 MISRA2012-RULE-4_2-4o 由 signed 整型命名的位域应该有超过一位的长度 MISRA2012-RULE-6_2-3o 八进制常量(除了 0)不应该被使用 MISRA2012-RULE-7_1-3o 使用大写 L 而非小写 l 来指定 long 类型 MISRA2012-RULE-7_3-3o 不能修改窄字符串字面量 MISRA2012-RULE-7_4-3o 内联函数应该声明为静态存储类 MISRA2012-RULE-8_10-3o 在一个列举列表内,含蓄指定列举常数的值应该是唯一的 MISRA2012-RULE-8_12-3o 不得使用严格的类型限定符 MISRA2012-RULE-8_14-3o 带有内部链接的对象和函数应使用静态关键字进行定义和声明 MISRA2012-RULE-8_8-3