Ubuntu下C++代码审查实操指南
一 流程与角色
二 本地静态检查与格式化
g++ -Wall -Wextra -Werror -pedantic -std=c++17 ...;Clang 可用 -Weverything(按需精简)。sudo apt-get install clang-tidycmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..clang-tidy src/main.cpp -checks='readability-*,cppcoreguidelines-*'clang-tidy src/main.cpp -fix(建议提交前在版本控制下操作).clang-tidy---
Checks: 'modernize-*, readability-*, cppcoreguidelines-*, bugprone-*, performance-*'
WarningsAsErrors: ''
HeaderFilter: '.*'
FormatStyle: file
-fix 与 .clang-format 可统一格式与部分修复。sudo apt-get install cppcheckcppcheck --enable=all --std=c++17 src/cppcheck --jobs=4 --xml --xml-version=2 src/ 2> report.xmlcppcheck --project=compile_commands.jsoncppcheck --suppress=unusedFunction ...sudo apt-get install clang-formatclang-format -style=file -i src/**/*.cpp src/**/*.hpp.clang-format 纳入版本控制,统一团队风格。valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./your_app三 编辑器与 IDE 集成
settings.json 中启用/配置 Clang-Tidy 与 Cppcheck 的 lint 能力;保存即检、问题面板集中展示,便于逐条修复与回复评审意见。clang-tidy/cppcheck 为异步 linter,边写边提示,减少提交前返工。compile_commands.json,并与 Clang-Format 联动,提交前一键检查与格式化。四 代码审查清单与提交前自检脚本
std::atomic/memory_order)。scripts/pre-commit 并 chmod +x)#!/usr/bin/env bash
set -euo pipefail
echo "=== [pre-commit] 格式化检查 ==="
if ! git diff --quiet --cached -- '*.cpp' '*.hpp' '*.cc' '*.hh'; then
clang-format -style=file -i $(git diff --cached --name-only -- '*.cpp' '*.hpp' '*.cc' '*.hh')
git add $(git diff --name-only -- '*.cpp' '*.hpp' '*.cc' '*.hh')
fi
echo "=== [pre-commit] Clang-Tidy 检查 ==="
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -B build -S . >/dev/null
find src -name '*.cpp' | xargs clang-tidy -p build -warnings-as-errors='*'
echo "=== [pre-commit] Cppcheck 检查 ==="
cppcheck --enable=warning,performance,portability,unusedFunction \
--std=c++17 --project=build/compile_commands.json \
--xml --xml-version=2 src/ 2> cppcheck-report.xml || true
if grep -q "<error " cppcheck-report.xml; then
echo "Cppcheck 发现问题,请修复后再提交:"
grep -o 'message="[^"]*"' cppcheck-report.xml | sort -u
exit 1
fi
echo "=== [pre-commit] 单元测试 ==="
cmake --build build --target test || { echo "单元测试失败"; exit 1; }
echo "=== [pre-commit] 通过 ==="
WarningsAsErrors 可在本地宽松、在 CI 严格。五 团队协作与 CI