Linterを追加する

This commit is contained in:
ry.yamafuji 2025-12-11 01:50:34 +09:00
parent 12d5c43c9e
commit 8ca1878481
4 changed files with 144 additions and 21 deletions

14
Dockerfile.devtools Normal file
View File

@ -0,0 +1,14 @@
# mus
FROM alpine:3.20
# 必要なツールをインストール
RUN apk add --no-cache \
doxygen \
graphviz \
cppcheck \
clang-extra-tools # clang-tidy を含む
# 作業ディレクトリを設定
WORKDIR /work
ENTRYPOINT []

View File

@ -1,11 +0,0 @@
# mus
FROM alpine:3.20
# 必要なツールをインストール
RUN apk add --no-cache \
doxygen \
graphviz
WORKDIR /work
CMD ["doxygen", "Doxyfile"]

View File

@ -2,10 +2,15 @@
- [C/C++の開発環境](#ccの開発環境) - [C/C++の開発環境](#ccの開発環境)
- [Linter](#linter) - [Linter](#linter)
- [導入方法](#導入方法)
- [Dockerを活用する](#dockerを活用する)
- [Linterの使い方](#linterの使い方)
- [clang-tidy の使い方(C++向け)](#clang-tidy-の使い方c向け)
- [ccppcheck の使い方C / C++ 両対応)](#ccppcheck-の使い方c--c-両対応)
- [テスト](#テスト) - [テスト](#テスト)
- [Doc(ドキュメンテーション)](#docドキュメンテーション) - [Doc(ドキュメンテーション)](#docドキュメンテーション)
- [環境構築](#環境構築) - [環境構築](#環境構築)
- [Dockerを活用する](#dockerを活用する) - [Dockerを活用する](#dockerを活用する-1)
- [doxygen 使い方](#doxygen-使い方) - [doxygen 使い方](#doxygen-使い方)
- [CI / CDによる実行](#ci--cdによる実行) - [CI / CDによる実行](#ci--cdによる実行)
- [Doxyfileの設定](#doxyfileの設定) - [Doxyfileの設定](#doxyfileの設定)
@ -14,7 +19,121 @@
## Linter ## Linter
TODO: TBD ライブラリの候補
* **clang-tidy**
* 精度はかなり高い
* C++向け(Cはカバー範囲が狭い)
* **cppcheck**
* C/C++ 両方対応・軽量
* 導入が簡単にできる
### 導入方法
**Macの場合**
```sh
brew install cppcheck llvm
# パスの追加が必要
export PATH="/opt/homebrew/opt/llvm/bin:$PATH"
clang-tidy --version
cppcheck --version
```
* llvm: clang-tidy は llvm に含まれています
**Linux(Ubuntu)の場合**
```sh
sudo apt install cppcheck clang-tidy
clang-tidy --version
cppcheck --version
```
#### Dockerを活用する
[Dockerfileはこちら](../Dockerfile.devtools)
Dockerイメージをビルドする
```sh
docker build -f Dockerfile.devtools -t c-dev-tools .
```
```sh
# docker run --rm -v "$(pwd)":/work -w /work c-dev-tools <コマンド>
```
### Linterの使い方
#### clang-tidy の使い方(C++向け)
**単一ファイルをチェックする例**
```sh
clang-tidy src/cpp/hello.cpp -- -Iinclude -std=c++17
# Docker
docker run --rm -v "$(pwd)":/work -w /work clang-tidy src/cpp/hello.cpp -- -Iinclude -std=c++17
```
* `--`以降がコンパイラフラグ(g++に渡すものと同じ)
* -Iinclude : ヘッダファイルのパス
* -std=c++17 : 使用している C++ のバージョン
**チェック内容を絞る使い方**
```sh
clang-tidy src/cpp/hello.cpp \
-checks='modernize-*,bugprone-*,readability-*' \
-- -Iinclude -std=c++17
```
よく使うチェックカテゴリ:
* bugprone-* : バグにつながるコード
* modernize-* : モダンC++スタイルへの改善提案
* readability-* : 可読性の改善
**プロジェクト全体**
CMake + compile_commands.jsonがある場合に以下の内容でできます
(clang-tidy は「コンパイル情報」がないと正しく解析できない)
compile_commands.jsonについては別途解説します。
```sh
mkdir -p build
cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
# プロジェクト全体に対して実行
run-clang-tidy -p build
```
#### ccppcheck の使い方C / C++ 両対応)
cppcheckはコンパイル不要で実行できる静的解析ツールです。
CでもC++でも同じコマンドで使えます。
**基本的な使い方**
```sh
cppcheck src/
# Docker
docker run --rm -v "$(pwd)":/work -w /work c-dev-tools cppcheck src/
```
**チェックレベルを広げる(おすすめ)**
```sh
cppcheck --enable=warning,style,performance,portability src/
# Docker
docker run --rm -v "$(pwd)":/work -w /work c-dev-tools \
cppcheck --enable=warning,style,performance,portability src/
```
* warning : 危険なコードやバグの可能性
* style : コーディングスタイル上の問題
* performance : 非効率なコード
* portability : 環境依存のコード
## テスト ## テスト
@ -47,28 +166,25 @@ sudo apt install doxygen graphviz
#### Dockerを活用する #### Dockerを活用する
[Dockerfileはこちら](../Dockerfile.doxygen) [Dockerfileはこちら](../Dockerfile.devtools)
Dockerイメージをビルドする Dockerイメージをビルドする
```sh ```sh
docker build -f Dockerfile.doxygen -t dev-doxygen . docker build -f Dockerfile.devtools -t c-dev-tools .
``` ```
Linuxでコマンドを実行する Linuxでコマンドを実行する
```sh ```sh
mkdir -p docs mkdir -p docs
# docker run --rm -v "$(pwd)":/work -w /work/docs dev-doxygen <コマンド> # docker run --rm -v "$(pwd)":/work -w /work/docs c-dev-tools <コマンド>
# 初期化コマンド # 初期化コマンド
docker run --rm -v "$(pwd)":/work -w /work/docs dev-doxygen doxygen -g docker run --rm -v "$(pwd)":/work -w /work/docs c-dev-tools doxygen -g
# ドキュメントを生成する # ドキュメントを生成する
docker run --rm -v "$(pwd)":/work -w /work/docs dev-doxygen doxygen Doxyfile docker run --rm -v "$(pwd)":/work -w /work/docs c-dev-tools doxygen Doxyfile
``` ```
### doxygen 使い方 ### doxygen 使い方
**設定ファイルを生成** **設定ファイルを生成**

View File

@ -4,6 +4,10 @@
// run: ./dist/hello // run: ./dist/hello
#include <iostream> #include <iostream>
/**
* @brief Main function
* @return int Exit status
*/
int main() { int main() {
std::cout << "Hello, world!" << std::endl; std::cout << "Hello, world!" << std::endl;
return 0; return 0;