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


가이드에 사용되는 도구 정보를 입력한다.

도구명SonarQube
버전9.9 LTS




개요

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

지원 환경 및 전제 조건

지원 컴파일러

지원 언어 표준

지원 런타임 환경

필수 도구

적절한 도구 선택

분석 모드

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

분석 단계

빌드 래퍼(Build Wrapper) 모드


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


  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




참조 링크