이 문서는 SonarQube 9.9 LTS 버전에서 C/C++/Objective-C 분석에 대한 내용을 공유하기 위해 작성되었다.


도구명SonarQube
버전9.9 LTS




개요

SonarQube는 Developer버전 이상부터 C, C++, Objective-C 분석 기능을 제공하며, 이를 통해 코드 품질 및 보안 취약점을 관리할 수 있습니다.

지원 환경 및 전제 조건

지원 컴파일러

  • Clang, GCC, Microsoft C/C++ 컴파일러
  • Intel, ARM5/6, IAR, QNX, Texas Instruments, Microchip MPLAB, Wind River Diab 등의 컴파일러
  • GCC 기반 컴파일러(Linaro 포함)

지원 언어 표준

  • C: C89, C99, C11, C17
  • C++: C++03, C++11, C++14, C++17, C++20
  • GNU extensions

지원 런타임 환경

  • Windows (x86-64)
  • Linux (x86-64 및 ARM64)
  • macOS (10.14.3 이상, x86-64 및 Apple Silicon)

필수 도구

  • SonarScanner CLI
  • Build Wrapper 또는 Compilation Database

적절한 도구 선택

  • Build Wrapper를 사용해야 하는 경우
    • 분석 전에 클린 빌드를 강제하여, 분석 대상 코드가 컴파일 가능하고 구성 파일이 최신 상태임을 보장하고자 할 때
    • 빌드 과정에서 사용하는 환경 변수를 캡처하여 분석에 반영해야 할 때.
  • Compilation Database를 사용해야 하는 경우
    • Build Wrapper가 지원하지 않는 빌드 시스템을 사용하는 경우.
    • 클린 빌드를 수행하지 않고 기존의 빌드 상태에서 분석하고자 할 때.
    • 특정 하드웨어와 OS 환경에서:
      • Apple Silicon 하드웨어(macOS, ARM 아키텍처).
      • macOS >= 13 (Intel 하드웨어, x86-64 아키텍처).

분석 모드

빌드 래퍼(Build wrapper), 컴파일 데이터베이스(Compilation Database) 두 가지 방법의 분석을 지원합니다.

  • Build Wrapper
    Build Wrapper는 SonarSource에서 개발한 도구로, 빌드 시점에서 빌드 구성 정보를 JSON 파일로 수집합니다.
    이 도구는 C/C++/Objective-C 프로젝트의 올바른 분석을 위해 필요한 매크로 정의, include 디렉토리 등의 정보를 캡처합니다.
    Build Wrapper는 빌드 과정에 영향을 주지 않으며, 단순히 정보를 수집하여 지정된 디렉토리에 기록합니다.
  • Compilation Database
    Compilation Database는 LLVM 프로젝트에서 도입한 JSON 형식의 파일로, 프로젝트 빌드에 사용된 컴파일 명령어를 포함합니다.
    CMake, Ninja 등의 빌드 도구를 사용해 쉽게 생성할 수 있습니다.

분석 단계

빌드 래퍼(Build Wrapper) 모드


  1. Build Wrapper 설치
    SonarQube 서버에서 Build Wrapper를 다운로드합니다.

    • Linux: <SonarQube_URL>/static/cpp/build-wrapper-linux-x86.zip
    • macOS: <SonarQube_URL>/static/cpp/build-wrapper-macosx-x86.zip
    • Windows: <SonarQube_URL>/static/cpp/build-wrapper-win-x86.zip


  2. Build Wrapper로 클린 빌드 실행
    // example for linux
    build-wrapper-linux-x86-64 --out-dir build_wrapper_output_directory make clean all
    // example for macOS
    build-wrapper-macosx-x86 --out-dir build_wrapper_output_directory xcodebuild clean build
    // example for Windows
    build-wrapper-win-x86-64.exe --out-dir  build_wrapper_output_directory MSBuild.exe /t:Rebuild /nodeReuse:False
  3. SonarScanner 설정
    sonar-project.properties 파일을 설정하고 sonar.cfamily.build-wrapper-output 속성을 추가한다.
    sonar.projectKey=myFirstProject
    sonar.projectName=My First C++ Project
    sonar.projectVersion=1.0
    sonar.sources=src
    sonar.cfamily.build-wrapper-output=build_wrapper_output_directory
    sonar.sourceEncoding=UTF-8
    sonar.host.url=YourSonarQubeURL

  4. SonarScanner 실행
    sonar-scanner


주의 사항

  • 파일 경로 접근: Build Wrapper는 빌드 중 수집한 절대 경로를 분석에 사용하므로, 빌드와 분석이 동일한 호스트에서 실행되어야 합니다.
    예를 들어, Docker 컨테이너에서 SonarScanner CLI 이미지를 사용할 경우 Build Wrapper는 지원되지 않습니다.

  • 보안 문제: build-wrapper-dump.json 파일에는 환경 정보가 포함되어 있어 보안상의 주의가 필요합니다.
    로그 파일(build-wrapper.log)은 분석에 필요하지 않으므로 필요 시 삭제 가능합니다.

  • Bazel: Continuous Build 환경에서는 --batch 옵션을 사용하고, Bazel의 "sandbox" 메커니즘을 비활성화해야 합니다.
    예제 명령어(macOS):

    build-wrapper-macosx-x86 --out-dir bw bazel
      --batch
      build
      --spawn_strategy=local
      --strategy=Genrule=local
      --bazelrc=/dev/null
      //main:hello-world
  • MSBuild: MSBuild는 기존의 빌드 노드를 재사용할 수 있습니다. 이 경우 Build Wrapper가 일부 노드를 모니터링하지 못할 수 있으므로 nodeReuse:False 옵션을 추가해야 합니다.


컴파일 데이터베이스(Compilation Database) 모드


  1.  Compilation Database 생성
    CMake를 사용하는 경우, 다음 명령어를 실행하여 compile_commands.json 파일을 생성합니다:
    cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..

  2. SonarScanner 설정
    sonar-project.properties 파일을 설정하고 sonar.cfamily.compile-commands 속성을 추가한다.
    sonar.projectKey=myFirstProject
    sonar.projectName=My First C++ Project
    sonar.projectVersion=1.0
    sonar.sources=src
    sonar.cfamily.compile-commands=compile_commands.json
    sonar.sourceEncoding=UTF-8
    sonar.host.url=<Your_SonarQube_URL>
  3. SonarScanner 실행
    sonar-scanner
    
    


주의 사항

  • 분석 환경과 빌드 환경 일치 

    분석 환경이 빌드 환경과 동일해야 합니다.

    • 예를 들어, Microsoft Visual C++ 컴파일러를 사용하는 경우, 동일한 Visual Studio Developer Command Prompt에서 빌드 및 분석을 수행해야 환경 변수(INCLUDE, LIB 등)가 올바르게 설정됩니다.
  • Compilation Database 파일 확인
    사용 중인 도구가 정확한 컴파일 명령을 포함한 compile_commands.json 파일을 생성했는지 확인해야 합니다.

    • 생성된 파일의 명령어를 검토하고, 하나 이상의 명령어를 실행하여 정상적으로 빌드가 수행되는지 테스트하는 것이 좋습니다.


C#과 C++ 혼합 솔루션 분석

C++와 C#이 혼합된 Visual Studio 솔루션을 분석하려면, Build Wrapper와 SonarScanner for MSBuild를 함께 사용해야 합니다.
SonarScanner for MSBuild는 sonar-project.properties 파일을 지원하지 않으므로, Build Wrapper 출력 디렉토리를 MSBuild begin 단계에서 설정해야 합니다.

예:

SonarScanner.MSBuild.exe begin /k:"cs-and-cpp-project-key" /n:"My C# and C++ project" /v:"1.0" /d:sonar.cfamily.build-wrapper-output="build_wrapper_output_directory"
build-wrapper-win-x86-64.exe --out-dir build_wrapper_output_directory MSBuild.exe /t:Rebuild /nodeReuse:False
SonarScanner.MSBuild.exe end




참조 링크

  • 레이블 없음