【问题标题】:Use Fortify sourceanalyzer with CMake将 Fortify sourceanalyzer 与 CMake 一起使用
【发布时间】:2016-07-25 12:17:24
【问题描述】:

我有一个由 CMake 生成的 Makefile。在 Makefile 中设置了 CMake 可执行文件的以下路径:

CMAKE_COMMAND = /home/xyz/opt/cmake/cmake-3.1.1/bin/cmake

如何将 Fortify sourceanalyzer 与其集成并运行扫描?

【问题讨论】:

  • 你永远不会编辑生成的 Makefile,但你必须告诉 CMake 使用 sourceanalyzer 作为编译器或类似的东西。
  • 你能告诉我一些关于如何告诉 CMake 使用 sourceanalyzer 作为编译器的背景吗?
  • 我对强化一无所知。使用其他工具,您可以将 C 或 C++ 编译器替换为实际工具。
  • usr1234567 - 请告诉我任何此类工具的名称,我想试试这种方法。

标签: cmake fortify microfocus


【解决方案1】:

我遇到了同样的挑战,但通过运行它解决了它:

  1. sourceanalyzer -b project_ID -clean
  2. 转到您的 build 目录并执行 make clean 或删除包括 Makefile 在内的所有内容
  3. 通过更改 CC 和 CXX 变量运行 cmake: CC="sourceanalyzer -b project_ID gcc" CXX="sourceanalyzer -b project_ID g++" cmake ..
  4. 运行 make 和 fortify 应该在编译器完成工作时翻译文件。
  5. 运行 sourceanalyzer -b project_ID -scan -f results.fpr

希望对你有帮助。

【讨论】:

【解决方案2】:

我的任务是将我们的 CMake 构建系统与 HP Fortify SCA 集成,遇到了这个 Thread,它提供了一些见解,但缺乏与 HP Fortify 相关的细节,所以我想我会分享我的实现。

我在源目录的同一级别创建了一个 fortify_tools 目录。在 fortify_tools 内部是一个工具链文件和 fortify_cc、fortify_cxx 和 fortify_ar 脚本,这些脚本将通过工具链文件设置为 cmake_compilers。

强化_cc

#!/bin/bash

sourceanalyzer -b <PROJECT_ID> gcc  $@

强化_cxx

#!/bin/bash

sourceanalyzer -b <PROJECT_ID> g++ $@

强化_ar

#!/bin/bash

sourceanalyzer -b <PROJECT_ID> ar $@

注意:插入您的项目名称代替 PROJECT_ID

将 cmake 设置为使用脚本是在工具链文件中完成的。

fortify_linux_toolchain.cmake

INCLUDE (CMakeForceCompiler)

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION 1)

#specify the compilers
SET(CMAKE_C_COMPILER ${CMAKE_SOURCE_DIR}/fortify_tools/fortify_cc)
SET(CMAKE_CXX_COMPILER ${CMAKE_SOURCE_DIR}/fortify_tools/fortify_cxx)
SET(CMAKE_AR_COMPILER ${CMAKE_SOURCE_DIR}/fortify_tools/fortify_ar)

使用工具链文件生成 makefile

ccmake -DCMAKE_TOOLCHAIN_FILE=../fortify_tools/foritfy_linux_toolchain.cmake ../

配置并生成您的 makefile 并构建您的项目。

从构建目录中构建项目后,生成一个强化报告

sourceanalyzer -Xmx2400M -debug -verbose -b <PROJECT_ID> -scan -f <PROJECT_ID>.fpr

我知道最后一步在 CMake 之外,但我非常有信心可以创建一个 cmake_custom_command 来执行扫描步骤作为构建后操作。

最后,这只是 linux 实现,但通过创建必要的批处理文件和特定于 Windows 的工具链文件,该概念可以很好地扩展到 Windows

【讨论】:

    【解决方案3】:

    Fortify 不支持 CMake,我收到了 Fortify 支持团队的确认。

    【讨论】:

      【解决方案4】:

      这个答案很晚,但可能会对某人有所帮助。这实际上很容易修复 - 您只需要在 sourceanalyzer 中运行 cmake 即可。制作一个调用 cmake 然后 make 的简单构建脚本,然后使用 sourceanalyzer 代替。我正在使用强化 4.21。

      【讨论】:

        【解决方案5】:

        我们用于构建手工创建的 Makefile 的旧 Fortify 脚本使用的构建命令如下所示:

        $SOURCEANALYZER $MEMORY $LAUNCHERSWITCHES -b $BUILDID make -f Makefile -j12
        

        受其他几个答案的启发,我能够通过将上述行替换为已转换为 CMake 的项目使其工作:

        CC="$SOURCEANALYZER $MEMORY $LAUNCHERSWITCHES -b $BUILDID gcc" \
        CXX="$SOURCEANALYZER $MEMORY $LAUNCHERSWITCHES -b $BUILDID g++" \
        AR="$SOURCEANALYZER $MEMORY $LAUNCHERSWITCHES -b $BUILDID ar" \
        cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug ..
        
        make -f Makefile -j12 VERBOSE=1
        

        这是 Linux 上的 cmake 2.8.12.2。

        【讨论】:

          【解决方案6】:

          以下是我用于示例项目的脚本,用于为 Android JNI C/C++ 代码生成 HP Fortify 报告

          #!/bin/sh
          
          # Configure NDK version and CMake version
          NDK_VERSION=21.0.6113669
          
          CMAKE_VERSION=3.10.2
          CMAKE_VERSION_PATH=$CMAKE_VERSION.4988404
          
          PROJECTID="JNI_EXAMPLE"
          REPORT_NAME=$PROJECTID"_$(date +'%Y%m%d_%H:%M:%S')"
          
          WORKING_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
          BUILD_HOME=${WORKING_DIR}/../hpfortify_build
          FPR="$BUILD_HOME/$REPORT_NAME.fpr"
          
          # Following exports need to be configured according to host machine.
          export ANDROID_SDK_HOME=/Library/Android/sdk
          export ANDROID_CMAKE_HOME=$ANDROID_SDK_HOME/cmake/$CMAKE_VERSION_PATH/bin
          export ANDROID_NDK_HOME=$ANDROID_SDK_HOME/ndk/$NDK_VERSION
          # E.g. JniExample/app/hpfortify/build/CMakeFiles/3.10.2
          export CMAKE_FILES_PATH=${BUILD_HOME}/CMakeFiles/$CMAKE_VERSION
          export HPFORTIFY_HOME="/Applications/Fortify/Fortify_SCA_and_Apps_20.1.0/bin"
          export PATH=$PATH:$ANDROID_SDK_HOME:$ANDROID_NDK_HOME:$ANDROID_CMAKE_HOME:$HPFORTIFY_HOME
          
          echo "[========Start Android JNI C/C++ HP Fortify scanning========]"
          echo "[========Build Dir: $BUILD_HOME========]"
          echo "[========HP Fortify report path: $FPR========]"
          
          function create_build_folder {
              rm -rf $BUILD_HOME
              mkdir $BUILD_HOME
          }
          
          # The standalone cmake build command can be found from below file. 
          # JniExample/app/.cxx/cmake/release/x86/build_command.txt
          # This file is generated after running command 
          # `➜  JniExample git:(master) ✗ ./gradlew :app:externalNativeBuildRelease`
          function configure_cmake_files {
          
              cd $BUILD_HOME
              
              $ANDROID_CMAKE_HOME/cmake -H$BUILD_HOME/. \
                  -DCMAKE_CXX_FLAGS=-std=c++11 -frtti -fexceptions \
                  -DCMAKE_FIND_ROOT_PATH=$BUILD_HOME/.cxx/cmake/release/prefab/x86/prefab \
                  -DCMAKE_BUILD_TYPE=Release \
                  -DCMAKE_TOOLCHAIN_FILE=$ANDROID_SDK_HOME/ndk/$NDK_VERSION/build/cmake/android.toolchain.cmake \
                  -DANDROID_ABI=x86 \
                  -DANDROID_NDK=$ANDROID_SDK_HOME/ndk/$NDK_VERSION \
                  -DANDROID_PLATFORM=android-16 \
                  -DCMAKE_ANDROID_ARCH_ABI=x86 \
                  -DCMAKE_ANDROID_NDK=$ANDROID_SDK_HOME/ndk/$NDK_VERSION \
                  -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
                  -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=$BUILD_HOME/intermediates/cmake/release/obj/x86 \
                  -DCMAKE_MAKE_PROGRAM=$ANDROID_SDK_HOME/cmake/$CMAKE_VERSION_PATH/bin/ninja \
                  -DCMAKE_SYSTEM_NAME=Android \
                  -DCMAKE_SYSTEM_VERSION=16 \
                  -B$BUILD_HOME/.cxx/cmake/release/x86 \
                  -GNinja ..
          }
          
          function build {
              cmake --build .
          }
          
          function cleanup {
              rm -rf $BUILD_HOME/CMakeFiles/native-lib.dir
              rm -rf $FPR
              $HPFORTIFY_HOME/sourceanalyzer -clean
          }
          
          function replace_compiler_paths {
              FORTIFY_TOOLS_PATH="$WORKING_DIR"
              CLANG_PATH="$ANDROID_SDK_HOME/ndk/$NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang"
              CLANGXX_PATH="$ANDROID_SDK_HOME/ndk/$NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++"
              HPFORTIFY_CCPATH="$FORTIFY_TOOLS_PATH/fortify_cc"
              HPFORTIFY_CXXPATH="$FORTIFY_TOOLS_PATH/fortify_cxx"\"
              sed -i '' 's+'$CLANG_PATH'+'$HPFORTIFY_CCPATH'+g' $CMAKE_FILES_PATH/CMakeCCompiler.cmake
              sed -i '' 's+'$CLANG_PATH.*[^")"]'+'$HPFORTIFY_CXXPATH'+g' $CMAKE_FILES_PATH/CMakeCXXCompiler.cmake
          }
          
          function scan {
              $HPFORTIFY_HOME/sourceanalyzer -b $PROJECTID -scan -f $FPR
          
              # copy the file to $WORKING_DIR
              cp $FPR $WORKING_DIR
          }
          
          
          create_build_folder
          
          configure_cmake_files
          
          echo "[========Compile C/C++ using normal compiler ========"]
          build
          
          echo "[========Replace the compiler with HP Fortify analyser wrapper compilers ========"]
          replace_compiler_paths
          
          echo "[========Clean up the build intermediates and the older build ID and fpr file ========"]
          cleanup
          
          echo "[========Recompile C/C++ using HP Fortify analyser wrapper compilers ========"]
          build
          
          echo "[========Scan the compiled files and generate final report ========"]
          scan
          
          echo "[========Change directory to original working dir ========"]
          cd $WORKING_DIR
          

          使用前需要配置下面的变量。就我而言,我使用 NDK 21CMake 3.10.2 并且我的项目 ID 是“JNI_EXAMPLE”

          # Configure NDK version and CMake version
          NDK_VERSION=21.0.6113669
          
          CMAKE_VERSION=3.10.2
          CMAKE_VERSION_PATH=$CMAKE_VERSION.4988404
          
          PROJECTID="JNI_EXAMPLE"
          
          # Following exports need to be configured according to host machine.
          export ANDROID_SDK_HOME=/Library/Android/sdk
          export ANDROID_NDK_HOME=$ANDROID_SDK_HOME/ndk/$NDK_VERSION
          export HPFORTIFY_HOME="/Applications/Fortify/Fortify_SCA_and_Apps_20.1.0/bin"
          
          

          这里有更详细的解释:Using HP Fortify to Scan Android JNI C/C++ Code

          【讨论】:

            【解决方案7】:

            在最新版本的 CMake 上可以使用:

            CMAKE_<LANG>_COMPILER_LAUNCHER='sourceanalyzer;-b;<PROJECT_ID>'
            

            您可以添加其他参数(例如 -Xmx2G),以分号分隔,如 cmake documentation 中所述 您需要检查是否没有将编译器启动器用于 ccache 等其他工具。我们可能可以同时使用两者

            CCACHE_PREFIX='.../sourceanalyzer -b ID'
            

            【讨论】:

              【解决方案8】:

              这是我在 CMake 项目中使用的:

              project(myFortifiedProject LANGUAGES CXX)
              
              set(CMAKE_CXX_COMPILER_LAUNCHER ${FORTIFY_TOOL} -b ${PROJECT_NAME})
              

              所以在运行 cmake 时(假设 sourceanalyzer 在路径上):

              cmake <other args> -DFORTIFY_TOOL=sourceanalyzer
              

              所以正常的构建命令有效:

              make myFortifiedProject
              

              您最终可以通过以下方式收集结果:

              sourceanalyzer -b myFortifiedProject -scan
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-04-08
                • 2019-01-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-07-17
                • 2019-02-01
                相关资源
                最近更新 更多