Coverity Self-Build无法构建C++17嵌入式应用的问题求助
我之前也踩过类似Coverity和ARM交叉编译器兼容的坑,结合你的情况——应用本身用ARM GCC Embedded v7.2编译完全正常,但Coverity Scan Self-Build 2017.07版本在处理部分C++文件时触发汇编器执行失败,这里给你几个针对性的排查和解决思路:
先确认Coverity对编译器和C++标准的支持边界
Coverity 2017.07是比较老旧的版本,它对C17的支持还处于初期阶段,尤其是ARM交叉编译场景的适配很不完善。ARM GCC 7.2已经能支持大部分C17特性,但Coverity的静态分析引擎可能无法正确解析某些语法,导致生成的中间代码让汇编器报错。
你可以尝试在Coverity构建命令里显式指定C++标准,确保Coverity能正确识别,而不是依赖编译器默认设置,比如:cov-build --dir cov-int make CXXFLAGS="-std=c++17 -O0 -g"对比汇编器参数,排查传递错误
从报错信息看,Coverity在调用ARM汇编器as时传递了一堆包含路径参数,但可能存在参数格式错误或者Coverity没正确处理交叉编译的路径。
建议你先手动编译时用make VERBOSE=1查看实际执行的汇编命令,把参数记录下来;再对比Coverity报错里的as命令参数,看看有没有多余、缺失或者格式不对的地方。
如果发现参数确实有问题,可以通过COV_ASFLAGS环境变量手动覆盖汇编器参数,比如:export COV_ASFLAGS="-I . -I src -I src/os_config -I eigen -I senoval -I legil..." cov-build --dir cov-int make版本适配:升级Coverity或降级编译器
2017.07版的Coverity兼容性实在有限,后续版本(比如2020及以后)对ARM GCC和C17的支持提升很大,如果条件允许,升级到较新的Coverity Scan Self-Build工具是最彻底的解决办法。
要是暂时没法升级Coverity,也可以试试把ARM GCC版本降级到Coverity 2017.07明确支持的系列,比如ARM GCC 6.x——这个版本的C17支持虽然不如7.2,但Coverity对它的适配更成熟,而且你的应用既然能在7.2正常编译,大概率也能在6.x上跑通(只要没用到6.x不支持的C++17特性)。应急方案:排除问题文件扫描
如果只有少数几个C++文件触发报错,可以先暂时排除这些文件,完成其他部分的扫描,后续再单独处理。你可以修改Makefile添加排除逻辑,或者直接在cov-build命令里指定编译目标:cov-build --dir cov-int make exclude_problematic=1也可以用Coverity的配置命令跳过特定文件的分析:
cov-configure --exclude src/problematic_file.cpp
内容的提问来源于stack exchange,提问作者Pavel Kirienko

