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: レビュー準備
bash
# 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設定ファイルを参照してください。
bash
# AUTOSAR/CERTチェック実行 clang-tidy --config-file=.clang-tidy src/**/*.cpp # または特定ファイル clang-tidy --checks='autosar-*,cert-*' src/core/Parser.cpp
Cppcheckの使用
bash
# 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: 動的メモリは例外的にのみ使用
cpp
// ❌ 悪い例
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言語メモリ管理関数を使用しない
cpp
// ❌ 悪い例 char* buffer = (char*)malloc(256); free(buffer); // ✅ 良い例 std::vector<char> buffer(256);
型安全性
A5-0-3: 明示的な型変換を使用
cpp
// ❌ 悪い例 double d = 3.14; int i = (int)d; // C言語スタイルキャスト // ✅ 良い例 int i = static_cast<int>(d);
A8-4-1: 関数パラメータは参照またはポインタで渡す
cpp
// ❌ 悪い例
void process(std::vector<int> data) { // コピー発生
// ...
}
// ✅ 良い例
void process(const std::vector<int>& data) { // 参照渡し
// ...
}
例外処理
A15-5-1: throw by value, catch by reference
cpp
// ❌ 悪い例
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
cpp
// ✅ 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: 整数オーバーフローを防ぐ
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: 文字列リテラルを変更しない
cpp
// ❌ 悪い例 char* str = "Hello"; // 文字列リテラルへのポインタ str[0] = 'h'; // 未定義動作 // ✅ 良い例 const char* str = "Hello"; // 変更不可 // または std::string str = "Hello"; // 変更可能なコピー
メモリ管理
MEM51-CPP: 適切にメモリを解放
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設定例を参照。
yaml
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. 変更ファイルの特定
bash
# プルリクエストの変更ファイル一覧 git diff --name-only origin/main...HEAD # C++ファイルのみ抽出 git diff --name-only origin/main...HEAD | grep -E '\.(cpp|hpp|h)$'
2. 変更箇所の詳細確認
bash
# 関数単位で変更を表示 git diff -U5 origin/main...HEAD -- src/core/Parser.cpp # 統計情報 git diff --stat origin/main...HEAD
3. レビューポイントの集中
変更箇所のみに以下を集中確認:
- • 新規追加されたポインタ・動的メモリ割り当て
- • 変更された例外処理
- • 型変換の追加・変更
- • ループ・条件分岐の変更
レビューレポートテンプレート
markdown
# コードレビューレポート ## ファイル: `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 を使用してください。