You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Fortify SCA结合CMake与C++时如何排除文件/目录?

Fortify SCA结合CMake构建C++项目的问题与解决

背景

在Unix环境下基于CMake构建C++项目时,我通过bash执行以下命令集成Fortify SCA:

CC="sourceanalyzer -fcontainer -Xmx1G -b test-project -exclude \\\\"/usr/include\\\\" -verbose gcc" CXX="sourceanalyzer -fcontainer -Xmx1G -b test-project -exclude \\\\"/usr/include\\\\" -verbose g++" cmake ..
make
sourceanalyzer -fcontainer -Xmx1G -b "test-project" -verbose -scan -f results.fpr

添加大量反斜杠是为了让双引号正确传递到sourceanalyzer,生成的CMake配置文件显示参数已正确传递:

$ cat CMakeFiles/3.24.2/CMakeCXXCompiler.cmake
set(CMAKE_CXX_COMPILER "/sca/bin/sourceanalyzer")
set(CMAKE_CXX_COMPILER_ARG1 " -fcontainer -Xmx1G -b test-project -exclude \"/usr/include\" -verbose g++")

尝试过不带反斜杠的命令,效果相同。按资料要求给排除路径加了引号(后续要使用通配符),但扫描后仍在/usr/include中发现大量问题。查阅Fortify文档得知,与编译器或构建工具集成时,SCA会翻译所有编译器处理的文件,即使指定了-exclude选项,对此我有两个疑问:

  1. 是否可在CMake和C++项目中使用-exclude选项?
  2. 若可以,有没有比7个反斜杠更简洁的转义方式?

问题1:是否可在CMake和C++项目中使用-exclude选项?

可以使用,但直接通过CC/CXX环境变量在编译阶段传递-exclude参数的方式不生效。

原因是当sourceanalyzer作为编译器包装器与CMake集成时,它会追踪编译器处理的所有文件(包括系统头文件),编译阶段的-exclude参数无法过滤这些文件。正确做法是在扫描阶段(执行sourceanalyzer -scan时)添加-exclude参数:

sourceanalyzer -fcontainer -Xmx1G -b "test-project" -verbose -exclude "/usr/include/**" -scan -f results.fpr

使用通配符**匹配/usr/include下所有子文件和目录,能彻底排除系统头文件的扫描。此外,也可通过Fortify配置文件(如fortify-sca.properties)设置全局排除规则,避免重复输入命令行参数。


问题2:有没有比7个反斜杠更简洁的转义方式?

有两种更简洁的写法,可避免bash中复杂的转义:

方式1:用单引号包裹CC/CXX变量值

bash中单引号内的内容会被原样解析,无需转义双引号:

CC='sourceanalyzer -fcontainer -Xmx1G -b test-project -exclude "/usr/include" -verbose gcc' CXX='sourceanalyzer -fcontainer -Xmx1G -b test-project -exclude "/usr/include" -verbose g++' cmake ..

这种方式下双引号会直接传递给sourceanalyzer,CMake生成的配置文件会正确保留-exclude "/usr/include"的格式。

方式2:在CMakeLists.txt中直接配置编译器参数

跳过环境变量传递,直接在CMake配置文件中设置:

set(CMAKE_C_COMPILER "sourceanalyzer")
set(CMAKE_C_COMPILER_ARG1 "-fcontainer -Xmx1G -b test-project -exclude \"/usr/include\" -verbose gcc")

set(CMAKE_CXX_COMPILER "sourceanalyzer")
set(CMAKE_CXX_COMPILER_ARG1 "-fcontainer -Xmx1G -b test-project -exclude \"/usr/include\" -verbose g++")

这种方式完全避免了bash中的转义问题,参数配置更直观。


内容的提问来源于stack exchange,提问作者autonomy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:42:22