| name | cpp14-code-review |
| description | AUTOSAR C++14およびCERT C++コーディング規約に準拠したC++14コードレビューのガイド。安全性重視のC++システムのコードレビュー、セキュリティ監査、品質評価を行う際に使用してください。 |
C++14 Code Review with AUTOSAR and CERT Standards
このスキルは、AUTOSAR C++14およびCERT C++コーディング規約に基づいたC++14コードレビューを支援します。
いつこのスキルを使用するか
以下の場合に本スキルを活用してください:
- AUTOSAR C++14準拠のコードレビューを実行する
- CERT C++セキュアコーディング基準に基づくセキュリティ監査を行う
- 組込みシステムや安全性が重視されるコードを評価する
- Git差分レビュー(プルリクエスト)を効率的に実施する
- 静的解析ツール(Clang-Tidy、Cppcheck)の設定とCI/CD統合を行う
- メモリ安全性、スレッド安全性、例外安全性を検証する
コードレビュープロセス
ステップ1: レビュー準備
# Git差分の取得(プルリクエストレビュー)
git diff <base-commit> <head-commit> > changes.diff
# または特定ファイルのみ
git diff <base-commit> <head-commit> -- src/core/*.cpp > core-changes.diff
ステップ2: 自動チェック実行
Clang-Tidyの使用
Clang-Tidy設定ファイルを参照してください。
# AUTOSAR/CERTチェック実行
clang-tidy --config-file=.clang-tidy src/**/*.cpp
# または特定ファイル
clang-tidy --checks='autosar-*,cert-*' src/core/Parser.cpp
Cppcheckの使用
# MISRA/CERT準拠チェック
cppcheck --addon=misra --addon=cert --enable=all src/
# XML出力(CI/CD向け)
cppcheck --addon=cert --xml --xml-version=2 src/ 2> report.xml
ステップ3: 手動レビュー観点
レビューチェックリストを参照してください。
優先度別レビュー基準
優先度1: Critical(即座に修正)
メモリ安全性違反
- バッファオーバーフロー(CERT ARR30-C, ARR38-C)
- Use-after-free(CERT MEM50-CPP)
- ダングリングポインタ(CERT EXP54-CPP)
- メモリリーク(AUTOSAR A18-5-2)
セキュリティ脆弱性
- 整数オーバーフロー(CERT INT50-CPP)
- SQLインジェクション、コマンドインジェクション
- 入力バリデーション欠如
未定義動作
- 初期化されていない変数の使用(AUTOSAR A8-5-2)
- ヌルポインタデリファレンス(CERT EXP34-C)
- 配列範囲外アクセス
優先度2: High(早急に修正)
AUTOSAR必須ルール違反
- A5-0-3: 明示的な型変換の使用
- A7-1-1: constexpr変数の使用
- A12-8-1: コピー制御(Rule of Five/Zero)
- A15-5-1: 例外のthrow by value, catch by reference
リソース管理
- RAIIパターンの未使用(AUTOSAR A15-1-2)
- スマートポインタの未使用(AUTOSAR A18-5-2)
- 例外安全性の欠如(CERT ERR50-CPP)
優先度3: Medium(計画的に修正)
AUTOSARアドバイザリールール違反
- A0-1-6: 未使用の値(戻り値の無視)
- A2-13-3: 型の不一致
- M5-0-21: ビット演算の優先順位
const correctness
- const修飾の不徹底(AUTOSAR A7-1-1)
- constexpr関数の未使用
- const参照の未使用(AUTOSAR A8-4-1)
優先度4: Low(改善推奨)
コード品質
- 命名規約の不統一
- コメント不足
- 循環的複雑度が高い(> 10)
Modern C++機能の未活用
- ラムダ式の活用可能箇所
- 範囲forループの使用可能箇所
- auto型推論の適用可能箇所
AUTOSAR C++14主要ルール
メモリ管理
A18-5-2: 動的メモリは例外的にのみ使用
// ❌ 悪い例
void process() {
int* data = new int[100];
// 例外発生時にメモリリーク
processData(data);
delete[] data;
}
// ✅ 良い例
void process() {
std::vector<int> data(100); // RAII
processData(data.data());
} // 自動的に解放
A18-1-1: C言語メモリ管理関数を使用しない
// ❌ 悪い例
char* buffer = (char*)malloc(256);
free(buffer);
// ✅ 良い例
std::vector<char> buffer(256);
型安全性
A5-0-3: 明示的な型変換を使用
// ❌ 悪い例
double d = 3.14;
int i = (int)d; // C言語スタイルキャスト
// ✅ 良い例
int i = static_cast<int>(d);
A8-4-1: 関数パラメータは参照またはポインタで渡す
// ❌ 悪い例
void process(std::vector<int> data) { // コピー発生
// ...
}
// ✅ 良い例
void process(const std::vector<int>& data) { // 参照渡し
// ...
}
例外処理
A15-5-1: throw by value, catch by reference
// ❌ 悪い例
throw new std::runtime_error("Error"); // ポインタをthrow
// ✅ 良い例
throw std::runtime_error("Error"); // 値をthrow
// キャッチ
try {
// ...
} catch (const std::exception& e) { // 参照でキャッチ
// ...
}
オブジェクト指向
A12-8-1: Rule of Five/Zero
// ✅ Rule of Zero(推奨)
class Resource {
std::unique_ptr<Data> data_; // スマートポインタを使用
// コピー・ムーブが自動生成される
};
// ✅ Rule of Five(リソース管理が必要な場合)
class CustomResource {
public:
~CustomResource(); // デストラクタ
CustomResource(const CustomResource&); // コピーコンストラクタ
CustomResource& operator=(const CustomResource&); // コピー代入
CustomResource(CustomResource&&) noexcept; // ムーブコンストラクタ
CustomResource& operator=(CustomResource&&) noexcept; // ムーブ代入
};
CERT C++主要ルール
セキュリティ
INT50-CPP: 整数オーバーフローを防ぐ
// ❌ 悪い例
int calculate(int a, int b) {
return a * b; // オーバーフロー未チェック
}
// ✅ 良い例
#include <limits>
int calculate(int a, int b) {
if (a > 0 && b > std::numeric_limits<int>::max() / a) {
throw std::overflow_error("Integer overflow");
}
return a * b;
}
STR50-CPP: 文字列リテラルを変更しない
// ❌ 悪い例
char* str = "Hello"; // 文字列リテラルへのポインタ
str[0] = 'h'; // 未定義動作
// ✅ 良い例
const char* str = "Hello"; // 変更不可
// または
std::string str = "Hello"; // 変更可能なコピー
メモリ管理
MEM51-CPP: 適切にメモリを解放
// ❌ 悪い例
void process() {
Resource* res = new Resource();
if (someCondition) {
return; // メモリリーク
}
delete res;
}
// ✅ 良い例
void process() {
auto res = std::make_unique<Resource>();
if (someCondition) {
return; // 自動的に解放
}
}
静的解析ツール設定
Clang-Tidy設定
完全な設定ファイルを参照。
主要チェック:
autosar-*: AUTOSAR C++14ルールcert-*: CERT C++ルールmodernize-*: Modern C++への移行cppcoreguidelines-*: C++ Core Guidelines
CI/CD統合
GitHub Actions例
CI/CD設定例を参照。
name: C++ Code Review
on: [pull_request]
jobs:
static-analysis:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run Clang-Tidy
run: |
clang-tidy --checks='autosar-*,cert-*' src/**/*.cpp
- name: Run Cppcheck
run: |
cppcheck --addon=cert --xml src/ 2> report.xml
Git差分レビューワークフロー
1. 変更ファイルの特定
# プルリクエストの変更ファイル一覧
git diff --name-only origin/main...HEAD
# C++ファイルのみ抽出
git diff --name-only origin/main...HEAD | grep -E '\.(cpp|hpp|h)$'
2. 変更箇所の詳細確認
# 関数単位で変更を表示
git diff -U5 origin/main...HEAD -- src/core/Parser.cpp
# 統計情報
git diff --stat origin/main...HEAD
3. レビューポイントの集中
変更箇所のみに以下を集中確認:
- 新規追加されたポインタ・動的メモリ割り当て
- 変更された例外処理
- 型変換の追加・変更
- ループ・条件分岐の変更
レビューレポートテンプレート
# コードレビューレポート
## ファイル: `src/core/Parser.cpp`
### Critical Issues (優先度1)
- **Line 156**: バッファオーバーフロー(CERT ARR30-C)
- 問題: 固定サイズバッファ使用
- 修正案: `std::vector<char>`または`std::string`を使用
### High Issues (優先度2)
- **Line 203**: AUTOSAR A18-5-2違反
- 問題: `new`の直接使用
- 修正案: `std::make_unique`を使用
### Medium Issues (優先度3)
- **Line 89**: const correctness
- 問題: const参照で渡すべき
- 修正案: `void process(const Data& data)`
## サマリー
- Critical: 1件
- High: 1件
- Medium: 1件
- 推奨: マージ前に修正が必要
参考リソース
- AUTOSAR C++14 Guidelines
- CERT C++ Coding Standard
- C++ Core Guidelines
- Clang-Tidy Documentation
- 設定ファイル集
- チェックリスト
次のステップ
- 静的解析ツール設定をプロジェクトに適用
- レビューチェックリストを使用してレビュー実施
- CI/CD統合を設定
- レビュー結果を文書化
包括的なコードレビューが必要な場合は、関連エージェント review-cpp14-code またはプロンプト #review-cpp14-code を使用してください。