随着汽车软件开发的复杂程度不断提升,尤其是智能网联汽车和自动驾驶技术的进步,汽车软件开发的复杂程度不断攀升。为了满足日益增长的功能需求和技术挑战,异构硬件平台被越来越多地采用,不同的工具链也不可避免地被引入到实际的开发流程中。这一趋势不仅增加了开发过程的技术多样性,也使得单个项目的编译过程中会涉及到多种编译器。
本文主要讲解基于静态代码分析工具Helix QAC,我们该如何对多编译器工程进行静态分析。
新版本Helix QAC(2024.1+)的分析方式
为了适应这一趋势,Helix QAC在2024年发布的版本中引入了多CCT的功能。CCT(Compiler Compatibility Template),是Helix QAC软件中存储编译器环境配置的文件。根据CCT文件生成的方式,Helix QAC把CCT分为了两种:
- 自动CCT(Auto CCT):在工程同步时,自动生成的CCT;
- 静态CCT(Static CCT):基于CCT生产工具提前生成的CCT;
自动CCT
针对自动CCT方式,多编译器的配置也是自动的,无需我们进行额外的设置,目前Helix QAC支持使用自动CCT的编译器如下表:
Compiler | Filter | Command |
ARM Clang | qa_armclang | armclang |
Clang C | qa_clang | clang,clang-[3-9][.][0-9],clang-[1-9][0-9][.][0-9],clang-[3-9],clang-[1-9][0-9] |
Clang C++ | qa_clang | clang++,clang++-[3-9][.][0-9],clang++-[1-9][0-9][.][0-9],clang++-[3-9],clang++-[1-9][0-9] |
Compiler caching tools | ccache | ccache,distcc,ccache-motorola,ccache_cc,ccache_cxx |
Embarcadero BCC | qa_bccclang | bcc64 |
GNU C | qa_gnu | gcc,cc,c++,gcc-[1-9],gcc-[1-9][0-9],gcc-[1-9][.][0-9],gcc-[1-9][0-9][.][0-9] |
GNU C Cross compilers | qa_gnu | *-*-gcc,*-*-*-gcc,*-*-*-gcc-[1-9]* |
GNU C++ | qa_gnu | g++,g++-[1-9],g++-[1-9][0-9],g++-[1-9][.][0-9],g++-[1-9][0-9][.][0-9] |
GNU C++ Cross compilers | qa_gnu | *-*-g++,*-*-*-g++,*-*-*-g++-[1-9]* |
GNU cc1/cc1plus | qa_gnu_cc1 | cc1,cc1plus |
Green Hills ARM | qa_ghs | cxarm,ccarm,cxarm64,ccarm64,cxthumb,ccthumb,cxtxarm,cctxarm |
Green Hills Integrity | qa_ghs | ccint*,cxint* |
Green Hills PPC | qa_ghs | cxppc,ccppc,cxtxppc,cctxppc |
Green Hills TriCore | qa_ghs | cctri,cxtri |
Green Hills v850 | qa_ghs | cx*850,cc*850,cxv850e,ccv850e |
Hexagon Clang | qa_hexagonclang | hexagon-clang,hexagon-clang++ |
HighTec Tricore | qa_hightec | tricore-c++,tricore-g++,tricore-gcc |
IAR compilers | qa_icc | icc* |
Keil ArmCC | qa_armcc | armcc |
Microchip MPLAB pic24 | qa_microchip30 | pic30-gcc |
Microchip MPLAB xc16 | qa_microchip16 | xc16-gcc |
Microchip MPLAB xc32 | qa_microchip32 | xc32-gcc,xc32-g++,xc32-c++ |
Microchip MPLAB xc8 | qa_microchip8 | xc8 |
Microchip MPLAB xc8-cc | qa_microchip8cc | xc8-cc |
QNX | qa_qnx | qcc,QCC,q++ |
Renesas | qa_renesas | ccrh,ccrl,ccrx,cx |
Renesas ca850 | qa_renesas_ca850 | ca850 |
Renesas cc78k0 | qa_renesas_cc78k0 | cc78k0,cc78k0r |
Synopsys DesignWare ARC | qa_metaware | ccac |
TI CCS | qa_ti | armcl,cl[0-9]?*,clpru |
TI CCS Clang | qa_tiarmclang | tiarmclang |
Tasking | qa_tasking | ctc,cptc,cmcs |
Visual Studio | qa_mscompile | cl,clarm,clsh |
Wind River | qa_windriver | dplus,dcc |
静态CCT
如果我们采用传统的静态CCT的方式,那么需要我们提前为不同的编译器生成对应的CCT文件,并在HeliX QAC中将这些CCT导入到软件中。
Helix QAC现在支持为一种语言选择多个CCT配置,如下:
在我们完成源码加载后,如果不进行单独配置,那么Helix QAC会使用Default CCT对源码进行解析。如果文件夹内的源码使用的编译器与默认CCT不一样,可以在对应的文件属性中重新选择合适的CCT配置。
需要注意的是,我们只能针对文件夹进行CCT的选择,不能针对单个源码进行CCT的配置。而且,对于多CCT的工程,由于这是Helix QAC最新版本才有的功能,因此无法兼容Dashboard,只能将多CCT工程的分析结果上传到Validate中。
老版本Helix QAC的分析方式
由于老版本Helix QAC中无法为文件夹选择不同的CCT,如果要实现多编译器的工程分析,需要借助Helix QAC的CMA工程。
CMA(Cross-Module Analysis),是HeliX QAC提供的一种跨模块分析功能,它允许我们将多个HeliX QAC工程添加到CMA工程中,以进行跨模块的分析,并检查重复定义、不兼容的声明和未使用的变量等问题。
具体到多编译器的工程场景,我们需要为每个编译器建立一个Helix QAC工程,并将使用该编译器的源码及头文件加载到该工程中,然后将这些不同编译器的QAC工程添加到CMA工程中。
显然,Helix QAC的新功能提供了极大便利,来高效支持多编译器。
结语:
通过上述讨论可以看出,随着汽车软件开发复杂度的提升,异构硬件平台的应用已成为必然趋势。多编译器环境的引入不仅是技术发展的自然产物,更是解决日益增长的功能需求和技术挑战的有效途径。在此背景下,Helix QAC 作为一款先进的静态代码分析工具,其新版本中引入的多CCT功能为开发人员提供了强大的支持,该功能不仅简化了多编译器环境下的代码分析过程,还可以极大增强代码的质量和安全性。
如果想试用最新版的Helix QAC,欢迎垂询北汇信息。