Cursor에서 C++ 품질 게이트 설정: 3가지 자동화 검사

C++ 개발에는 엄격한 품질 관리가 필요합니다. 이 가이드는 Cursor에서 매번 커밋 전에 실행되는 3가지 자동화 검사를 설정하는 방법을 보여줍니다: 타겟 빌드, 살균제 빌드 및 cppcheck를 사용한 정적 분석입니다. Git pre-push 후크와 결합하여 이러한 검사는 코드가 항상 프로덕션 준비가 되어 있음을 보장합니다.
3가지 검사
검사 1: 타겟 빌드
배포 환경과 동일한 설정으로 코드를 컴파일합니다.
검사 2: 살균제 빌드
AddressSanitizer(ASan) 및 UndefinedBehaviorSanitizer(UBSan)을 실행하여 메모리 오류와 정의되지 않은 동작을 포착합니다.
검사 3: 정적 분석
cppcheck를 사용하여 코드를 실행하지 않고 버그, 스타일 위반 및 잠재적 문제를 찾습니다.
전제 조건
필요한 도구를 설치합니다:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y build-essential cmake cppcheck
# macOS
brew install cmake cppcheck
# Windows(MSYS2 또는 WSL을 통해)
pacman -S mingw-w64-x86_64-cmake mingw-w64-x86_64-cppcheck
프로젝트 구조
my-cpp-project/
├── src/
│ ├── main.cpp
│ └── utils.cpp
├── include/
│ └── utils.h
├── tests/
│ └── test_main.cpp
├── CMakeLists.txt
├── .cursor/
│ └── quality-gate.sh
└── .git/hooks/
└── pre-push
1단계: CMake 구성
빌드 프로필이 포함된 CMakeLists.txt를 생성합니다:
cmake_minimum_required(VERSION 3.14)
project(MyProject CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 소스 파일
add_executable(myapp
src/main.cpp
src/utils.cpp
)
target_include_directories(myapp PRIVATE include)
# 타겟 빌드 프로필(프로덕션 유사)
add_library(target_profile INTERFACE)
target_compile_options(target_profile INTERFACE
-O2
-DNDEBUG
-Wall
-Wextra
-Werror
)
# 살균제 빌드 프로필
add_library(sanitizer_profile INTERFACE)
target_compile_options(sanitizer_profile INTERFACE
-O1
-g
-fsanitize=address,undefined
-fno-omit-frame-pointer
)
target_link_options(sanitizer_profile INTERFACE
-fsanitize=address,undefined
)
# 프로필 적용
option(USE_SANITIZER "Build with sanitizers" OFF)
if(USE_SANITIZER)
target_link_libraries(myapp sanitizer_profile)
else()
target_link_libraries(myapp target_profile)
endif()
# 테스트
enable_testing()
add_executable(myapp_tests tests/test_main.cpp)
target_link_libraries(myapp_tests target_profile)
add_test(NAME unit_tests COMMAND myapp_tests)
2단계: 품질 게이트 스크립트
.cursor/quality-gate.sh를 생성합니다:
#!/bin/bash
set -e
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
BUILD_DIR="$PROJECT_ROOT/build"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 색상 없음
echo "=========================================="
echo " Cursor C++ Quality Gate"
echo "=========================================="
# 빌드 디렉토리 정리
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"
# 검사 1: 타겟 빌드
echo -e "\n${YELLOW}[1/3] 타겟 빌드${NC}"
echo "프로덕션 설정으로 빌드 중..."
mkdir -p "$BUILD_DIR/target"
cd "$BUILD_DIR/target"
cmake ../.. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
echo -e "${GREEN}타겟 빌드: 통과${NC}"
# 테스트 실행
echo "테스트 실행 중..."
ctest --output-on-failure
echo -e "${GREEN}테스트: 통과${NC}"
# 검사 2: 살균제 빌드
echo -e "\n${YELLOW}[2/3] 살균제 빌드${NC}"
echo "AddressSanitizer 및 UBSan으로 빌드 중..."
mkdir -p "$BUILD_DIR/sanitizer"
cd "$BUILD_DIR/sanitizer"
cmake ../.. -DCMAKE_BUILD_TYPE=Debug -DUSE_SANITIZER=ON
make -j$(nproc)
echo "살균제와 함께 실행 중..."
./myapp || {
echo -e "${RED}살균제가 오류를 감지했습니다!${NC}"
exit 1
}
echo -e "${GREEN}살균제 빌드: 통과${NC}"
# 검사 3: 정적 분석
echo -e "\n${YELLOW}[3/3] 정적 분석 (cppcheck)${NC}"
cd "$PROJECT_ROOT"
cppcheck \
--enable=all \
--suppress=missingIncludeSystem \
--error-exitcode=1 \
--inline-suppr \
--check-config \
-I include \
src/ \
tests/ \
2>&1 | tee "$BUILD_DIR/cppcheck-report.txt"
echo -e "${GREEN}정적 분석: 통과${NC}"
# 요약
echo -e "\n=========================================="
echo -e "${GREEN}모든 품질 게이트 통과!${NC}"
echo "=========================================="
echo "빌드 아티팩트: $BUILD_DIR/"
echo "보고서: $BUILD_DIR/cppcheck-report.txt"
실행 가능하게 만듭니다:
chmod +x .cursor/quality-gate.sh
3단계: Git Pre-Push 후크
.git/hooks/pre-push를 생성합니다:
#!/bin/bash
echo "푸시 전 품질 게이트 실행 중..."
if [ -f ".cursor/quality-gate.sh" ]; then
bash .cursor/quality-gate.sh
exit $?
else
echo "경고: 품질 게이트 스크립트를 찾을 수 없음"
exit 0
fi
실행 가능하게 만듭니다:
chmod +x .git/hooks/pre-push
4단계: Cursor 통합
Cursor 작업에 추가
.vscode/tasks.json을 생성합니다(Cursor는 VS Code 작업 시스템을 사용합니다):
{
"version": "2.0.0",
"tasks": [
{
"label": "C++ Quality Gate",
"type": "shell",
"command": "bash",
"args": [".cursor/quality-gate.sh"],
"group": {
"kind": "test",
"isDefault": true
},
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "shared"
},
"problemMatcher": ["$gcc"]
},
{
"label": "Quick Build",
"type": "shell",
"command": "cmake",
"args": ["--build", "build/target", "--parallel"],
"group": "build"
},
{
"label": "Run Sanitizer Build",
"type": "shell",
"command": "bash",
"args": ["-c", "mkdir -p build/sanitizer && cd build/sanitizer && cmake ../.. -DUSE_SANITIZER=ON && make -j$(nproc) && ./myapp"],
"group": "test"
}
]
}
키보드 단축키
.vscode/keybindings.json에 추가합니다:
[
{
"key": "ctrl+shift+q",
"command": "workbench.action.tasks.runTask",
"args": "C++ Quality Gate"
}
]
살균제 출력 이해하기
AddressSanitizer (ASan)
감지 항목:
- 해제 후 사용
- 힙 버퍼 오버플로
- 스택 버퍼 오버플로
- 전역 버퍼 오버플로
- 반환 후 사용
- 범위 후 사용
- 이중 해제
- 메모리 누수
출력 예시:
==12345==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 4 at 0x602000000014 thread T0
#0 0x5555555551a9 in main src/main.cpp:15
UndefinedBehaviorSanitizer (UBSan)
감지 항목:
- 부호 있는 정수 오버플로
- 0으로 나누기
- 널 포인터 역참조
- 정렬되지 않은 포인터 접근
- 잘못된 시프트 연산
출력 예시:
src/utils.cpp:42:15: runtime error: signed integer overflow
cppcheck 사용자 정의
억제 주석
코드 내에서:
// cppcheck-suppress unusedFunction
void debugHelper() {
// 디버그 빌드에서만 사용됨
}
// cppcheck-suppress knownConditionTrueFalse
if (x == x) { // 의도적인 NaN 검사
// NaN 처리
}
구성 파일
cppcheck-suppressions.txt를 생성합니다:
unusedFunction:*test*
missingIncludeSystem
unmatchedSuppression
스크립트를 업데이트합니다:
cppcheck \
--enable=all \
--suppressions-list=cppcheck-suppressions.txt \
--error-exitcode=1 \
src/ tests/
CI/CD 통합
GitHub Actions
name: C++ Quality Gate
on: [push, pull_request]
jobs:
quality-gate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake cppcheck
- name: Run Quality Gate
run: bash .cursor/quality-gate.sh
문제 해결
| 문제 | 해결책 |
|---|---|
| 살균제 빌드가 너무 느림 | 더 빠른 빌드를 위해 -O0 대신 -O1 사용 |
| cppcheck 오탐 | 억제 주석 또는 구성 파일 추가 |
| 후크가 실행되지 않음 | .git/hooks/pre-push가 실행 가능한지 확인 |
| 빌드 중 메모리 부족 | 병렬 작업 줄이기: -j$(nproc) 대신 make -j2 |
빠른 참조
# 전체 품질 게이트 실행
bash .cursor/quality-gate.sh
# 빠른 타겟 빌드만
mkdir -p build && cd build && cmake .. && make -j$(nproc)
# 살균제와 함께 실행
mkdir -p build-san && cd build-san && cmake .. -DUSE_SANITIZER=ON && make -j$(nproc) && ./myapp
# cppcheck만 실행
cppcheck --enable=all --error-exitcode=1 src/