自動車開発向け HKMC C++ セキュアコーディング基準
| ガイドライン | チェッカー名および説明 |
|---|---|
| HKMC P-CON-001 (中): ロックされている間にミューテックスを破棄しないでください |
CERT.CONC.MUTEX.DESTROY_WHILE_LOCKED ロックされている間はミューテックスを破棄しないでください |
| HKMC P-CON-002 (中): アクティブに保持されているロックが例外条件で解放されるようにする |
CERT.CONC.LOCK.NO_RELEASE_ON_EXCEPTION アクティブに保持されているロックが例外条件で解放されるようにする |
| HKMC P-CON-004 (低): 事前定義された順序でミューテックスをロックすることでデッドロックを回避します |
CONC.DL デッドロック |
| HKMC P-CON-005 (低): ループ内で偽って起動する可能性のあるラップ関数 |
CERT.CONC.WAKE_IN_LOOP 擬似的にループを起動する可能性のあるラップ関数 |
| HKMC P-CON-006 (低): 条件変数を使用するときにスレッドセーフと活性を保護します |
CERT.CONC.UNSAFE_COND_VAR 条件変数の使用時に、スレッドセーフと活性を維持します |
| HKMC P-CTR-001 (高): コンテナーインデックスと反復子が有効な範囲内にあることを保証します |
ABV.ANY_SIZE_ARRAY バッファオーバーフロー - 配列インデックスが範囲外 ABV.GENERAL バッファオーバーフロー - 配列インデックスが範囲外 ABV.GENERAL.MULTIDIMENSION バッファオーバーフロー - 配列インデックスが範囲外 ABV.NON_ARRAY 非配列オブジェクトが配列として使用される ABV.STACK バッファオーバーフロー - ローカル配列インデックスが範囲外 ABV.TAINTED 未検証の入力によるバッファオーバーフロー SV.TAINTED.ALLOC_SIZE メモリ割り当て時の未検証の整数の使用 SV.TAINTED.CALL.INDEX_ACCESS 関数呼び出し時の配列インデックスとしての未検証の整数の使用 SV.TAINTED.CALL.LOOP_BOUND 関数呼び出しのループ条件での未検証の整数の使用 SV.TAINTED.INDEX_ACCESS 配列インデックスとしての未検証の整数の使用 |
| HKMC P-CTR-002 (高): コンテナーの要素を参照するために、有効な参照、ポインター、および反復子を使用しないでください |
ITER.CONTAINER.MODIFIED 無効な反復子の使用 |
| HKMC P-CTR-003 (高): データをコピーする場合はオーバーフロー保護が必要 |
ITER.END.OUTPARAM.MIGHT 出力反復子としての 'end' の使用 ITER.END.OUTPARAM.MUST 出力反復子としての 'end' の使用 |
| HKMC P-CTR-004 (高): 有効な反復子範囲を使用します |
CXX.ITER.END.BEGIN 範囲の終わりを表す反復子が範囲の始まりの前にあります ITER.INAPPROPRIATE コンテナーオブジェクトが不適切な反復子の使用 ITER.INAPPROPRIATE.MULTIPLE コンテナーオブジェクトが不適切な反復子の使用 ITER.RANGE.INVALID 無効な反復子範囲の使用 |
| HKMC P-CTR-006 (高): 結果がオーバーフローする場合は、反復子で加法演算子を使用しない |
ITER.ADVANCE.NONADJACENT 反復子間の距離は 1 より大きい値にする |
| HKMC P-CTR-007 (高): 多態性オブジェクトに対してポインタ演算を行わないこと |
CERT.CTR.PTR_ARITH_POLYMORPHIC ポリモーフィックなオブジェクトに対してポインタ演算を行わないでください。 |
| HKMC P-DCL-001 (高): C スタイルの variadic 関数を定義しないでください |
MISRA.FUNC.VARARG 関数が可変数の引数を持っています |
| HKMC P-DCL-002 (低): 予約済みの識別子を宣言または定義しないでください |
MISRA.DEFINE.WRONGNAME 標準ライブラリからの名前がマクロ名に使用されています MISRA.DEFINE.WRONGNAME.UNDERSCORE 予約名がマクロ名に使用されています MISRA.STDLIB.WRONGNAME 標準ライブラリのマクロ、オブジェクトまたは関数の名前が再使用されています MISRA.STDLIB.WRONGNAME.UNDERSCORE 予約名が言語エンティティの名前に使用されています MISRA.UNDEF.WRONGNAME 標準ライブラリからの名前が定義されていません MISRA.UNDEF.WRONGNAME.UNDERSCORE 予約名が定義されていません |
| HKMC P-DCL-003 (低): 参照型を const または volatile で修飾しないでください |
CERT.DCL.REF_TYPE.CONST_OR_VOLATILE 参照型を const または volatile で修飾しないでください |
| HKMC P-DCL-004 (低): 構文的に曖昧な宣言を作成しないでください |
CERT.DCL.AMBIGUOUS_DECL 構文的に曖昧な宣言を作成しないでください |
| HKMC P-DCL-005 (低): 同一のスコープ内のペアとして割り当ておよび割り当て解除の関数をオーバーロードします |
CERT.DCL.SAME_SCOPE_ALLOC_DEALLOC 同一のスコープ内のペアとしての割り当ておよび割り当て解除関数をオーバーロードします |
| HKMC P-DCL-006 (低): 信頼境界を越えてクラスオブジェクトを渡すときのデータ漏洩に関する注意 |
PORTING.STORAGE.STRUCT 構造の要素のバイト位置が配置属性およびパッケージ属性に依存している可能性があります。 |
| HKMC P-DCL-007 (低): 静的オブジェクトの初期化中に関数を再入力しないでください |
CXX.STATIC.OBJ.RECURSION 静的オブジェクトの初期化中に関数を再入力しないでください |
| HKMC P-DCL-008 (低): デストラクターまたは割り当て解除関数での例外による終了を防ぎます |
MISRA.DTOR.THROW デストラクタにスローします |
| HKMC P-DCL-009 (高): 標準の名前空間を変更しないでください |
CERT.DCL.STD_NS_MODIFIED 標準名前空間を変更しないでください |
| HKMC P-DCL-010 (中): 名前が付いていない名前空間をヘッダーファイルで定義しないでください |
MISRA.NAMESPACE.UNMD ヘッダーファイルに名前のない名前空間があります |
| HKMC P-DCL-011 (高): ODR (一定義規則: One-Definition Rule) の遵守 |
AUTOSAR.ADD.ONEDEFRULE.FUNC 関数が一定義規則に違反しています AUTOSAR.ADD.ONEDEFRULE.VAR 変数が一定義規則に違反しています CERT.DCL.ODR.CLASS_REDEFINITION クラスと構造体については、単一定義規則(ODR)に従ってください。 MISRA.CT.UNIQUE.ID 識別子がタグ名と不整合です MISRA.TYPE.NAMECLASH.CPP.2008 ある名前空間の識別子が他の名前空間の識別子と同じスペルです MISRA.TYPEDEF.NOT_UNIQUE Typedef 名がその他のエンティティ用に使用されています |
| HKMC P-ERR-001 (低): プログラムを突然終了しないでください |
CERT.ERR.ABRUPT_TERM 突然プログラムを終了しないでください |
| HKMC P-ERR-003 (低): setjmp() または longjum() を使用しないでください |
MISRA.STDLIB.LONGJMP setjmp マクロまたは longjmp 関数の使用 |
| HKMC P-ERR-004 (低): コンストラクターまたはデストラクターの function-try-block ハンドラーでは、基本クラスまたはクラスデータメンバーを参照しないでください |
MISRA.CTOR.TRY.NON_STATIC コンストラクタまたはデストラクタの関数 try-catch ブロックが非スタティックなメンバーを参照しています |
| HKMC P-ERR-005 (中): 最低クラスから最高クラスの順での例外処理 |
MISRA.CATCH.NOALL 省略記号例外ハンドラーが try-catch ブロックの最後に置かれていません MISRA.CATCH.WRONGORD try-catch ブロックで基本例外クラスのハンドラーが派生例外クラスのハンドラーよりも先に置かれています |
| HKMC P-ERR-007 (高): 例外安全性を確保する |
CERT.EXCEPTION.SAFETY.ASSIGN_ORDER 代入演算子の例外安全性を確保する |
| HKMC P-ERR-008 (低): 例外を処理するときにリソースのリークを防ぎます |
CL.MLK メモリリーク - デストラクタで発生 MLK.MIGHT メモリリークの可能性 MLK.MUST メモリリーク MLK.RET.MIGHT メモリリークの可能性 MLK.RET.MUST メモリリーク RH.LEAK リソースリーク |
| HKMC P-ERR-009 (Low): main() の実行開始前にすべての例外を処理すること |
CERT.ERR.UNCAUGHT_STATIC_INIT main() の実行が開始される前にスローされるすべての例外を処理する |
| HKMC P-ERR-010 (低): lvalue 参照によって例外をキャッチします |
MISRA.CATCH.BY_VALUE クラス タイプの例外オブジェクトが値によってキャッチされています |
| HKMC P-ERR-011 (中): 文字列を数値に変換するときにエラーを検出します |
CERT.ERR.CONV.STR_TO_NUM 文字列を数値に変換する際にエラーを検出する |
| HKMC P-EXP-001 (中): 副作用を引き起こす評価の順番に関する注意 |
CERT.EXPR.PARENS 式内の演算子の優先度は明示的にする必要があります。 MISRA.EXPR.PARENS.INSUFFICIENT 式の演算子優先規則に制限された依存性が必要です MISRA.INCR_DECR.OTHER 増分または減分の演算子がその他の演算子と混合して式で使用されています MISRA.INCR_DECR.SIDEEFF.2012 インクリメント (++) またはデクリメント (--) 演算子を含む完全な式では、インクリメントまたはデクリメント演算子によって生じる以外に他の副作用が存在してはなりません PORTING.VAR.EFFECTS ある使用法が副次的な影響を受ける式で変数が 2 回使用されています |
| HKMC P-EXP-002 (低): 不正確な型のポインターを介して配列を削除しないでください |
CERT.EXPR.DELETE_ARR.BASE_PTR 不正な型のポインターを使用して配列を削除しないでください |
| HKMC P-EXP-003 (低): オペランドを評価 (計算) しない式の使用に関する注意 |
MISRA.SIZEOF.SIDE_EFFECT sizeof のオペランドに副作用があります |
| HKMC P-EXP-004 (高): 初期化される前にメモリを参照しないでください |
UNINIT.CTOR.MIGHT コンストラクタにおける未初期化の変数の可能性 UNINIT.CTOR.MUST コンストラクタにおける未初期化の変数 UNINIT.HEAP.MIGHT 未初期化のヒープの使用の可能性 UNINIT.HEAP.MUST 未初期化のヒープの使用 UNINIT.STACK.ARRAY.MIGHT 未初期化の配列の可能性 UNINIT.STACK.ARRAY.MUST 未初期化の配列 UNINIT.STACK.ARRAY.PARTIAL.MUST 一部が未初期化の配列 UNINIT.STACK.MIGHT 未初期化の変数の可能性 UNINIT.STACK.MUST 未初期化の変数 |
| HKMC P-EXP-005 (高): 存続期間であるオブジェクトにアクセスしないでください |
CL.FFM.ASSIGN 解放済みメモリの使用 (二重解放) - operator= が無いため CL.FFM.COPY 解放済みメモリの使用 (二重解放) - コピーコンストラクタが無いため LOCRET.ARG 関数がローカル変数のアドレスを返しています LOCRET.GLOB 関数がローカル変数のアドレスを返しています LOCRET.RET 関数がローカル変数のアドレスを返しています UFM.DEREF.MIGHT 解放済みメモリの逆参照の可能性 UFM.DEREF.MUST 解放済みメモリの逆参照 UFM.FFM.MIGHT 解放済みメモリの使用 (二重解放)の可能性 UFM.FFM.MUST 解放済みメモリの解放 UFM.RETURN.MIGHT 解放済みメモリの戻り値への使用の可能性 UFM.RETURN.MUST 解放済みメモリの戻り値への使用 UFM.USE.MIGHT 解放済みメモリの使用の可能性 UFM.USE.MUST 解放済みメモリの使用 UNINIT.HEAP.MIGHT 未初期化のヒープの使用の可能性 UNINIT.HEAP.MUST 未初期化のヒープの使用 UNINIT.STACK.ARRAY.MIGHT 未初期化の配列の可能性 UNINIT.STACK.ARRAY.MUST 未初期化の配列 UNINIT.STACK.ARRAY.PARTIAL.MUST 一部が未初期化の配列 UNINIT.STACK.MIGHT 未初期化の変数の可能性 UNINIT.STACK.MUST 未初期化の変数 |
| HKMC P-EXP-006 (中): CV (const または volatile) 非修飾変数を介して CV 変数にアクセスしないでください |
MISRA.CAST.CONST キャスト演算により const または volatile がポインターまたは参照から除外されます。 |
| HKMC P-EXP-007 (中): va_start を呼び出すには、適切なタイプのオブジェクトを渡す必要があります |
CERT.VA_START.TYPE 正しい型のオブジェクトを va_start に渡す |
| HKMC P-EXP-010 (高): オブジェクトの値の一部であるビットにアクセスしないでください |
CERT.MEMCMP.PADDED_DATA パディングデータを比較しないでください |
| HKMC P-EXP-011 (中): ムーブ元オブジェクトの値に依存しないこと |
CERT.EXPR.MOVED_FROM.RANGE 移動元のイテレータオブジェクトを使用しないでください。 CERT.EXPR.MOVED_FROM.USE 移動元のオブジェクトを使用しない |
| HKMC P-FIO-002 (中): 不要になったファイルポインターを閉じます |
RH.LEAK リソースリーク |
| HKMC P-MEM-001 (高): 割り当て解除されたメモリを参照しないでください |
UFM.DEREF.MIGHT 解放済みメモリの逆参照の可能性 UFM.DEREF.MUST 解放済みメモリの逆参照 UFM.FFM.MIGHT 解放済みメモリの使用 (二重解放)の可能性 UFM.FFM.MUST 解放済みメモリの解放 UFM.RETURN.MIGHT 解放済みメモリの戻り値への使用の可能性 UFM.RETURN.MUST 解放済みメモリの戻り値への使用 UFM.USE.MIGHT 解放済みメモリの使用の可能性 UFM.USE.MUST 解放済みメモリの使用 |
| HKMC P-MEM-002 (高): 動的に割り当てられたリソースを適切に割り当て解除します |
CL.FMM メモリの解放の不一致 - デストラクタで発生 FMM.MIGHT メモリの解放の不一致の可能性 FMM.MUST メモリの解放の不一致 |
| HKMC P-MEM-004 (高): オブジェクトの有効期間を管理する場合はオブジェクトを明示的に構築および破棄する |
CERT.MEM.OBJ_LIFETIME_CTOR 初期化されていない heap メンバー関数の呼び出し CERT.MEM.OBJ_LIFETIME_DTOR 手動で割り当てられたメモリを持つオブジェクトは明示的に破棄されない |
| HKMC P-MEM-005 (高): TBD |
CERT.MEM.PLACEMENTNEW.MISALIGNED アライメントが適切なストレージを placement new に提供します CERT.MEM.PLACEMENTNEW.TOOSMALL 十分なストレージを placement new に提供します。 |
| HKMC P-MEM-006 (高): 既に所有されているポインター値を無関係なスマートポインターに格納しない |
CERT.MEM.SMART_PTR.OWNED 複数のスマートポインターでのポインター所有権の共有 CERT.MEM.SMART_PTR.OWNED.THIS 基礎となるリソースが無関係なスマートポインターによって既に所有されている可能性がある |
| HKMC P-MEM-007 (中): 存続期間後に欠落しているメモリ解放 |
MLK.MIGHT メモリリークの可能性 MLK.MUST メモリリーク MLK.RET.MIGHT メモリリークの可能性 MLK.RET.MUST メモリリーク |
| HKMC P-MSC-001 (中): 疑似乱数の生成には std::rand() を使用しないでください |
CERT.MSC.STD_RAND_CALL 疑似乱数の生成に std::rand() を使用しないでください |
| HKMC P-MSC-002 (中): 乱数発生器に適切なシード |
AUTOSAR.STDLIB.RANDOM.NBR_GEN_DEFAULT_INIT 乱数エンジンをデフォルトで初期化してはなりません CERT.MSC.SEED_RANDOM 疑似乱数ジェネレータを適切にシードする |
| HKMC P-MSC-003 (中): 値を返す関数はすべての終了パスから値を返す必要があります |
FUNCRET.GEN 非 void 関数に戻り値がありません |
| HKMC P-MSC-004 (中): [[noreturn]] を宣言した関数から返さないでください |
CERT.MSC.NORETURN_FUNC_RETURNS [[noreturn]] と宣言された関数から返さないでください |
| HKMC P-MSC-005 (中): スタック変数アドレスを返す |
LOCRET.ARG 関数がローカル変数のアドレスを返しています LOCRET.GLOB 関数がローカル変数のアドレスを返しています LOCRET.RET 関数がローカル変数のアドレスを返しています |
| HKMC P-OOP-001 (低): コントラクターまたはデストラクターから仮想関数を呼び出さないでください |
CERT.OOP.CTOR.VIRTUAL_FUNC コンストラクタまたは、デストラクタから仮想関数を呼出してはならない |
| HKMC P-OOP-003 (低): 仮想デストラクターなしで多相オブジェクトを削除しないでください |
CL.MLK.VIRTUAL メモリリーク - デストラクタで発生している可能性 CWARN.DTOR.NONVIRT.DELETE 仮想メソッドを持ち、仮想デストラクタを持たないクラスのオブジェクトの式を削除しています |
| HKMC P-OOP-004 (中): コンストラクターメンバーの初期化子を一定の順序で作成します |
CERT.OOP.CTOR.INIT_ORDER コンストラクターメンバー初期化子を正規の順序で作成します |
| HKMC P-OOP-005 (低): セルフコピーの割り当てを正しく処理します |
CL.SELF-ASSIGN 解放済みメモリの使用 (二重解放) - operator= |
| HKMC P-OOP-006 (高): メンバーへのポインター演算子を使用して、存在しないメンバーにアクセスしないでください |
CERT.OOP.PTR_MEMBER.NO_MEMBER メンバー演算子へのポインターを使用して、存在しないメンバーにアクセスしないでください |
| HKMC P-OOP-007 (高): C 標準ライブラリよりも特別なメンバー関数とオーバーロードされた演算子を優先します |
CERT.OOP.CSTD_FUNC_USE C 標準ライブラリ関数よりも特殊メンバー関数とオーバーロードされた演算子を優先します |
| HKMC P-OOP-008 (低): コピー演算子でソースオブジェクトを変更しないでください |
CERT.OOP.COPY_MUTATES コピー操作でソースオブジェクトを変更してはいけません |
| HKMC P-OOP-009 (中): 公開静的フィールドは最終としてマークされません |
CXX.STATIC.OBJ.FINAL 初期化されたパブリック静的フィールドは最終としてマークされていません |
| HKMC P-OOP-010 (中): 重要なデータ要素のパブリック宣言 |
CXX.MEMBER.IMPORTANT.PRIVATE 重要なメンバーデータはプライベートにすべきです |
| HKMC P-OOP-011 (高): パブリックメソッドを介して重要なプライベート変数にアクセスします |
CXX.MEMBER.CRITICAL.PUBLIC.METHOD 重大なプライベートメンバーデータは、パブリックメソッドによって直接書き込み可能であってはなりません |
| HKMC P-STR-001 (高): 文字列のストレージに文字データと null 終了文字のための十分なスペースがあることを保証します |
NNTS.MIGHT バッファオーバーフロー - 非 NULL 終了文字列 NNTS.MUST バッファオーバーフロー - 非 NULL 終了文字列 SV.FMT_STR.BAD_SCAN_FORMAT 入力書式指定子エラー SV.UNBOUND_STRING_INPUT.CIN バインドされていない文字列入力についての cin の使用法 SV.UNBOUND_STRING_INPUT.FUNC バインドされていない文字列入力の使用法 |
| HKMC P-STR-003 (高): basic_string を参照するときに、無効な参照、ポインター、および反復子を使用しないでください |
CERT.STR_ACCESS.INVALID 無効な文字列イテレーターまたはポインターの使用 ITER.CONTAINER.MODIFIED 無効な反復子の使用 |