C++에서 Clang-Tidy를 활용한 코드 스타일 및 버그 예방

Clang-Tidy는 C++ 개발에서 코드 품질을 향상시키고 버그를 사전에 방지하는 정적 분석 도구입니다. 이는 LLVM 프로젝트의 일부로 개발되었으며, 코드 스타일 준수 여부를 점검하고 잠재적인 성능 및 안전성 문제를 탐지하는 데 활용됩니다.

소프트웨어 개발에서는 코드의 가독성과 유지보수성이 중요한데, Clang-Tidy는 일관된 코드 스타일을 유지하도록 돕는 동시에, 코드 내 숨어있는 오류를 자동으로 감지하여 개발자가 문제를 조기에 해결할 수 있도록 합니다.

본 기사에서는 Clang-Tidy의 개념과 설치 방법, 코드 스타일 점검 및 자동 수정 기능, 성능 최적화 검사 기능, 그리고 프로젝트 및 CI/CD 환경에서의 활용법까지 다룰 것입니다. 이를 통해 C++ 프로젝트에서 Clang-Tidy를 효과적으로 적용하는 방법을 익히고, 코드 품질을 향상시키는 데 도움이 되는 실용적인 팁을 제공할 것입니다.

Clang-Tidy란 무엇인가?

Clang-Tidy는 LLVM/Clang 프로젝트의 일부로 제공되는 정적 분석 도구로, C++ 코드의 스타일 준수 및 잠재적인 버그를 자동으로 탐지하는 역할을 합니다. 이는 코드 스타일 점검, 최적화 추천, 잠재적 오류 탐지, 자동 수정 기능 등을 포함하여 개발자가 더 안정적이고 유지보수하기 쉬운 코드를 작성하도록 돕습니다.

정적 분석이란?

정적 분석(Static Analysis)은 코드 실행 없이 소스 코드를 분석하여 오류, 스타일 위반, 최적화 기회를 찾아내는 기술입니다. Clang-Tidy는 이러한 정적 분석 기법을 사용하여 다양한 C++ 코드 검사를 수행합니다.

Clang-Tidy의 주요 역할

  1. 코드 스타일 점검
  • Google, LLVM, Mozilla, WebKit 등의 스타일 가이드에 맞게 코드를 검사합니다.
  • 코드 일관성을 유지하고 가독성을 향상시킵니다.
  1. 버그 탐지 및 예방
  • 정적 분석을 통해 메모리 오류, Null 포인터 역참조, 사용되지 않는 변수 등 잠재적 버그를 식별합니다.
  • 코드 실행 전 문제를 발견하여 디버깅 비용을 줄일 수 있습니다.
  1. 성능 최적화 추천
  • 비효율적인 코드 패턴을 찾아 성능 개선을 위한 권장 사항을 제시합니다.
  • 예를 들어, 불필요한 복사 연산을 감지하여 std::move 사용을 권장할 수 있습니다.
  1. 자동 수정 기능
  • 일부 검사 항목은 자동으로 수정할 수 있습니다.
  • clang-tidy -fix 옵션을 사용하면 자동으로 코드 스타일을 조정하고 오류를 수정할 수 있습니다.

Clang-Tidy는 코드 리뷰 과정에서 반복되는 스타일 문제를 자동으로 검출하고 해결함으로써, 개발자가 중요한 로직과 구조에 더 집중할 수 있도록 도와줍니다. 다음 장에서는 Clang-Tidy의 설치 및 기본 설정 방법을 알아보겠습니다.

Clang-Tidy 설치 및 기본 설정

Clang-Tidy를 사용하려면 먼저 설치해야 합니다. 대부분의 개발 환경에서 쉽게 설치할 수 있으며, 설정 방법도 간단합니다.

1. Clang-Tidy 설치 방법

Clang-Tidy는 Clang 컴파일러와 함께 배포되므로, LLVM을 설치하면 자동으로 포함됩니다.

(1) Ubuntu 및 Debian 계열
sudo apt update
sudo apt install clang-tidy
(2) macOS (Homebrew 사용)
brew install llvm

설치 후 clang-tidy가 포함된 경로를 설정합니다.

export PATH="/usr/local/opt/llvm/bin:$PATH"
(3) Windows (MSYS2 사용)

MSYS2 환경에서 LLVM을 설치하면 Clang-Tidy도 함께 설치됩니다.

pacman -S mingw-w64-x86_64-clang-tools-extra
(4) Windows (LLVM 공식 패키지 사용)

LLVM 공식 웹사이트에서 Windows용 LLVM 패키지를 다운로드하여 설치할 수 있습니다.

2. Clang-Tidy 기본 실행 방법

Clang-Tidy는 단일 파일 또는 프로젝트 전체에 대해 실행할 수 있습니다.

(1) 단일 파일 분석
clang-tidy myfile.cpp -- -std=c++17

위 명령어는 myfile.cpp 파일에 대해 C++17 표준을 적용하여 Clang-Tidy를 실행합니다.

(2) 프로젝트 전체 분석 (CMake 사용)

CMake 프로젝트에서는 compile_commands.json을 사용하여 Clang-Tidy를 전체 프로젝트에 적용할 수 있습니다.

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .
run-clang-tidy

위 명령어를 실행하면 프로젝트 내 모든 파일에 대해 Clang-Tidy 검사가 수행됩니다.

3. Clang-Tidy 설정 파일 사용 (.clang-tidy)

Clang-Tidy는 프로젝트별로 검사 규칙을 지정하는 .clang-tidy 설정 파일을 사용할 수 있습니다.
다음은 예제 설정 파일입니다.

Checks: >
  -*,
  readability-*,
  modernize-*,
  performance-*,
  bugprone-*
WarningsAsErrors: modernize-use-nullptr
HeaderFilterRegex: 'src/.*'
FormatStyle: llvm

위 설정은

  • readability-*, modernize-*, performance-*, bugprone-* 검사 규칙을 활성화
  • modernize-use-nullptr을 경고가 아닌 오류로 처리
  • src/ 디렉터리의 헤더 파일만 검사 대상으로 지정
  • llvm 스타일로 코드 자동 포맷

Clang-Tidy 설정 파일을 프로젝트 루트 디렉터리에 두면 자동으로 적용됩니다.

4. Clang-Tidy 자동 수정 적용

Clang-Tidy는 코드 수정 권장 사항을 자동으로 적용할 수도 있습니다.

clang-tidy myfile.cpp -fix -- -std=c++17

위 명령어를 실행하면 검사 후 자동으로 스타일 문제 및 버그를 수정합니다.


다음으로, Clang-Tidy가 지원하는 주요 검사 항목을 살펴보겠습니다.

Clang-Tidy의 주요 체크 항목

Clang-Tidy는 다양한 코드 검사 규칙을 제공하며, 이를 통해 코드 스타일 유지, 성능 개선, 버그 예방 등을 수행할 수 있습니다. 검사 규칙은 Checks 옵션을 사용하여 개별적으로 활성화 또는 비활성화할 수 있습니다.

1. 코드 스타일 검사 (readability-*)

코드 스타일을 일관되게 유지하고 가독성을 높이기 위한 검사 규칙입니다.

  • readability-braces-around-statements
  • 조건문이나 반복문에서 중괄호 {} 누락을 감지합니다.
  • 예제
    cpp if (x > 0) // 중괄호가 없음 x--;
  • 자동 수정 후 if (x > 0) { x--; }
  • readability-function-cognitive-complexity
  • 함수가 너무 복잡한지 분석하여 유지보수성을 평가합니다.

2. 모던 C++ 사용 권장 (modernize-*)

C++98/03 코드에서 최신 C++ 표준(C++11 이후) 스타일로 개선할 수 있도록 도와줍니다.

  • modernize-use-nullptr
  • NULL 대신 nullptr 사용을 권장
  • 예제
    cpp int* ptr = NULL;
  • 자동 수정 후 int* ptr = nullptr;
  • modernize-use-auto
  • auto 키워드를 사용하여 코드 간결화
  • 예제
    cpp std::vector<int>::iterator it = vec.begin();
  • 자동 수정 후
    cpp auto it = vec.begin();

3. 성능 최적화 (performance-*)

불필요한 복사, 비효율적인 연산 등을 탐지하여 성능을 개선할 수 있습니다.

  • performance-unnecessary-value-param
  • 함수 인자가 값 복사 대신 const 참조를 사용할 수 있도록 권장
  • 예제
    cpp void foo(std::string str);
  • 자동 수정 후 void foo(const std::string& str);
  • performance-move-const-arg
  • 불필요한 복사 대신 std::move 사용을 추천
  • 예제
    cpp std::string foo() { std::string str = "hello"; return str; }
  • 자동 수정 후
    cpp std::string foo() { std::string str = "hello"; return std::move(str); }

4. 버그 예방 (bugprone-*)

잠재적인 런타임 버그를 방지하고 코드 안정성을 높이는 데 도움이 됩니다.

  • bugprone-dangling-handle
  • 소멸된 객체를 참조하는 코드 탐지
  • 예제 std::string& getString() { std::string str = "hello"; return str; // Dangling reference! }
  • bugprone-narrowing-conversions
  • 정수형 변환 시 데이터 손실 가능성 탐지
  • 예제
    cpp int x = 300; char c = x; // 위험한 변환

5. 헤더 및 네이밍 검사 (misc-*)

  • misc-unused-using-decls
  • 사용되지 않는 using 선언을 감지
  • 예제 using std::vector; // 사용되지 않음 int main() { return 0; }
  • misc-misplaced-const
  • const 키워드의 올바른 사용법을 체크
  • 예제
    cpp int const x = 10; // 권장하지 않음
  • 자동 수정 후
    cpp const int x = 10;

이처럼 Clang-Tidy는 코드 스타일 유지, 최신 C++ 활용, 성능 최적화, 버그 예방 등의 다양한 검사 기능을 제공합니다. 다음으로, Clang-Tidy를 활용하여 코드 스타일을 검사하고 자동 수정하는 방법을 살펴보겠습니다.

코드 스타일 검사 및 자동 수정 적용

Clang-Tidy는 코드 스타일을 분석하고 자동으로 수정하는 기능을 제공합니다. 이를 통해 개발자는 프로젝트 내 코드 스타일을 일관되게 유지할 수 있으며, 반복적인 스타일 수정 작업을 줄일 수 있습니다.

1. 코드 스타일 검사 실행

Clang-Tidy를 사용하여 특정 코드 파일의 스타일을 검사하려면 다음 명령어를 실행합니다.

clang-tidy myfile.cpp -- -std=c++17

위 명령어는 myfile.cpp에 대해 Clang-Tidy를 실행하며, C++17 표준을 적용합니다.

프로젝트 전체의 스타일을 검사하려면 CMake를 사용하여 compile_commands.json을 생성한 후 실행합니다.

run-clang-tidy -header-filter='.*' -checks='readability-*' -fix

이 명령어는 프로젝트 내 모든 파일을 대상으로 코드 스타일을 검사하고 자동 수정을 수행합니다.


2. 자동 수정 적용 (-fix 옵션)

Clang-Tidy는 일부 스타일 문제를 자동으로 수정할 수 있습니다. -fix 옵션을 추가하면 Clang-Tidy가 문제를 발견하고 자동으로 변경합니다.

clang-tidy myfile.cpp -fix -- -std=c++17

이 명령어를 실행하면 코드 스타일 위반 사항이 자동으로 수정됩니다.

예제 1: 자동 중괄호 추가 (readability-braces-around-statements)

Before (수정 전)

if (x > 0)
    x--;

After (자동 수정 후)

if (x > 0) {
    x--;
}

예제 2: NULLnullptr로 변환 (modernize-use-nullptr)

Before (수정 전)

int* ptr = NULL;

After (자동 수정 후)

int* ptr = nullptr;

예제 3: std::move 사용 권장 (performance-move-const-arg)

Before (수정 전)

std::string foo() {
    std::string str = "hello";
    return str;
}

After (자동 수정 후)

std::string foo() {
    std::string str = "hello";
    return std::move(str);
}

3. .clang-tidy 설정 파일을 이용한 코드 스타일 자동 적용

Clang-Tidy는 프로젝트별 설정 파일인 .clang-tidy를 통해 검사 항목을 관리할 수 있습니다.

예제: .clang-tidy 설정 파일
Checks: >
  -*,
  readability-*,
  modernize-*,
  performance-*,
  bugprone-*
WarningsAsErrors: modernize-use-nullptr
HeaderFilterRegex: 'src/.*'
FormatStyle: llvm

위 설정은

  • readability-*, modernize-*, performance-*, bugprone-* 검사 항목을 활성화
  • modernize-use-nullptr를 경고가 아닌 오류로 처리
  • src/ 디렉터리 내 파일만 검사
  • llvm 스타일을 적용

이 설정 파일을 프로젝트 루트에 두면 Clang-Tidy 실행 시 자동으로 적용됩니다.


4. ClangFormat과 Clang-Tidy의 차이

Clang-Tidy는 코드의 스타일, 버그, 최적화까지 포괄적으로 검사하지만, ClangFormat은 코드 포맷팅(들여쓰기, 공백, 괄호 위치 등) 에 집중합니다.

도구주요 기능적용 방식
Clang-Tidy코드 스타일, 성능 최적화, 버그 예방정적 분석, 코드 리팩토링
ClangFormat코드 정렬, 들여쓰기, 괄호 배치코드 포맷 변경

둘을 함께 사용하면 코드 스타일과 품질을 동시에 관리할 수 있습니다.


결론

Clang-Tidy는 코드 스타일 검사 및 자동 수정 기능을 제공하여 일관된 코드 스타일을 유지하고, 개발자의 반복적인 스타일 수정 작업을 줄여줍니다.
다음으로는 Clang-Tidy를 활용한 성능 최적화 검사 방법을 살펴보겠습니다.

Clang-Tidy를 사용한 성능 최적화

Clang-Tidy는 불필요한 복사 연산, 비효율적인 연산자 사용, 메모리 관리 문제 등을 자동으로 분석하여 성능을 최적화하는 데 도움을 줍니다. 특히 performance-* 체크 그룹을 활용하면 성능 관련 문제를 효과적으로 감지하고 개선할 수 있습니다.


1. Clang-Tidy 성능 최적화 검사 실행

다음 명령어를 사용하면 성능 관련 검사 항목을 활성화할 수 있습니다.

clang-tidy myfile.cpp -checks="performance-*" -- -std=c++17

또는 프로젝트 전체에 대해 실행하려면:

run-clang-tidy -header-filter='.*' -checks='performance-*' -fix

이 명령어는 코드의 비효율적인 부분을 감지하고 자동 수정(-fix 옵션 포함 시) 도 적용합니다.


2. 주요 성능 최적화 체크 항목

(1) 불필요한 값 복사 (performance-unnecessary-value-param)

값을 복사하는 대신 const 참조를 사용하여 불필요한 메모리 사용을 줄일 수 있습니다.

Before (수정 전)

void foo(std::string str) {  // 복사가 발생
    std::cout << str;
}

After (자동 수정 후)

void foo(const std::string& str) { // 참조 사용으로 복사 방지
    std::cout << str;
}

(2) 불필요한 복사 연산 (performance-move-const-arg)

std::move를 사용하여 값 복사를 방지하고 이동 연산자를 활용하도록 개선합니다.

Before (수정 전)

std::string createString() {
    std::string str = "hello";
    return str;  // 복사가 발생
}

After (자동 수정 후)

std::string createString() {
    std::string str = "hello";
    return std::move(str);  // 이동 연산 사용
}

(3) 벡터 및 컨테이너 최적화 (performance-for-range-copy)

범위 기반 for문에서 불필요한 복사를 방지하도록 const &를 사용하도록 권장합니다.

Before (수정 전)

std::vector<std::string> vec = {"one", "two", "three"};
for (auto s : vec) {  // 불필요한 복사 발생
    std::cout << s;
}

After (자동 수정 후)

std::vector<std::string> vec = {"one", "two", "three"};
for (const auto& s : vec) {  // 참조 사용하여 복사 방지
    std::cout << s;
}

(4) 불필요한 동적 할당 (performance-inefficient-vector-operation)

동적 할당을 최소화하기 위해 reserve()를 사용하도록 권장합니다.

Before (수정 전)

std::vector<int> vec;
for (int i = 0; i < 100; i++) {
    vec.push_back(i);  // 크기 확장으로 인한 반복적인 할당 발생
}

After (자동 수정 후)

std::vector<int> vec;
vec.reserve(100);  // 미리 크기 예약하여 성능 최적화
for (int i = 0; i < 100; i++) {
    vec.push_back(i);
}

3. .clang-tidy 설정 파일을 이용한 성능 최적화 적용

Clang-Tidy의 성능 최적화 검사를 프로젝트 전반에 걸쳐 적용하려면 .clang-tidy 파일을 설정할 수 있습니다.

예제: .clang-tidy 파일
Checks: >
  -*,
  performance-*,
  readability-*,
  modernize-*,
  bugprone-*
WarningsAsErrors: performance-unnecessary-value-param

위 설정을 적용하면 performance-* 검사 항목이 활성화되며, 값 복사 최적화가 강제 오류(WarningsAsErrors)로 적용됩니다.


결론

Clang-Tidy의 performance-* 체크 그룹을 활용하면 불필요한 복사 연산, 컨테이너 사용 비효율성, 동적 할당 문제 등을 자동으로 감지하고 최적화할 수 있습니다.

다음으로, 실제 프로젝트에서 Clang-Tidy를 적용하는 방법을 살펴보겠습니다.

프로젝트에서 Clang-Tidy 적용하기

Clang-Tidy는 프로젝트 전체에 적용할 수 있으며, CMake, 빌드 시스템, IDE와 통합하여 코드 품질을 유지할 수 있습니다. 여기서는 CMake 프로젝트에서 Clang-Tidy를 설정하는 방법과 효율적인 활용법을 살펴보겠습니다.


1. CMake 프로젝트에서 Clang-Tidy 적용

(1) CMakeLists.txt에 Clang-Tidy 설정 추가

CMake 프로젝트에서 Clang-Tidy를 활성화하려면 CMAKE_CXX_CLANG_TIDY 변수를 설정합니다.

set(CMAKE_CXX_CLANG_TIDY clang-tidy -checks=modernize-*,readability-*)

위 설정은 Clang-Tidy를 빌드 과정에서 자동 실행하며, modernize-*, readability-* 체크를 활성화합니다.

(2) 프로젝트 전체 검사 실행

빌드 디렉터리에서 Clang-Tidy를 실행하여 프로젝트 전체를 검사할 수 있습니다.

run-clang-tidy

또는 특정 파일만 검사하려면:

clang-tidy src/main.cpp -- -Iinclude

2. 기존 프로젝트에서 Clang-Tidy 적용

(1) 기존 코드에 Clang-Tidy 설정 추가

프로젝트 루트에 .clang-tidy 설정 파일을 추가하면 별도 옵션 없이 자동으로 적용됩니다.

(2) 개별 파일에 Clang-Tidy 적용
clang-tidy myfile.cpp -- -std=c++17

특정 규칙만 적용하려면:

clang-tidy myfile.cpp -checks="performance-*,modernize-*"

3. IDE와 Clang-Tidy 통합

(1) Visual Studio
  • Clang Power Tools 확장을 사용하여 Clang-Tidy 지원
  • Project > Properties > Clang-Tidy 설정에서 규칙 적용 가능
(2) CLion
  • File > Settings > Clang-Tidy에서 .clang-tidy 설정을 자동 인식
  • 코드 작성 중 실시간 분석 제공
(3) VS Code
  • C/C++ Extension에서 clang-tidy 활성화
  • c_cpp_properties.jsonclang-tidy 추가

4. Clang-Tidy와 ClangFormat을 함께 사용

Clang-Tidy는 코드 품질 및 성능 검사를 수행하며, ClangFormat은 코드 정렬 및 포맷을 담당합니다.

(1) ClangFormat 적용 예제 (.clang-format)
BasedOnStyle: LLVM
IndentWidth: 4
ColumnLimit: 100

위 설정을 적용하면 자동 정렬 및 가독성 개선이 가능합니다.

(2) Clang-Tidy + ClangFormat 자동 실행
clang-tidy myfile.cpp -fix && clang-format -i myfile.cpp

위 명령어를 실행하면 Clang-Tidy로 코드 검사 및 수정 후 ClangFormat으로 포맷을 정리합니다.


결론

Clang-Tidy를 CMake, IDE와 연동하면 코드 품질 검사를 자동화하고 유지보수를 쉽게 할 수 있습니다.
다음으로, CI/CD 파이프라인에서 Clang-Tidy를 활용하는 방법을 살펴보겠습니다.

Clang-Tidy를 CI/CD 파이프라인에 통합하기

Clang-Tidy는 CI/CD(Continuous Integration / Continuous Deployment) 환경에 통합하여 코드 품질을 자동으로 검사하고, 빌드 단계에서 스타일 위반이나 성능 저하를 방지할 수 있습니다.


1. Clang-Tidy를 CI/CD에 통합하는 이유

자동화된 코드 품질 검사: PR(풀 리퀘스트) 또는 커밋 시 자동으로 코드 스타일 및 버그를 감지
일관된 코드 스타일 유지: 팀원 간의 스타일 차이를 줄이고 코드 품질을 통일
빌드 단계에서 오류 감지: 런타임 전에 잠재적인 버그나 성능 저하 요소를 제거


2. GitHub Actions에서 Clang-Tidy 실행

GitHub Actions에서 Clang-Tidy를 자동 실행하도록 설정할 수 있습니다.

(1) GitHub Actions 워크플로우 파일 생성

.github/workflows/clang-tidy.yml 파일을 만들고 다음 내용을 추가합니다.

name: Clang-Tidy Check

on: [push, pull_request]

jobs:
  clang-tidy:
    runs-on: ubuntu-latest

    steps:
      - name: 코드 체크아웃
        uses: actions/checkout@v3

      - name: LLVM 설치 (Clang-Tidy 포함)
        run: sudo apt install clang-tidy

      - name: CMake 빌드 설정
        run: cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

      - name: Clang-Tidy 실행
        run: run-clang-tidy -header-filter='.*' -checks='modernize-*' -warnings-as-errors='*'
설명
  • on: [push, pull_request] → PR이나 코드 푸시 시 자동 실행
  • apt install clang-tidy → 최신 Clang-Tidy 설치
  • cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON → 프로젝트 빌드 설정
  • run-clang-tidy -checks='modernize-*' → 최신 C++ 스타일 검사 실행

🚀 이 설정을 적용하면 GitHub에 코드를 푸시할 때 자동으로 Clang-Tidy 검사가 수행됩니다.


3. GitLab CI/CD에서 Clang-Tidy 실행

GitLab에서도 CI/CD 파이프라인을 이용하여 Clang-Tidy를 실행할 수 있습니다.

(1) .gitlab-ci.yml 설정 예제
stages:
  - lint

clang-tidy:
  image: gcc:latest
  stage: lint
  script:
    - apt update && apt install -y clang-tidy
    - cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
    - run-clang-tidy -header-filter='.*' -checks='readability-*' -warnings-as-errors='*'

✅ GitHub Actions과 동일하게, 코드 푸시 시 Clang-Tidy 검사가 자동 실행됩니다.


4. Jenkins에서 Clang-Tidy 실행

Jenkins에서 Clang-Tidy를 실행하려면 Pipeline Script를 설정해야 합니다.

(1) Jenkinsfile 설정 예제
pipeline {
    agent any

    stages {
        stage('Checkout') {
            steps {
                git 'https://github.com/yourrepo.git'
            }
        }

        stage('Install Clang-Tidy') {
            steps {
                sh 'sudo apt update && sudo apt install -y clang-tidy'
            }
        }

        stage('Build') {
            steps {
                sh 'cmake -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON'
            }
        }

        stage('Run Clang-Tidy') {
            steps {
                sh 'run-clang-tidy -header-filter=".*" -checks="bugprone-*,performance-*"' 
            }
        }
    }
}

✅ Jenkins에서도 자동으로 Clang-Tidy 검사를 수행할 수 있으며, 빌드 실패 조건을 설정하면 코드 스타일 위반 시 빌드가 중단될 수 있습니다.


5. CI/CD에서 Clang-Tidy 결과 리포트 저장

Clang-Tidy의 검사 결과를 CI/CD 환경에서 로그로 저장하려면 -export-fixes 옵션을 사용할 수 있습니다.

clang-tidy myfile.cpp -export-fixes=fixes.yaml -- -std=c++17

이렇게 하면 fixes.yaml 파일에 자동 수정 가능한 코드 스타일 문제 목록이 저장되며, 이를 PR 리뷰 과정에서 활용할 수 있습니다.


결론

Clang-Tidy를 GitHub Actions, GitLab CI/CD, Jenkins에 통합하면 코드 스타일 검사 및 버그 감지를 자동화할 수 있습니다. 이를 통해 일관된 코드 품질 유지, 코드 리뷰 부담 감소, 안정적인 빌드 환경 구축이 가능합니다.

다음으로, Clang-Tidy의 확장 및 커스텀 검사 규칙 추가 방법을 살펴보겠습니다.

Clang-Tidy의 확장 및 커스텀 검사 규칙 추가

Clang-Tidy는 기본적으로 다양한 코드 스타일 및 최적화 검사 규칙을 제공하지만, 사용자 맞춤형(Custom) 규칙을 추가하여 특정 코드 패턴을 감지하거나 프로젝트별 코딩 스타일을 강제할 수 있습니다.


1. Clang-Tidy의 기본 검사 규칙 확장

Clang-Tidy에서 특정 규칙을 활성화하거나 비활성화하려면 .clang-tidy 설정 파일을 수정할 수 있습니다.

(1) 기본 검사 규칙 추가 (.clang-tidy 설정)
Checks: >
  -*,
  readability-*,
  modernize-*,
  performance-*,
  bugprone-*,
  misc-*
WarningsAsErrors: modernize-use-auto
HeaderFilterRegex: 'src/.*'
  • Checks: > → 특정 체크 그룹을 활성화 (readability-*, modernize-* 등)
  • WarningsAsErrors: modernize-use-autoauto 사용을 강제
  • HeaderFilterRegex: 'src/.*'src/ 디렉토리의 헤더 파일만 검사

🚀 이 설정을 프로젝트 루트에 두면 Clang-Tidy 실행 시 자동 적용됩니다.


2. Clang-Tidy의 커스텀 검사 규칙 추가

Clang-Tidy는 사용자가 직접 검사 규칙을 추가할 수 있습니다. 이를 위해 LLVM 소스를 수정하여 새로운 체크 패스를 등록하는 방식이 일반적입니다.

(1) 새로운 검사 규칙을 추가하는 기본 과정
  1. LLVM 및 Clang 소스 코드 다운로드
   git clone https://github.com/llvm/llvm-project.git
   cd llvm-project
  1. 새로운 체크 규칙 추가 (clang-tools-extra/clang-tidy/mychecks/)
    Clang-Tidy는 clang-tools-extra/clang-tidy/ 내에서 검사 규칙을 관리합니다. 새로운 규칙을 추가하려면 새 디렉터리를 생성합니다.
   mkdir clang-tools-extra/clang-tidy/mychecks
  1. 새로운 체크 클래스 작성 (MyCustomCheck.cpp)
    MyCustomCheck.cpp 파일을 생성하고 다음과 같이 작성합니다.
   #include "MyCustomCheck.h"
   #include "clang/ASTMatchers/ASTMatchFinder.h"

   using namespace clang::ast_matchers;

   namespace clang {
   namespace tidy {
   namespace mychecks {

   void MyCustomCheck::registerMatchers(MatchFinder *Finder) {
       Finder->addMatcher(varDecl().bind("var"), this);
   }

   void MyCustomCheck::check(const MatchFinder::MatchResult &Result) {
       const auto *MatchedDecl = Result.Nodes.getNodeAs<VarDecl>("var");
       if (MatchedDecl && MatchedDecl->getName().startswith("temp")) {
           diag(MatchedDecl->getLocation(), "변수명이 'temp'로 시작하는 것은 권장되지 않습니다.");
       }
   }

   } // namespace mychecks
   } // namespace tidy
   } // namespace clang

이 체크는 ‘temp’로 시작하는 변수명을 감지하여 경고를 발생시킵니다.

  1. CMake에 새로운 체크 등록 (CMakeLists.txt)
   add_clang_tidy_check(mychecks MyCustomCheck)
  1. Clang-Tidy 빌드 및 실행
   cmake -B build
   cmake --build build

이제 Clang-Tidy 실행 시 mychecks-* 규칙이 활성화됩니다.


3. Clang-Tidy의 확장된 사용 사례

코딩 스타일 강제: 특정 변수명 패턴 감지, 함수 네이밍 규칙 검사
보안 규칙 추가: 위험한 API 호출 감지 (strcpy, gets 등)
프로젝트 맞춤 최적화: 특정 연산자 사용 감지 (operator new/delete 차단)

(1) 보안 취약점 탐지 예제
void dangerousFunction() {
    char buffer[256];
    gets(buffer); // 위험한 사용!
}

🚨 gets() 같은 함수는 버퍼 오버플로우 가능성이 높아 금지해야 합니다.
Clang-Tidy에 bugprone-dangerous-function 체크를 추가하여 감지할 수 있습니다.


결론

Clang-Tidy는 .clang-tidy 파일을 활용하여 기본 체크 규칙을 조정할 수 있으며, LLVM 소스를 수정하여 맞춤형 체크 규칙을 추가할 수도 있습니다. 이를 통해 팀별 코딩 스타일 강제, 보안 규칙 추가, 프로젝트 맞춤 최적화가 가능합니다.

다음으로, Clang-Tidy 활용에 대한 최종 요약을 살펴보겠습니다.

요약

Clang-Tidy는 C++ 코드 품질을 유지하고 성능을 최적화하며 버그를 사전에 방지하는 강력한 정적 분석 도구입니다. 본 기사에서는 Clang-Tidy의 개념부터 설치, 주요 기능, 코드 스타일 점검, 성능 최적화, CI/CD 통합, 커스텀 규칙 추가까지 다양한 활용법을 살펴보았습니다.

Clang-Tidy의 주요 기능

  • 코드 스타일 검사 및 자동 수정
  • 성능 최적화 (불필요한 복사 연산 제거, 메모리 관리 개선)
  • 프로젝트 전체 적용 (CMake, IDE 연동)
  • CI/CD 자동화 (GitHub Actions, GitLab CI, Jenkins)
  • 맞춤형 검사 규칙 추가

효과적인 활용법
1️⃣ .clang-tidy 설정 파일을 활용하여 프로젝트 스타일을 강제
2️⃣ -fix 옵션을 사용하여 자동 수정 기능 적용
3️⃣ CI/CD에 통합하여 코드 품질을 지속적으로 유지
4️⃣ 필요에 따라 Clang-Tidy의 기본 체크 규칙을 확장 및 커스터마이징

🚀 Clang-Tidy를 적극 활용하면 코드 리뷰 시간을 줄이고, C++ 프로젝트의 유지보수성을 향상시킬 수 있습니다.

목차