在此版本中,我们着重于支持新编译器,并扩展了对编码标准的支持,包括 MISRA 2008。
支持新编译器
- Microsoft Visual C++ 14.1x/ 2017
- WindRiver GCC 4.8.x (仅限静态分析)
- 适用于 ARM 8.11.x 的 IAR 编译器
增强型单元测试
我们增加了对在数据源中使用枚举器值的支持;请参见处理枚举值和执行选项卡设置-定义测试的执行方式。
增强静态分析
在此版本中,我们添加了新的静态分析规则以报告 MISRA C++ 2008;请参见New Code Analysis Rules。
MISRA C++ 2008 规则的严重性级别已更新:
- 必需→严重性2
- 警告→严重性4
- 文件→严重性5
Flow Analysis 已扩展,支持 C++11 Thread API(用于 BD-TRS 规则)和新的配置选项,允许您:
- 使用
noreturn
属性禁用终止符/函数 - 通过【在至少有一条路径未使用该变量的值时报告】选项,将 BD-PB-VOVR 规则参数化;有关详细信息,请参见规则文档。
- 禁用报告违规,其路径通过内联汇编代码传递
- 启用或禁用规则参数中的所有污染数据源
RuleWizard 模块已扩展,具有以下节点和属性:
- IsFinal - 如果使用 'final’或 'sealed’说明符声明了函数或类,则返回 true
- IsExplicitFinal - 如果使用 'final’说明符声明了函数或类,则返回 true
- IsSealed - 如果函数或类使用 'sealed’说明符声明,则返回 true
有关更多详细信息,请参见 RuleWizard 10.3.3 用户指南。
新建代码分析规则
规则 ID | 标题 |
---|---|
BD-PB-PTRARR | 指针操作数和使用该操作数进行的指针算术运算得出的任何指针均应为同一数组的两个地址元素 |
BD-TRS-CMF | 使 const 成员函数为线程安全的 |
CODSTA-CPP-90 | 头文件中不得使用 using 指令和 using 声明(不包括类范围或函数范围 using 声明) |
CODSTA-CPP-91 | 重载的二进制运算符应根据其对应的复合赋值运算符实现 |
CODSTA-CPP-92 | 多重继承层次结构中的所有可访问实体名称应唯一 |
GLOBAL-COMPATDECLS | 对象或函数的所有声明应具有兼容的类型 |
GLOBAL-EXCSPECDECL | 如果一个函数是用异常规范声明的,那么同一函数(在其他转换单元中)的所有声明都应使用相同的类型标识集声明。 |
GLOBAL-ONEDEFRULE | 不应违反“一个定义规则” |
GLOBAL-ONEFILEDECL | 多个翻译单元中使用的类型,对象或函数应在有且仅有一个文件中声明 |
GLOBAL-ONEUSEVAR | 项目不得包含仅具有一种用途的非易失性 POD 变量 |
GLOBAL-TEMPLNOINST | 所有类模板、函数模板、类模板成员函数和类模板静态成员都应至少实例化一个 |
GLOBAL-UNIQUETYPEDEF | Typedef 名称(包括限定,如果有的话)应为唯一标识符 |
GLOBAL-UNUSEDTYPE | 项目不得包含未使用的类型声明 |
GLOBAL-UNUSEDVIRTPARAM | 虚函数和重写它的所有函数的参数集中不得有未使用的参数(命名或未命名) |
GLOBAL-VIRTBASECLASS | 仅当在 diamond 层次结构中使用基类时,才应将其声明为虚类 |
MISRA2008-0_1_12 | 虚函数和重写它的所有函数的参数集中不得有未使用的参数(命名或未命名) |
MISRA2008-0_1_4 | 项目不得包含仅具有一种用途的非易失性 POD 变量 |
MISRA2008-0_1_5 | 项目不得包含未使用的类型声明 |
MISRA2008-0_1_6 | 避免使用未使用的值 |
MISRA2008-0_1_9: | 所有非空语句都应至少具有一个副作用,无论该副作用是被执行还是导致控制流改变 |
MISRA2008-0_3_1_a | 避免超出范围访问数组 |
MISRA2008-0_3_1_b | 避免空指针解引用 |
MISRA2008-0_3_1_c | 避免被零除 |
MISRA2008-0_3_1_d | 避免由于定义不正确的格式限制而导致缓冲区溢出 |
MISRA2008-0_3_1_e | 避免由于读取非零终止字符串而导致溢出 |
MISRA2008-0_3_1_f | 取消引用后不要检查 null |
MISRA2008-0_3_1_g | 从缓冲区读取时避免溢出 |
MISRA2008-0_3_1_h | 写入缓冲区时避免溢出 |
MISRA2008-0_3_1_i | 指针算术应仅应用于寻址数组或数组元素的指针 |
MISRA2008-0_3_1_j | ,=,,= 不得应用于指针类型的对象,除非它们指向同一数组 |
MISRA2008-2_10_3 | Typedef 名称(包括限定,如果有的话)应为唯一标识符 |
MISRA2008-3_2_1 | 对象或函数的所有声明应具有兼容的类型 |
MISRA2008-3_2_2 | 不应违反“一个定义规则” |
MISRA2008-3_2_3 | 多个翻译单元中使用的类型,对象或函数应在有且仅有一个文件中声明 |
MISRA2008-3_2_4 | 具有外部链接的标识符应仅具有一个外部定义 |
MISRA2008-5_0_16_a | 避免超出范围访问数组 |
MISRA2008-5_0_16_b | 指针操作数和使用该操作数进行的指针算术运算得出的任何指针均应为同一数组的两个地址元素 |
MISRA2008-5_17_1 | 重载的二进制运算符应根据其对应的复合赋值运算符实现 |
MISRA2008-5_19_1_a | '+'、'-'、'*’运算符中常量表达式的整数上溢或下溢 |
MISRA2008-5_19_1_b | '’运算符中常量表达式的整数上溢或下溢 |
MISRA2008-7_2_1 | 具有枚举基础类型的表达式应仅具有与枚举的枚举数对应的值 |
MISRA2008-7_3_6 | 头文件中不得使用 using 指令和 using 声明(不包括类范围或函数范围 using 声明) |
MISRA2008-10_1_2 | 仅当在 diamond 层次结构中使用基类时,才应将其声明为虚类 |
MISRA2008-10_2_1 | 多重继承层次结构中的所有可访问实体名称应唯一 |
MISRA2008-14_5_1 | 不要在关联的命名空间中声明非成员通用函数 |
MISRA2008-14_6_2 | 该函数应解析为先前在翻译单元中声明的函数 |
MISRA2008-14_7_1 | 所有类模板、函数模板、类模板成员函数和类模板静态成员都应至少实例化一个 |
MISRA2008-15_4_1 | 如果一个函数是用异常规范声明的,那么同一函数(在其他转换单元中)的所有声明都应使用相同的类型标识集声明。 |
MISRA2012-RULE-18_1_c | 指针操作数和使用该操作数进行的指针算术运算得出的任何指针均应为同一数组的两个地址元素 |
PB-70 | 具有枚举基础类型的表达式应仅具有与枚举的枚举数对应的值 |
TEMPL-13 | 不要在关联的命名空间中声明非成员通用函数 |
TEMPL-14 | 该函数应解析为先前在翻译单元中声明的函数 |
更新了代码分析规则
- BD-PB-OVERFWR, BD-PB-OVERFRD, BD-PB-VOVR, BD-SECURITY-ARRAY, BD-TRS-LOCK, BD-TRS-TSHL
- CODSTA-103, CODSTA-163_b
- COMMENT-13
- INIT-06
- JSF-071_b, JSF-111, JSF-171, JSF-187, JSF-204_b
- MISRA2004-14_2, MISRA2004-15_1, MISRA2004-17_2, MISRA2004-17_3, MISRA2004-17_6_a
- MISRA2008-0_1_6, MISRA2008-0_1_9, MISRA2008-0_3_1_g, MISRA2008-0_3_1_h, MISRA2008-0_3_1_i, MISRA2008-0_3_1_j, MISRA2008-5_0_17, MISRA2008-5_0_18, MISRA2008-5_19_1_a, MISRA2008-5_19_1_b, MISRA2008-6_4_3_a, MISRA2008-6_4_4, MISRA2008-7_5_1, MISRA2008-7_5_2_a
- MISRA2012-DIR-4_1_g, MISRA2012-DIR-4_1_h, MISRA2012-DIR-4_1_i, MISRA2012-DIR-4_1_j, MISRA2012-DIR-4_13_d, MISRA2012-DIR-4_14_a, MISRA2012-RULE-1_3_d, MISRA2012-RULE-1_3_e, MISRA2012-RULE-1_3_m, MISRA2012-RULE-2_2_a, MISRA2012-RULE-3_2, MISRA2012-RULE-10_3_b, MISRA2012-RULE-12_4_a, MISRA2012-RULE-12_4_b, MISRA2012-RULE-16_1_b, MISRA2012-RULE-16_2, MISRA2012-RULE-18_2, MISRA2012-RULE-18_3, MISRA2012-RULE-18_6_a, MISRA2012-RULE-21_17_b
- PB-11, PB-66_a, PB-66_b
已解决的 Bugs 和 FRs
Bug/FR ID | 说明 |
---|---|
CPP-18579 | 规则 MISRA2012-RULE-10_3_b (CODSTA-163_b) 报告误报 |
CPP-36999 | base_from_member.hpp", line 136: error: expected a ")" ::new ((void*) 0) MemberType( static_cast<T&&>(x)...) |
CPP-38187 | 规则 MISRA2004-17_6_a 报告误报违规 |
CPP-38241 | PB-11 错误行为 |
CPP-38336 | MISRA2004-17_6_a-3 报告误报 |
CPP-38342 | 规则 MISRA2004-15_1 抛出带有 'default’的误报 |
CPP-38589 | C++test 10.3.2 中的 CDD 规则回归(仅日语) |
CPP-38602 | 向 RuleWizard 词典添加函数的 C++11 "final”说明符 |
CPP-38661 | 运行 cpptestcli 时看到 log4cplus:ERROR |
CPP-39168 | 在 Windows 7 上无法使用 msbuild 生成 BDF |
CPP-39210 | 示例 ut_ds_details_to_csv.xsl 的报告生成失败(Visual Studio) |
CPP-39211 | 如果同一目录中有子规则(文本规则),则可能无法执行用户规则 |
CPP-39356 | 使用 Keil for ARM v5.x 解析与 C++11 相关的错误 |
CPP-39405 | INIT-06 默认移动构造函数为误报 |
CPP-39406 | [DESKTOP] TC 编辑器显示单选按钮规则参数的选择不当 |
CPP-39407 | Static_assert 的双重参数 |
CPP-39409 | MISRA2012-RULE-7_1 误报 |
CPP-39410 | MISRA2012-RULE-16_4_b 误报 |
CPP-39415 | RVCT 编译器接受大写字母 '--C99’标签 |
CPP-39495 | 支持 IAR EWARM 8.x |