Loading
0

软件测试工具Parasoft如何解决结构体中包含零大小数组时的静态分析错误

在嵌入式系统开发中,C/C++开发团队经常面临确保代码质量、可靠性和安全性的挑战,特别是在处理非标准语言特性时。Parasoft C/C++test作为一款自动化代码测试工具,支持编码策略实施、静态分析、单元和组件测试以及运行时错误检测,为团队提供了一条确保代码按预期运行的实用途径。

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

在实际开发过程中,开发人员有时会使用零大小数组(也称为柔性数组或可变长度数组)这一非标准C/C++扩展来创建内存高效的数据结构,这类数组通常出现在结构体的末尾,用于表示可变长度的数据缓冲区。然而,这些非标准语法特性在静态分析过程中可能引发工具兼容性问题,特别是当使用IAR 6.3或更高版本的编译环境时。

下面则详细描述了如何配置Parasoft C/C++test以解决结构体中包含零大小数组时遇到的静态分析错误,确保开发团队既能利用这一有用的语言扩展,又不牺牲代码质量分析的严谨性。

在IAR 6.3以上编译环境中,如果在源码中(比如声明在某个头文件中)存在以下的代码会出现错误,无法正常静态分析。

报告的错误如下:

Starting "Parasoft's Recommended Rules" (Coding Standards) for /stuct ...

[paraConfig.c] Checking Coding Standards for:
/stuct/ppexample/paraConfig.c
/stuct/ppexample/paraConfig.h
/stuct/ppexample/typedef.h
[main.c] Checking Coding Standards for:
/stuct/ppexample/main.c
[paraConfig.c] "D:\ppexample\paraConfig.h", line 33: internal error: assertion failed at:
[paraConfig.c] "class_decl.c", line 16130
[paraConfig.c]
[paraConfig.c] struct ParamCfgHead B1553head;
[paraConfig.c] ^
[paraConfig.c]
[paraConfig.c] 1 catastrophic error detected in the compilation of "C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\ParaSoft.3856.18467.c".
[paraConfig.c] Compilation aborted.
[main.c] ...done.
[paraConfig.c] ...failed.
No violations found.
Files checked:
/stuct/ppexample/main.c

"Parasoft's Recommended Rules" (Coding Standards) for /stuct finished with error(s). Examine the log above for details.

Technical Support archive created: D:\tutor\TechnicalSupport_33.zip

原因是在结构体中嵌套了结构体,但是内层结构体又包含了一个大小为零的数组。如下所示:

struct SysParamHead {
  short usNum;
  char  ucData[0];
};

struct SysParam {
  struct SysParamHead head;
  char c1;
  char c2;
};

因为IAR FOR ARM的版本是6.3.所以需要修改 6.3的EDG设置。具体设置如下:

1、定位到本地安装目录的如下文件夹

C:\Program Files\Parasoft\C++test\9.5\engine\etc\compilers\iccarm_6_3

2、因为代码是C语言,所以用编辑器打开c.psrc文件(最好在这之前备份该文件到某个一地方)。

3、修改里面的两个地方:

设置'edg.p_type_with_flexible_array_allowed_as_any_member' 为 'FALSE'.

设置'edg.gcc_mode' 为 'TRUE'

4、保存退出,然后再次用C++test跑这个实例项目/客户的项目,问题就应该解决。

5、对于有些编译器,可能有其他问题,比如

'check_target_config: invalid integer sizes for GNU IA-32 vector functions'.

需要设置 'nios_mode' 为 'TRUE' 。

通过介绍的配置方法,Parasoft C/C++test能够有效支持包含零大小数组的结构体代码分析,解决了在IAR 6.3及以上编译环境中的静态分析兼容性问题。这不仅体现了Parasoft C/C++test在处理各种编码实践和编译器扩展方面的灵活性,也确保了团队在使用非标准但实用的语言特性时仍能维持高标准的代码质量检查。除了处理此类特定问题外,Parasoft C/C++test还全面支持静态代码分析、单元测试生成与执行以及运行时错误检测等多种功能,帮助团队自动化执行多种已经验证的最佳实践,在开发周期早期发现和解决缺陷,减少测试时间和工作量,最终提升软件开发团队的生产力和软件质量。

关于慧都

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

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