Loading
0

自动化测试工具Parasoft在keil中如何解决C99规则的结构体变量指定初始化报错

在嵌入式C语言开发领域,尤其是在遵循MISRA C、CERT C等严格编码标准的项目中,静态代码分析是保证软件质量、可靠性与安全性的关键环节。Parasoft C/C++test作为一款用于C/C++语言的自动化软件测试工具,在执行静态分析时,其内置的解析器会严格检查代码。

>>点击获取Parasoft C/C++test试用

当遇到使用非恒定值(如通过指针解引用获得的变量)对结构体进行初始化时,即使该写法在特定编译器(如Keil ARM)下可通过编译,C++test的默认规则也可能将其报告为错误。下面描述了解决此类编译器差异性问题的方法。

遇到如下源码的时候,C++Test会报错无法执行静态分析:

static void ill_key_trim_set(ILL_LED_ConfigTy *config)
{
      //ok
      LED_DRIVER_MsgTy msg1;
      msg1.flags = LED_DRIVER_WE;
      msg1.led_group = config->led;
      msg1.trim = &config->trim;
      //report error error: expression must have a constant value
    LED_DRIVER_MsgTy msg= {
        .flags = LED_DRIVER_WE,
        .led_group = config->led, //report error
        .trim = &config->trim //report error
    };

}

keil项目通过如下选项可以通过编译


C++Test中编译器选项添加 --c99一样会报如下错误:

/Sensor/Sensor/Demo.c 的抑制数据检查中 ...
...完成.
正在检查编码标准和收集数据:

    /Sensor/Sensor/Demo.c
"C:\MyProjects\keil4\MDK-ARM\Sensor\Demo.c", line 47: error: expression must
          have a constant value
          .led_group = config->led,
                       ^

"C:\MyProjects\keil4\MDK-ARM\Sensor\Demo.c", line 48: error: expression must
          have a constant value
          .trim = &config->trim
                ^

尽管在Parasoft C/C++test中添加了--c99编译器选项以启用对C99语言标准的支持,但静态分析仍然报错,其核心原因在于C99标准本身是一个包含了许多独立特性的集合,而不同的编译器或分析器对这些特性的支持粒度可能并非“全有或全无”。具体到该错误,C99允许使用非常量表达式初始化自动聚合类型这一特性,可能在C++test所使用的底层解析器中,被默认视为一个需要单独、显式启用的扩展特性。因此,通用的--c99选项并未自动涵盖此特定规则,必须通过更精确的选项来明确告知分析器接受此种代码模式,从而解决与项目编译器的行为一致性问题。

解决方案:

通过自定义编译器或者修改C++Test编译器的源文件,找到并打开c.psrc文件
在edgtk.optionAlias... 行之后添加如下文代码:

edgtk.optionAlias option=c99 value=--allow_nonconstant_auto_aggr_init_in_c_mode=true
edgtk.optionAlias option=-c99 value=--allow_nonconstant_auto_aggr_init_in_c_mode=true

如:

通过深入理解Parasoft C/C++test的分析引擎配置选项,我们成功解决了因编译器差异导致的静态分析报错问题。通过自定义编译器选项,允许在C模式下进行非恒定值的自动聚合初始化,使得C++test的分析行为与Keil MDK-ARM编译器保持一致,确保了开发流程的顺畅。

以上操作充分展示了Parasoft C/C++test不仅提供开箱即用的高标准合规性检查,其高度的可配置性和灵活性更能让它无缝适配各种特定的项目环境和工具链。除了处理此类编译器兼容性问题,Parasoft C/C++test还全面支持单元测试、运行时错误检测、代码覆盖率分析等多种质量保障活动,助力客户构建高效、可靠的嵌入式软件开发与持续测试流程,最终交付更高质量、更高安全性的软件产品。

关于慧都

慧都科技(EVGET)成⽴于2003年,是⼀家⾏业数字化解决⽅案公司,⻓期专注于软件、油⽓与制造⾏业。公司基于深⼊的业务理解与管理洞察,以系统化的业务建模驱动技术落地,帮助企业实现智能化运营与⻓期竞争优势。

慧都科技作为Parasoft公司在中国区的官方授权合作伙伴,为国内企业提供Parasoft C/C++test产品的正版授权、定制化部署与全生命周期技术支持与服务。我们致力于助力客户精准贯彻功能安全标准、全面提升软件开发效率、有效管控项目风险,最终构建符合国际标准的高质量软件体系。