使用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选项,对此我有两个疑问:
- 是否可在CMake和C++项目中使用
-exclude选项? - 若可以,有没有比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

