이 문서는 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) 모드
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
- Linux:
- 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
- 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
- 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) 모드
- Compilation Database 생성
CMake를 사용하는 경우, 다음 명령어를 실행하여compile_commands.json
파일을 생성합니다:cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
- 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>
- SonarScanner 실행
sonar-scanner
주의 사항
- 분석 환경과 빌드 환경 일치
분석 환경이 빌드 환경과 동일해야 합니다.
- 예를 들어, Microsoft Visual C++ 컴파일러를 사용하는 경우, 동일한 Visual Studio Developer Command Prompt에서 빌드 및 분석을 수행해야 환경 변수(
INCLUDE
,LIB
등)가 올바르게 설정됩니다.
- 예를 들어, Microsoft Visual C++ 컴파일러를 사용하는 경우, 동일한 Visual Studio Developer Command Prompt에서 빌드 및 분석을 수행해야 환경 변수(
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