自動車業界のエンジニアにとって、AUTOSAR C++14(正式名称:Guidelines for the use of the C++14 language in critical and safety-related systems)は、避けては通れない「最恐」のコーディング規約です。ASIL B〜Dといった、命に関わる安全レベルを保証するためのこの規約は、あまりにも厳格。
しかし、現代のデベロッパーなら、そんなガチガチの環境でも「バイブコーディング(雰囲気で書くカジュアルなスタイル)」を諦めたくないはず。今回は、規約を100%遵守しながら、いかに「ノリ」良く安全なコードを書くかという、究極の二律背反に挑みます。
1. AUTOSAR C++14の最重要マインドセット
「細かいルールが多すぎて覚えられない!」という人のために、まずはこれさえ守れば8割は警察(静的解析)に捕まらない「バイブス」をまとめました。
カテゴリ 雰囲気(バイブス)で言うと 代表的なAUTOSARルール 必須度
安全性最優先 「クラッシュ=即、大事故」の緊張感 A0-1-x, M0-1-x(未定義動作・未使用コード禁止) Required
予測可能性 「見た瞬間に、何が起きるか100%分かる」 A5-0-x(bool以外をifの条件にしない) Required
静的解析命 「ツールに怒られる前に直すのがマナー」 規約の約80%が自動チェック可能 —
モダンC++厳選 「C++14で時が止まっている。17以降は封印」 A1-1-1(ISO/IEC 14882:2014準拠) Required
RAII・所有権 「誰がdeleteするか、誰が見ても明らか」 A12-8-x, A18-4-x(スマートポインタ推奨) Required
2. 準拠スタイル例:速度制御アクチュエータ(ASIL-B想定)
バイブスを残しつつ、AUTOSAR警察を黙らせるクリーンな実装例です。
// A1-1-1準拠:純粋なC++14のみを使用。
// A2-7-1準拠:ファイルヘッダには会社規定のライセンスとメタデータを記述。
// A3-1-1準拠:1ファイル1クラスの原則。
#ifndef VEHICLE_SPEED_CONTROLLER_HPP_INCLUDED
#define VEHICLE_SPEED_CONTROLLER_HPP_INCLUDED
#include <cstdint> // A6-5-x : intは禁止。uint32_tなどの固定幅を愛せ。
#include <memory> // A12-8-x : 所有権はスマートポインタで語れ。
namespace control {
namespace actuator {
/**
* @brief 車両速度制御アクチュエータ
* Rule A12-8-x: 生ポインタでの所有権移動は「死」を意味する。
*/
class SpeedActuator final // A10-3-3: 継承しないならfinal。
{
public:
// A12-1-x : Special Member Functionsの明示(Rule of Five)
SpeedActuator() = default;
SpeedActuator(const SpeedActuator&) = delete; // コピー禁止
SpeedActuator& operator=(const SpeedActuator&) = delete;
~SpeedActuator() noexcept = default;
// A5-0-2 : 条件式は必ず真偽値。整数をifに入れるのは「ダサい」。
bool setTargetSpeed(uint32_t target_kmh) noexcept
{
// A5-1-1 : リテラル(200U)は定数化が望ましい。
if (target_kmh > 200U)
{
return false;
}
// A18-4-1 : 迷わず make_unique。newを直接書くのは時代遅れ。
command_ = std::make_unique<MotorCommand>(target_kmh);
return true;
}
private:
struct MotorCommand final
{
explicit MotorCommand(uint32_t val) noexcept : value_(val) {}
uint32_t value_;
};
std::unique_ptr<MotorCommand> command_{nullptr}; // A12-8-x: 所有権の明確化
};
} // namespace actuator
} // namespace control
#endif
