在此版本中,我们着重于支持新编译器,并扩展了对编码标准的支持,包括 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-UNIQUETYPEDEFTypedef 名称(包括限定,如果有的话)应为唯一标识符
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_3Typedef 名称(包括限定,如果有的话)应为唯一标识符
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-36999base_from_member.hpp", line 136: error: expected a ")" ::new ((void*) 0) MemberType( static_cast<T&&>(x)...) 
CPP-38187规则 MISRA2004-17_6_a 报告误报违规
CPP-38241PB-11 错误行为
CPP-38336MISRA2004-17_6_a-3 报告误报
CPP-38342规则 MISRA2004-15_1 抛出带有 'default’的误报
CPP-38589C++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-39407Static_assert 的双重参数
CPP-39409MISRA2012-RULE-7_1 误报
CPP-39410MISRA2012-RULE-16_4_b 误报
CPP-39415RVCT 编译器接受大写字母 '--C99’标签
CPP-39495支持 IAR EWARM 8.x
  • No labels