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의 주요 역할
- 코드 스타일 점검
- Google, LLVM, Mozilla, WebKit 등의 스타일 가이드에 맞게 코드를 검사합니다.
- 코드 일관성을 유지하고 가독성을 향상시킵니다.
- 버그 탐지 및 예방
- 정적 분석을 통해 메모리 오류, Null 포인터 역참조, 사용되지 않는 변수 등 잠재적 버그를 식별합니다.
- 코드 실행 전 문제를 발견하여 디버깅 비용을 줄일 수 있습니다.
- 성능 최적화 추천
- 비효율적인 코드 패턴을 찾아 성능 개선을 위한 권장 사항을 제시합니다.
- 예를 들어, 불필요한 복사 연산을 감지하여
std::move
사용을 권장할 수 있습니다.
- 자동 수정 기능
- 일부 검사 항목은 자동으로 수정할 수 있습니다.
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 패키지를 다운로드하여 설치할 수 있습니다.
- LLVM 공식 다운로드
설치 후clang-tidy.exe
가bin
폴더 내에 위치합니다.
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: NULL
을 nullptr
로 변환 (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.json
에clang-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-auto
→auto
사용을 강제HeaderFilterRegex: 'src/.*'
→src/
디렉토리의 헤더 파일만 검사
🚀 이 설정을 프로젝트 루트에 두면 Clang-Tidy 실행 시 자동 적용됩니다.
2. Clang-Tidy의 커스텀 검사 규칙 추가
Clang-Tidy는 사용자가 직접 검사 규칙을 추가할 수 있습니다. 이를 위해 LLVM 소스를 수정하여 새로운 체크 패스를 등록하는 방식이 일반적입니다.
(1) 새로운 검사 규칙을 추가하는 기본 과정
- LLVM 및 Clang 소스 코드 다운로드
git clone https://github.com/llvm/llvm-project.git
cd llvm-project
- 새로운 체크 규칙 추가 (
clang-tools-extra/clang-tidy/mychecks/
)
Clang-Tidy는clang-tools-extra/clang-tidy/
내에서 검사 규칙을 관리합니다. 새로운 규칙을 추가하려면 새 디렉터리를 생성합니다.
mkdir clang-tools-extra/clang-tidy/mychecks
- 새로운 체크 클래스 작성 (
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’로 시작하는 변수명을 감지하여 경고를 발생시킵니다.
- CMake에 새로운 체크 등록 (
CMakeLists.txt
)
add_clang_tidy_check(mychecks MyCustomCheck)
- 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++ 프로젝트의 유지보수성을 향상시킬 수 있습니다.