이 문서는 SonarQube에서 C/C++/Objective-C 분석을 위한 정보를 공유하기 위해 작성되었다.
| 도구명 | SonarQube |
|---|---|
| 버전 | 10.6 |
분석 모드
자동 구성(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)
지원되는 언어 표준
- C standards: C89, C99, C11, C17: Fully supported
- C++ standards: C++20, C++23: Supported / C++03, C++11, C++14, C++17: Fully supported
- 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 또는 타사 도구 중 하나를 사용하여 컴파일 데이터베이스를 생성할 수 있어야 한다.
올바른 도구 선택
- Build Wrapper 사용을 권장한다.- Build Wrapper를 사용하는 이유
- Build Wrapper는 분석 전에 빌드를 실행하도록 강제하여 코드를 분석하기 좋은 상태로 만든다.
- 프로젝트 빌드가 환경변수에 의존하는 경우(Build Wrapper에 의해서 캡쳐됨.)
- Sonar에서 지원하고 권장함. - 타사 도구를 사용해야 하는 이유
- Build Wrapper가 빌드 시스템 또는 환경에서 예상대로 작동하지 않는 경우 (예:최신 버전의 XCode)
- Build Wrapper와 달리, 컴파일 데이터베이스를 생성하는데 clean build가 필요하지 않은 타사 도구를 사용하고 싶은 경우
- CI 파이프라인에서 신뢰할 수 있는 컴파일 데이터베이스를 이미 생성하여 사용하고 있는 경우 - Build-Wrapper 사용
- Build Wrapper는 SonarSource에서 개발한 도구로, 컴파일 데이터베이스를 생성하여 빌드 시 빌드 구성을 캡쳐한다.
- Build Wrapper를 사용하여 빌드 명령을 래핑하면 지정된 명령을 실행하고 매크로 정의 및 포함 디렉터리와 같은 C/C++/Objective-C 프로젝트의 올바른 분석에 필요한 모든 구성을 수집한다.
- 빌드에 영향을 주지 않고 단순히 학습한 내용을 모니터링하고 지정된 디렉터리의 파일에 쓴다.
- 해당 버전이 CFamily 분석기 버전과 완벽하게 일치하도록 SonarQube 서버에서 직접 다운로드 해야 한다.
분석 실행
위의 필수 구성 요소를 참조하여 적합한 스캐너의 변형을 선택하고 선택한 스캐너의 실행 방법을 알아본다.
자동 구성(AutoConfig) 모드에서는 추가 단계가 필요하지 않지만 수동 구성(Complication Database) 모드에서는 sonar.cfamily.compile-commands 스캐너 속성을 설정해야 한다.
SonarScanner CLI를 사용하여 분석
컴파일 데이터베이스 모드를 사용하는 경우 compile_commands.json 파일을 생성했는지 확인한다.
1. 프로젝트 루트파일에 sonar-project.properties파일 추가
2. (옵션) 컴파일 데이터베이스 모드로 실행하려면 sonar-project.properties file에 sonar.cfamily.compile-commands 명령어를 추가한다.
3. 프로젝트 루트 디렉터리에서 SonarScanner CLI()를 실행한다.
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 단계를 실행하여 분석을 완료한다.
분석 커스터마이징
언어별 속성
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이 전체 프로젝트를 정확하게 포함하는지 확인하는 것이 좋다. - 두 모드 모두 헤더 파일은 포함된 소스 파일의 컨텍스트에서 분석된다. 즉, 소스 파일에 포함되지 않은 헤더 파일은 분석되지 않는다.
헤더 파일에 대한 측정값
헤더 파일이 컴파일 단위의 일부로 분석될 때마다 이 헤더에 대한 측정값(문, 함수, 클래스, 순환 복잡성 및 인식 복잡성)이 계산된다.
각 측정값은 지정된 헤더에 대해 두 번 이상 계산될 수 있다. 이 경우 각 측정값에 대해 가장 큰 값이 저장된다.