Используйте исходный анализатор Fortify с CMake

У меня есть Makefile, сгенерированный CMake. В Makefile указан следующий путь к исполняемому файлу CMake:

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

Как я могу интегрировать с ним Fortify sourceanalyzer и запускать сканирование?


person user2361273    schedule 05.04.2016    source источник
comment
Вы никогда не редактируете сгенерированный Makefile, но вы должны указать CMake использовать sourceanalyzer в качестве компилятора или подобного.   -  person usr1234567    schedule 05.04.2016
comment
Можете ли вы предоставить мне некоторые сведения о том, как сказать CMake использовать исходный анализатор в качестве компилятора?   -  person user2361273    schedule 05.04.2016
comment
Я ничего не знаю о фортификации. С другими инструментами вы заменяете компилятор C или C++ реальным инструментом.   -  person usr1234567    schedule 05.04.2016
comment
stackoverflow.com/questions/19050461 /   -  person user3159253    schedule 05.04.2016
comment
usr1234567 - не могли бы вы сказать мне название любого такого инструмента, я хочу попробовать этот подход.   -  person user2361273    schedule 06.04.2016


Ответы (7)


У меня была такая же проблема, но я решил ее, запустив ее следующим образом:

  1. sourceanalyzer -b ID_проекта -clean
  2. Перейдите в каталог build и выполните make clean или удалите все содержимое, включая Makefile.
  3. Запустите cmake, изменив переменные CC и CXX: 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

Надеюсь, поможет.

person Stan    schedule 13.04.2016
comment
Привет, Стэн, спасибо за ответ, но CMake работает по-другому, и мы не можем установить значения CC и CXX. См. следующую страницу: stackoverflow.com/questions/34906024/ - person user2361273; 25.04.2016

Мне было поручено интегрировать нашу систему сборки 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++ $@

укрепить_ар

#!/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)

Чтобы сгенерировать make-файлы с помощью файла набора инструментов

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

настройте и сгенерируйте make-файлы и создайте свой проект.

После сборки проекта из каталога сборки сгенерируйте отчет об укреплении,

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

Я понимаю, что последний шаг находится за пределами CMake, но я вполне уверен, что можно создать cmake_custom_command для выполнения шага сканирования в качестве действия после сборки.

Наконец, это просто реализация Linux, но концепция хорошо масштабируется для Windows за счет создания необходимых пакетных файлов и файла набора инструментов для Windows.

person dafew    schedule 25.05.2016

Fortify не поддерживает CMake, я получил подтверждение от службы поддержки Fortify.

person user2361273    schedule 28.04.2016

Этот ответ запоздал, но может кому-то помочь. На самом деле это легко исправить — вам просто нужно запустить cmake внутри sourceanalyzer. Создайте простой скрипт сборки, который вызывает cmake, а затем make, и вместо этого используйте для этого sourceanalyzer. Я использую фортифай 4.21.

person AvH    schedule 14.09.2016

Наш старый скрипт Fortify для сборки созданных вручную файлов Makefile использовал команду сборки, которая выглядела следующим образом:

$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

Это с cmake 2.8.12.2 в Linux.

person HunterZ    schedule 11.03.2019

Ниже приведен сценарий, который я использую в своем примерном проекте для создания отчета HP Fortify для Android JNI C/C++ Code.

#!/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

Необходимо настроить ниже vars перед его использованием. В моем случае я использую NDK 21 и CMake 3.10.2, а идентификатор моего проекта — 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"

Вот более подробное объяснение: Использование HP Fortify для сканирования кода Android JNI C/C++

person shizhen    schedule 09.09.2020

В последней версии CMake можно использовать:

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

Вы можете добавить другие аргументы (например, -Xmx2G), разделенные точкой с запятой, как указано в документация cmake Вам необходимо проверить, не используете ли вы средство запуска компилятора для другого инструмента, такого как ccache. Мы, вероятно, можем использовать оба с

CCACHE_PREFIX='.../sourceanalyzer -b ID'
person Nicolas Schweitzer    schedule 28.11.2020