버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.



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


Section

도구명SonarQube
버전109.69 LTS


목차

분석 모드

자동 구성(AutoConfig) 또는 수동 구성(Compilation Database) 모드로 분석을 수행할 수 있다.

자동 구성은 기본적으로 활성화되어 있고, 수동 구성은 SonarScanner에 compile_commands.json을 제공하여 활성화할 수 있다.

  • 자동 구성을 사용하는 경우
     - 프로젝트가 수동 구성 모드의 필수 구성 요소에 충족하지 않는 경우
     - 프로젝트의 CFamily 코드 비율이 낮은 경우
     - 인적 자원 할당 없이 신속한 분석이 필요한 경우
  • 수동 구성을 사용하는 경우 
     - 최고의 CFamily 분석 품질을 원하는 경우 (자동 구성 시, 드문 경우지만 일부 이슈가 누락될 수 있다.)
     - 특정 빌드 변형 또는 다양한 코드 변형 분석이 필요한 경우
     - Objective-C 코드가 있는 프로젝트의 경우 (Object-C분석은 자동 구성 모드에서 지원되지 않는다.)

...

지원되는 SonarQube 에디션 

  • 개발자 에디션 이상

지원되는 런타임 환경

  •  x86-64의 Microsoft Windows
  • Linux on x86-64 or ARM64
  • macOS 버전 10.14.3 이상(x86-64 또는 Apple Silicon)

지원되는 언어 표준


...

개요

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 포함)

지원 언어 표준

  • CC standards: C89, C99, C11, C17: Fully supported
  • C++ standards: C++2003, C++23: Supported / 11, C++03,  C++1114, C++1417, C++17: Fully supported20
  • GNU extensions

SonarScanner

  • CFamily 및 .Net 코드가 혼합된 프로젝트 →  SonarScanner for .NET
  • CFamily 및 Java 코드가 혼합된 Maven 프로젝트 →  SonarScanner for Maven
  • CFamily 및 Java 코드가 혼합된 Gradle 프로젝트 →  SonarScanner for Gradle
  • 위에 해당하지 않는 프로젝트 →  기본 SonarScanner CLI

컴파일 데이터베이스 모드에 대한 추가 필수 구성 요소

지원되는 컴파일러

 - 모든 버전의 Clang, clang-cl, GCC 및 Microsoft C/C++ 컴파일러
 - Linux 및 macOS용 인텔 컴파일러의 모든 버전
 - ARM5 및 ARM6 컴파일러
 - ARM, Atmel AVR32, Atmel AVR, Renesas H8, Renesas RL78, Renesas RX, Renesas V850, Texas Instruments MSP430 및 8051용 IAR 컴파일러
 - QNX 컴파일러
 - ARM, C2000, C6000, C7000, MSP430 및 PRU용 Texas Instruments 컴파일러
 - Wind River Diab 및 GCC 컴파일러
 - Microchip MPLAB XC8, XC16 및 XC32 컴파일러
 - Linaro GCC를 포함하여 GCC를 기반으로 하는 컴파일러

컴파일 데이터베이스 생성

컴파일 데이터베이스 모드에서 분석하려면 SonarSource Build Wrapper 또는 타사 도구 중 하나를 사용하여 컴파일 데이터베이스를 생성할 수 있어야 한다.

...

올바른 도구 선택

...

지원 런타임 환경

  • 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>

...

iconfalse
titleBuild Wrapper 다운로드 및 실행

1. 특정 인스턴스 URL을 아래 <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의 압축을 풀고 PATH 경로를 구성한다.

3. Build Wrapper를 일반적인 clean build 명령의 prefix로 실행한다. clean build 명령은 항상 프로젝트를 처음부터 빌드해야한다.
   빌드가 끝나면 지정된 출력 디렉터리에 compile_commands.json 파일이 생성되어야 한다. 이 파일에는 빌드 명령으로 빌드된 컴파일 단위에 대한 정보가 포함되어 있다.

small blue diamond make, xcodebuild, MSBuild를 사용하여 빌드하는 예제

...


  1. Build Wrapper로 클린 빌드 실행
    코드 블럭
    // example for linux
    build-wrapper-linux-x86-64 --out-dir build_wrapper_output_directory make clean

...

  1.  all
    // example for macOS
    build-wrapper-macosx-x86 --out-dir build_wrapper_output_directory xcodebuild clean

...

  1.  build
    // example for Windows
    build-wrapper-win-x86-64.exe --out-dir  build_wrapper_output_directory MSBuild.exe /t:Rebuild /nodeReuse:False

분석 실행

위의 필수 구성 요소를 참조하여 적합한 스캐너의 변형을 선택하고 선택한 스캐너의 실행 방법을 알아본다.

...

  1. SonarScanner 설정
    sonar-project.properties 파일을 설정하고 sonar.cfamily.

...

SonarScanner CLI를 사용하여 분석

컴파일 데이터베이스 모드를 사용하는 경우 compile_commands.json 파일을 생성했는지 확인한다.

1. 프로젝트 루트파일에 sonar-project.properties파일 추가

...

iconfalse
  1. build-wrapper-output 속성을 추가한다.
    코드 블럭
    sonar.projectKey=myFirstProject

...

  1. 
    sonar.projectName=My First C++ Project

...

  1. 
    sonar.projectVersion=1.0

...

  1. 
    sonar.sources=src

...

  1. 
    sonar.cfamily.build-wrapper-output=build_wrapper_output_directory
    sonar.sourceEncoding=UTF-8

...

  1. 
    sonar.host.url=

...

  1. YourSonarQubeURL

  2. SonarScanner 실행
    코드 블럭
    sonar-scanner
참고사항
title 주의 사항
  • 파일 경로 접근: 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 설정

...

  1. sonar-project.properties

...

  1. 파일을 설정하고 sonar.cfamily.compile-commands

...

  1.  속성을 추가한다.

...

iconfalse
  1. 코드 블럭
    sonar.projectKey=myFirstProject
    sonar.projectName=My First C++ Project
    sonar.projectVersion=1.0
    sonar.sources=src
    sonar.cfamily.compile-commands=compile_commands.json

...

  1. 
    sonar.sourceEncoding=UTF-8
    sonar.host.url=<Your_SonarQube_URL>
  2. SonarScanner 실행
    코드 블럭
    sonar-scanner
    
    


참고사항
title 주의 사항
  • 분석 환경과 빌드 환경 일치 

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

    • 예를 들어, 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 

3. 프로젝트 루트 디렉터리에서 SonarScanner CLI()를 실행한다.

정보
iconfalse

sonar-scanner

4. 분석이 끝날 때 제공된 링크를 따라 UI에서 프로젝트의 품질 메트릭을 확인한다.

SonarScanner for .NET을 사용하여 분석

다음은 Build Wrapper와 함께 컴파일 데이터베이스 모드에서 C++와 C#을 혼합하여 사용하는 솔루션을 분석하는 예제이다.

SonnarScanner for .NET은 sonar-project.properties파일을 처리하지 않으므로, Build Wrapper 출력 디렉토리는 .NET begin 단계 중에 반드시 설정해야 한다.

여기서 공유 폴더에 저장된 소스 코드 중 Visual Studio에서 "프로젝트(Project)"로 간주되지 않는 것들은 스캔되지 않는다.

1. SonarScanner for .NET 및 Build Wrapper를 다운로드 하여 설치한다.(필수 구성 요소 참조)

2. Build Wrapper 출력 변수와 같이 SonarScanner for .NET begin 단계를 실행 한다.

3. 일반 .NET build 명령에 Build Wrapper 실행을 추가한다.

4. SonarScanner for .NET end 단계를 실행하여 분석을 완료한다.

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


SonarScanner.MSBuild.exe end

분석 커스터마이징

언어별 속성

Administration > General Settings > Languages > C/C++/Objective-C에서  C/C++/Objective-C의 특정 속성을 찾아서 업데이트할 수 있다.

테스트 파일 분석

sonar.tests 스캐너 속성은 테스트 소스 파일이 포함된 디렉터리를 정확히 찾아내는 데 사용된다.이를 통해 분석기가 규칙을 알맞게 조정하는데 도움이 된다.

현재 CFamily 분석기는 기본 소스 파일과 테스트 소스 파일을 동일하게 처리한다. sonar.tests 속성은 현재 지원되지 않으며 분석기에서 무시된다.

품질 프로필

  • SonarQube에서 지원하는 다른 모든 언어와 마찬가지로 C, C++ 및 Objective-C는 "Sonar way" 프로필과 함께 제공됩니다. 이 프로필은 대부분의 프로젝트에 적합하도록 설계된 Sonar의 권장 로필이다.
  • 또한 C++를 위한 "Mission critical" 품질 프로필을 지원한다. 중요 업무용 소프트웨어에 대한 최신 C++ 개발(C++17 이상)에 권장된다.
    MISRA C++ 2023을 기반으로 하며 코드 안전성을 높이기 위해 코드에 대한 더 많은 제약 조건을 교환한다.

분석 이해하기

분석 범위

CFamily 분석 범위는 sonar.c.file.suffixes, sonar.cpp.file.suffixes, sonar.objc.file.suffixes 같은 SonarScanner 속성을 사용하여 지정된 파일 확장자로 정의되는 일반 범위의 하위 집합이다.

최종적으로 분석되는 파일은 선택한 분석 모드에 따라 달라진다.

  • 자동 구성 모드에서는 CFamily 분석 범위 내의 헤더가 아닌 모든 원본 파일이 개별적으로 분석된다.  따라서 sonar.sources 속성을 설정하여 타사 코드 분석을 방지한다.
  • 컴파일 데이터베이스 모드에서 분석된 파일은 CFamily 분석 범위와 compile_commands.json안의 'file' 항목의 교집합을 나타낸다.
    이는 CFamily 범위 내에서 컴파일된 파일만 분석되므로 compile_commands.json이 전체 프로젝트를 정확하게 포함하는지 확인하는 것이 좋다.
  • 두 모드 모두 헤더 파일은 포함된 소스 파일의 컨텍스트에서 분석된다. 즉, 소스 파일에 포함되지 않은 헤더 파일은 분석되지 않는다.

헤더 파일에 대한 측정값

헤더 파일이 컴파일 단위의 일부로 분석될 때마다 이 헤더에 대한 측정값(문, 함수, 클래스, 순환 복잡성 및 인식 복잡성)이 계산된다.
각 측정값은 지정된 헤더에 대해 두 번 이상 계산될 수 있다. 이 경우 각 측정값에 대해 가장 큰 값이 저장된다.

참조 링크



...

참조 링크

...