CERT C 規則および推奨事項
以下の表は、CERT Cのルールと推奨事項をKlocwork Cのチェッカーに対応付けたものです。
CERT C 規則
| ガイドライン | チェッカー名および説明 |
|---|---|
| CERT ARR30-C (L2): 範囲外のポインターまたは配列添え字を形成または使用しない |
ABV.ANY_SIZE_ARRAY バッファオーバーフロー - 配列インデックスが範囲外 ABV.GENERAL バッファオーバーフロー - 配列インデックスが範囲外 ABV.GENERAL.MULTIDIMENSION バッファオーバーフロー - 配列インデックスが範囲外 ABV.NON_ARRAY 非配列オブジェクトが配列として使用される ABV.STACK バッファオーバーフロー - ローカル配列インデックスが範囲外 ABV.TAINTED 未検証の入力によるバッファオーバーフロー ABV.UNICODE.BOUND_MAP 文字関数のマッピング時のバッファオーバーフロー ABV.UNICODE.FAILED_MAP 関数のマッピングに失敗します ABV.UNICODE.NNTS_MAP 文字関数のマッピング時のバッファオーバーフロー ABV.UNICODE.SELF_MAP 関数のマッピングに失敗します ABV.UNKNOWN_SIZE バッファオーバーフロー - 配列インデックスが範囲外 NNTS.MIGHT バッファオーバーフロー - 非 NULL 終了文字列 NNTS.MUST バッファオーバーフロー - 非 NULL 終了文字列 NNTS.TAINTED 未検証のユーザー入力が原因のバッファオーバーフロー - 非 NULL 終了文字列 NPD.FUNC.CALL.MIGHT NULL を返す関数の戻り値が、これを逆参照する可能性のある別の関数に渡される可能性があります SV.TAINTED.INDEX_ACCESS 配列インデックスとしての未検証の整数の使用 SV.TAINTED.LOOP_BOUND ループ条件での未検証の整数の使用 |
| CERT ARR32-C (L3): 可変長配列のサイズ引数を有効な範囲に収める |
MISRA.ARRAY.VAR_LENGTH.2012 変数の長さの配列種類は使用しないでください |
| CERT ARR36-C (L3): 同じ配列を参照していない 2 つのポインターで減算や比較を行わない |
MISRA.PTR.ARITH 代数式または配列インデックス式でポインタが使用されています |
| CERT ARR37-C (L2): 配列以外のオブジェクトを指すポインターに対して整数の加算や減算を行わない |
CERT.ARR.PTR.ARITH 演算式にポインターが使用されています |
| CERT ARR38-C (L2): ライブラリ関数が無効なポインターを形成しないことを保証する |
ABV.GENERAL バッファオーバーフロー - 配列インデックスが範囲外 ABV.GENERAL.MULTIDIMENSION バッファオーバーフロー - 配列インデックスが範囲外 |
| CERT ARR39-C (L2): ポインターに対してスケーリングされた整数の加算や減算を行わない |
CERT.ARR.PTR.ARITH 演算式にポインターが使用されています |
| CERT CON30-C (L3): スレッド固有のストレージをクリーンアップする | |
| CERT CON31-C (L3): ロックされている間はミューテックスを破棄しない | |
| CERT CON32-C (L3): 複数のスレッドからビットフィールドにアクセスする場合はデータ競合を防止する | |
| CERT CON33-C (L3): ライブラリ関数の使用時には競合状態を避ける |
CERT.CONC.LIB_FUNC_USE ライブラリ関数の使用時には競合状態を避けてください |
| CERT CON34-C (L3): スレッド間で共有されるオブジェクトは適切な保持期間を指定して宣言する | |
| CERT CON35-C (L3): 事前定義された順序でロックすることによりデッドロックを回避する |
CONC.DL デッドロック CONC.NO_UNLOCK 変数のロック解除の欠落 |
| CERT CON36-C (L3): 疑似的にループで起動する可能性のある関数はラップする |
CERT.CONC.WAKE_IN_LOOP_C 擬似的にループを起動する可能性のあるラップ関数 |
| CERT CON37-C (L3): マルチスレッドプログラムで signal() を呼び出さない |
MISRA.STDLIB.SIGNAL signal.h の信号処理装置の使用 |
| CERT CON38-C (L3): 条件変数の使用時にはスレッドセーフと活性を維持する |
CERT.CONC.UNSAFE_COND_VAR_C 条件変数の使用時に、スレッドセーフと活性を維持します |
| CERT CON39-C (L3): 以前に結合または切り離されたスレッドを結合したり、切り離したりしない | |
| CERT CON40-C (L2): 1 つの式でアトミック変数を 2 回参照しない |
CERT.CONC.ATOMIC_TWICE_EXPR 1 つの式でアトミック変数を 2 回参照しないでください |
| CERT CON41-C (L3): 疑似的にループで失敗する可能性のある関数はラップする |
CERT.CONC.ATOMIC_COMP_FAIL_IN_LOOP ループで疑似的に失敗する可能性のある関数はラップしてください |
| CERT CON43-C (L3): マルチスレッドコードでデータ競合を許可しない | |
| CERT DCL30-C (L2): 適切なストレージ期間のオブジェクトを宣言する |
LOCRET.ARG 関数がローカル変数のアドレスを返しています LOCRET.GLOB 関数がローカル変数のアドレスを返しています LOCRET.RET 関数がローカル変数のアドレスを返しています |
| CERT DCL31-C (L3): 識別子を使用する前に宣言する |
CWARN.IMPLICITINT 古い用法の 'implicit int' MISRA.DECL.NO_TYPE 宣言から型が抜けています MISRA.FUNC.NOPROT.CALL 関数が呼び出されていますが、プロトタイプがありません RETVOID.IMPLICIT 暗黙的な int 関数によって void 値が返されます |
| CERT DCL36-C (L2): 競合するリンク分類を持つ識別子を宣言しない |
MISRA.FUNC.STATIC.REDECL 関数またはオブジェクトの再宣言に 'static' 修飾子がありません |
| CERT DCL37-C (L3): 予約済みの識別子を宣言または定義しない |
MISRA.DEFINE.WRONGNAME.UNDERSCORE 予約名がマクロ名に使用されています MISRA.STDLIB.WRONGNAME 標準ライブラリのマクロ、オブジェクトまたは関数の名前が再使用されています MISRA.STDLIB.WRONGNAME.UNDERSCORE 予約名が言語エンティティの名前に使用されています |
| CERT DCL38-C (L3): フレキシブル配列メンバーの宣言時には正しい構文を使用する |
CERT.STRUCT.FLEXIBLE_ARRAY_MEMBER フレキシブル配列メンバーの宣言時には正しい構文を使用する |
| CERT DCL39-C (L3): 信頼境界を越えて構造を渡すときに情報のリークを避ける |
PORTING.STORAGE.STRUCT 構造の要素のバイト位置が配置属性およびパッケージ属性に依存している可能性があります。 |
| CERT DCL40-C (L3): 同一の関数やオブジェクトに対して互換性のない宣言を行わない |
MISRA.FUNC.NOPROT.DEF.2012 関数は定義されていますが、プロトタイプがありません MISRA.FUNC.PARAMS.IDENT 関数の宣言と定義で使用される識別子が一致していません |
| CERT DCL41-C (L2): switch ステートメント内では最初の case ラベルより前で変数を宣言しない |
CERT.DCL.SWITCH.VAR_BEFORE_CASE switch ステートメント内では最初の case ラベルより前で変数を宣言しないでください |
| CERT ENV30-C (L3): 特定の関数の戻り値で参照されるオブジェクトを変更しない |
MISRA.STDLIB.CTYPE.RANGE.2012_AMD1 ctype.h で関数に渡される値はすべて unsigned char として表現できるか、または値 EOF でなければなりません MISRA.STDLIB.ILLEGAL_REUSE.2012_AMD1 標準ライブラリ関数 asctime または同様の関数によって返されるポインタは、同じ関数の後続の呼び出しに続いては使用しません MISRA.STDLIB.ILLEGAL_WRITE.2012_AMD1 標準ライブラリ関数 localeconv、getenv、setlocale、または strerror が返すポインターは、必ずそれらが const-qualified 型を指すポインターを持つかのように使用する必要があります。 |
| CERT ENV31-C (L3): 環境ポインターを無効にする可能性のある操作の後に環境ポインターに依存しない | |
| CERT ENV32-C (L1): すべての exit ハンドラーは正常に戻る必要がある |
CERT.EXIT.HANDLER_TERMINATE すべての exit ハンドラーは正常に戻る必要があります |
| CERT ENV33-C (L1): system() を呼び出さない |
SV.CODE_INJECTION.SHELL_EXEC シェル実行へのコマンドインジェクション |
| CERT ENV34-C (L3): 特定の関数が返すポインターを格納しない |
MISRA.STDLIB.ILLEGAL_REUSE.2012_AMD1 標準ライブラリ関数 asctime または同様の関数によって返されるポインタは、同じ関数の後続の呼び出しに続いては使用しません |
| CERT ERR30-C (L1): errno を設定することがわかっているライブラリ関数を呼び出す前に errno をゼロに設定し、その関数が失敗を示す値を返した後でのみ errno をチェックする |
CXX.ERRNO.INCORRECTLY_CHECKED ライブラリ関数を呼び出した後に、errno の条件チェックは必要ない CXX.ERRNO.NOT_CHECKED ライブラリ関数を呼び出した後に、errno の条件チェックが欠落している CXX.ERRNO.NOT_SET ライブラリ関数を呼び出す前に、errno はゼロにリセットされていない |
| CERT ERR32-C (L3): errno の不定値に依存しない |
MISRA.INCL.SIGNAL.2012 標準ヘッダーファイル signal.h は使用しない MISRA.STDLIB.SIGNAL signal.h の信号処理装置の使用 |
| CERT ERR33-C (L1): 標準ライブラリのエラーを検出し、処理する |
NPD.CHECK.MUST ポインタを明示的に NULL チェックした後に逆参照します NPD.FUNC.MUST NULL を返す可能性がある関数の戻り値が逆参照されます SV.RVT.RETVAL_NOTTESTED 戻り値の無視 |
| CERT ERR34-C (L2): 文字列を数値に変換する際にエラーを検出する |
CERT.ERR.CONV.STR_TO_NUM 文字列を数値に変換する際にエラーを検出する MISRA.STDLIB.ATOI ライブラリ stdlib.h から 'atof'、'atoi' または 'atol' が使用されています SV.BANNED.RECOMMENDED.SCANF 禁止が推奨されているAPI: 安全でない scanf 型関数 |
| CERT EXP30-C (L2): 副作用の評価の順序に依存しない |
MISRA.INCR_DECR.OTHER 増分または減分の演算子がその他の演算子と混合して式で使用されています PORTING.VAR.EFFECTS ある使用法が副次的な影響を受ける式で変数が 2 回使用されています |
| CERT EXP32-C (L2): nonvolatile 参照を使用して volatile オブジェクトにアクセスしないでください |
CERT.EXPR.VOLATILE.ADDR 非 volatile ポインタを通して volatile オブジェクトにアクセスしてはいけません CERT.EXPR.VOLATILE.ADDR.PARAM 非 volatile ポインタを介して volatile オブジェクトを関数に渡さないでください CERT.EXPR.VOLATILE.PTRPTR 非 volatile ポインタへの参照を volatile ポインタのポインタに割り当てないでください |
| CERT EXP33-C (L1): 初期化されていないメモリの読み込みを行わない |
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 未初期化の変数 |
| CERT EXP34-C (L1): null ポインターを逆参照しない |
NPD.CHECK.CALL.MIGHT ポインタを明示的に NULL チェックした後に逆参照する可能性のある関数に渡す可能性があります NPD.CHECK.CALL.MUST ポインタを明示的に NULL チェックした後に逆参照する可能性がある関数に渡します NPD.CHECK.MIGHT ポインタを明示的に NULL チェックした後に逆参照する可能性があります NPD.CHECK.MUST ポインタを明示的に NULL チェックした後に逆参照します NPD.CONST.CALL 逆参照する可能性のある関数に NULL を渡しています NPD.CONST.DEREF NULL は逆参照されます NPD.FUNC.CALL.MIGHT NULL を返す関数の戻り値が、これを逆参照する可能性のある別の関数に渡される可能性があります NPD.FUNC.CALL.MUST NULL を返す関数の戻り値が、これを逆参照する可能性がある別の関数に渡されます NPD.FUNC.MIGHT NULL を返す可能性のある関数の戻り値が逆参照される場合があります NPD.FUNC.MUST NULL を返す可能性がある関数の戻り値が逆参照されます NPD.GEN.CALL.MIGHT NULLポインタを逆参照する可能性がある関数に渡す場合があります NPD.GEN.CALL.MUST NULLポインタを逆参照する関数に渡します NPD.GEN.MIGHT NULLポインタを逆参照する可能性があります NPD.GEN.MUST null ポインターが逆参照されます RNPD.CALL NULL チェック前のポインタの、関数呼び出しにおける逆参照は問題となる可能性があります RNPD.DEREF NULL チェック前のポインタの逆参照は問題となる可能性があります |
| CERT EXP35-C (L2): 一時的な存続期間を持つオブジェクトを変更しない |
CERT.EXPR.TEMP_OBJ.MOD 一時的な存続期間を持つオブジェクトを変更しない |
| CERT EXP36-C (L3): より厳密に整列されたポインター型にポインターをキャストしない |
MISRA.CAST.OBJ_PTR_TO_OBJ_PTR.2012 オブジェクト タイプを指すポインタと、異なるオブジェクト タイプを指す別のポインタとの間のキャスト |
| CERT EXP37-C (L3): 適切な数字と引数の型で関数を呼び出す |
MISRA.FUNC.UNMATCHED.PARAMS 関数に渡される仮引数と実際のパラメーターの数が一致しません |
| CERT EXP39-C (L3): 互換性のない型のポインターを使用して変数にアクセスしない |
MISRA.CAST.FUNC_PTR.2012 関数を指すポインタと、別の非互換タイプとの間で実行された変換 MISRA.CAST.INCOMPLETE_PTR_TO_ANY.2012 不完全なタイプ を指すポインタと、別のタイプとの間で実行された変換 MISRA.CAST.OBJ_PTR_TO_NON_INT.2012 オブジェクトを指すポインタと、非整数算術演算タイプとの間のキャスト MISRA.CAST.OBJ_PTR_TO_OBJ_PTR.2012 オブジェクト タイプを指すポインタと、異なるオブジェクト タイプを指す別のポインタとの間のキャスト |
| CERT EXP40-C (L3): 定数オブジェクトを変更しない | |
| CERT EXP42-C (L1): パディングデータを比較しない |
MISRA.STDLIB.MEMCMP.PTR_ARG_TYPES 標準ライブラリ関数 memcmp へのポインター引数は、ポインター型、本質的に符号付きの型、本質的に符号なしの型、本質的にブール型、または本質的に列挙型のどれかです |
| CERT EXP43-C (L3): restrict で修飾されたポインターの使用時には未定義の動作を避ける |
MISRA.TYPE.RESTRICT.QUAL.2012 restrict 型修飾子は使用しない |
| CERT EXP44-C (L3): sizeof、_Alignof、または _Generic のオペランドの副作用に頼らない |
MISRA.SIZEOF.SIDE_EFFECT sizeof のオペランドに副作用があります |
| CERT EXP45-C (L2): 条件式で代入を実行しない |
ASSIGCOND.CALL 割り当て条件 (呼び出し) ASSIGCOND.GEN 割り当て条件 MISRA.ASSIGN.COND 条件内で代入演算子が使用されています |
| CERT EXP46-C (L2): ブール型のオペランドでビット演算子を使用しない |
MISRA.LOGIC.OPERATOR.NOT_BOOL 論理演算ではない演算子のオペランドが実質的にはブール値です |
| CERT EXP47-C (L2): 正しくない型の引数で va_arg を呼び出さない |
CERT.VA_ARG.TYPE 正しくない型の引数で va_arg を呼び出さない |
| CERT FIO30-C (L1): ユーザーからの入力を使って書式文字列を組み立てない |
SV.FMTSTR.GENERIC 書式文字列の脆弱性 SV.TAINTED.FMTSTR 書式文字列での未検証データの使用 |
| CERT FIO32-C (L3): ファイルのみに適した操作をデバイスに対して実行しない | |
| CERT FIO34-C (L1): ファイルから読み込んだ文字と EOF または WEOF を区別する |
CWARN.CMPCHR.EOF 'char' 式と EOF 定数との比較 |
| CERT FIO37-C (L1): fgets() または fgetws() が正常に実行された場合に空でない文字列が返されることを想定していない |
CERT.FIO.FGETS fgets() または fgetws() が正常に実行された場合に空でない文字列が返されることを想定していない |
| CERT FIO38-C (L3): FILE オブジェクトをコピーしない |
MISRA.FILE_PTR.DEREF.2012 FILE オブジェクトへのポインターは逆参照してはなりません MISRA.FILE_PTR.DEREF.CAST.2012 オブジェクトは FILE ポインターにキャストされており、これを逆参照してはなりません。 MISRA.FILE_PTR.DEREF.INDIRECT.2012 FILE オブジェクトへのポインターは、システム関数で間接的に逆参照してはなりません MISRA.FILE_PTR.DEREF.RETURN.2012 FILE オブジェクト(関数の戻り値)へのポインターは逆参照してはなりません |
| CERT FIO39-C (L2): 中間のフラッシュまたは位置調整の関数呼び出しをせずに、ストリームから交互に入力と出力を行わない |
CERT.FIO.NO_FLUSH フラッシュまたは位置調整の関数呼び出しの欠如 |
| CERT FIO40-C (L2): fgets() または fgetws() の失敗時には文字列をリセットする |
CERT.FIO.RESET fgets() または fgetws() の失敗時には文字列をリセットする |
| CERT FIO41-C (L3): 副作用のあるストリーム引数を使用して getc()、putc()、getwc()、または putwc() を呼び出さない | |
| CERT FIO42-C (L3): 不要になったファイルを閉じる |
RH.LEAK リソースリーク |
| CERT FIO44-C (L3): fsetpos() に、fgetpos() から返される値のみを使用する |
CERT.FSETPOS.VALUE fsetpos() に、fgetpos() から返される値のみを使用します |
| CERT FIO45-C (L2): ファイルへのアクセス中に TOCTOU の競合状態を回避する |
SV.TOCTOU.FILE_ACCESS ファイル アクセス時の作成日時/使用日時の競合状態 |
| CERT FIO46-C (L3): 閉じたファイルにアクセスしない |
SV.INCORRECT_RESOURCE_HANDLING.URH 安全でないリソース処理 |
| CERT FIO47-C (L2): 有効な書式文字列を使用する |
SV.FMT_STR.PRINT_FORMAT_MISMATCH.BAD 互換性がない print 関数パラメーターの型 SV.FMT_STR.PRINT_FORMAT_MISMATCH.UNDESIRED 予期しない print 関数パラメーターの型 SV.FMT_STR.PRINT_IMPROP_LENGTH print 関数呼び出しの長さ修飾子の不適切な使用 SV.FMT_STR.PRINT_PARAMS_WRONGNUM.FEW print 関数呼び出しの引数が少なすぎます SV.FMT_STR.PRINT_PARAMS_WRONGNUM.MANY print 関数呼び出しの引数が多すぎます SV.FMT_STR.SCAN_FORMAT_MISMATCH.BAD 互換性がない scan 関数パラメーターの型 SV.FMT_STR.SCAN_FORMAT_MISMATCH.UNDESIRED 予期しない scan 関数パラメーターの型 SV.FMT_STR.SCAN_IMPROP_LENGTH scan 関数呼び出しの長さ修飾子の不適切な使用 SV.FMT_STR.SCAN_PARAMS_WRONGNUM.FEW scan 関数呼び出しの引数が少なすぎます SV.FMT_STR.SCAN_PARAMS_WRONGNUM.MANY scan 関数呼び出しの引数が多すぎます SV.FMT_STR.UNKWN_FORMAT print 関数呼び出しの書式指定子が不明です |
| CERT FLP30-C (L2): 浮動小数点変数をループカウンターとして使用しない |
MISRA.FOR.COUNTER.FLT for ループのカウンターが浮動小数点タイプです |
| CERT FLP32-C (L1): 数学関数のドメインエラーと範囲エラーを防止または検出する |
CERT.MATH.DOMAIN.CHECK 標準ライブラリ数学関数に渡される 1 つ以上の引数が有効なドメイン外にあります CERT.MATH.RANGE.CHECK 範囲エラーを発生させる可能性のあるライブラリ数学関数の呼び出し後にエラー条件をチェックする必要です |
| CERT FLP34-C (L3): 浮動小数点変換は新しい型の範囲に収まるようにする |
MISRA.CAST.FLOAT.WIDER より広い浮動小数点タイプへの浮動小数点式のキャスト MISRA.CAST.FLOAT_INT 整数型への浮動小数点式のキャスト MISRA.CAST.INT_FLOAT 浮動小数点タイプへの複合式のキャスト MISRA.CONV.FLOAT 暗黙的な浮動小数点変換です |
| CERT FLP36-C (L3): 整数値を浮動小数点型に変換する場合は精度を保持する |
PORTING.CAST.FLTPNT 非浮動小数点タイプへの浮動小数点式のキャスト |
| CERT FLP37-C (L3): 浮動小数点値の比較にオブジェクト表現を使用しない |
CERT.MEMCMP.FLOAT_MEMBER メンバーが浮動小数点の場合、比較しないでください MISRA.STDLIB.MEMCMP.PTR_ARG_TYPES 標準ライブラリ関数 memcmp へのポインター引数は、ポインター型、本質的に符号付きの型、本質的に符号なしの型、本質的にブール型、または本質的に列挙型のどれかです |
| CERT INT30-C (L2): 符号なし整数演算がラップしないことを確認する |
CWARN.NOEFFECT.OUTOFRANGE 範囲外の値 NUM.OVERFLOW オーバーフローの可能性 NUM.OVERFLOW.DF 起こり得る数値のオーバーフローまたはラップアラウンド |
| CERT INT31-C (L1): 整数変換により、喪失データや誤解釈データにならないことを確認する |
PORTING.CAST.SIZE サイズが異なる可能性がある型に式がキャストされています |
| CERT INT32-C (L1): 符号付き整数に対する演算がオーバーフローを起こさないようにする |
CWARN.NOEFFECT.OUTOFRANGE 範囲外の値 NUM.OVERFLOW オーバーフローの可能性 NUM.OVERFLOW.DF 起こり得る数値のオーバーフローまたはラップアラウンド |
| CERT INT33-C (L2): 除算および剰余演算により、ゼロ除算エラーが発生しないことを確認する |
DBZ.CONST ゼロ定数による除算が発生しました DBZ.CONST.CALL 値 '0' が除数としてこの値を使用できる関数に渡されます DBZ.GENERAL ゼロ除算が発生した可能性があります DBZ.GENERAL.FLOAT 浮動小数点数のゼロ除算が発生した可能性があります DBZ.ITERATOR ループ反復子でゼロ除算が発生した可能性があります DBZ.ITERATOR.CALL 関数呼出しでゼロ除算が発生した可能性があります DBZ.ITERATOR.FLOAT ループ反復子でゼロ除算が発生した可能性があります |
| CERT INT34-C (L3): 式を負のビット数分シフトさせたり、オペランドに存在するビット数以上にシフトさせたりしない |
MISRA.SHIFT.RANGE.2012 シフト演算子の右側のオペランドは範囲外です - 左側のオペランドの基本タイプのサイズ以上か、または負 |
| CERT INT35-C (L3): 正しい整数精度を使用する | |
| CERT INT36-C (L3): ポインターから整数、または整数からポインターに変換する |
MISRA.CAST.OBJ_PTR_TO_INT.2012 オブジェクトを指すポインタと、整数タイプとの間で実行された変換 |
| CERT MEM30-C (L2): 解放されたメモリにアクセスしない |
UFM.DEREF.MIGHT 解放済みメモリの逆参照の可能性 UFM.DEREF.MUST 解放済みメモリの逆参照 UFM.FFM.MIGHT 解放済みメモリの使用 (二重解放)の可能性 UFM.FFM.MUST 解放済みメモリの解放 UFM.RETURN.MIGHT 解放済みメモリの戻り値への使用の可能性 UFM.RETURN.MUST 解放済みメモリの戻り値への使用 UFM.USE.MIGHT 解放済みメモリの使用の可能性 UFM.USE.MUST 解放済みメモリの使用 |
| CERT MEM31-C (L3): 動的に割り当てられたメモリが不要になったら解放する |
CL.FFM.ASSIGN 解放済みメモリの使用 (二重解放) - operator= が無いため CL.FFM.COPY 解放済みメモリの使用 (二重解放) - コピーコンストラクタが無いため CL.SHALLOW.ASSIGN 解放済みメモリの使用 (二重解放) - 演算子 = での浅いコピー CL.SHALLOW.COPY 解放済みメモリの使用 (二重解放) - コピーコンストラクタでの浅いコピー FMM.MIGHT メモリの解放の不一致の可能性 FMM.MUST メモリの解放の不一致 |
| CERT MEM33-C (L3): フレキシブル配列メンバーを含む構造体の割り当てとコピーは動的に行う |
MISRA.INCOMPLETE.STRUCT 不完全な構造タイプが使用されています MISRA.MEMB.FLEX_ARRAY.2012 柔軟な配列メンバーは宣言しないでください |
| CERT MEM34-C (L2): 動的に割り当てられたメモリのみを解放する |
FNH.MIGHT 非ヒープメモリの解放の可能性 FNH.MUST 非ヒープメモリの解放 |
| CERT MEM35-C (L2): オブジェクトに十分なメモリを割り当てる |
INCORRECT.ALLOC_SIZE 不適切な割り当てサイズ SV.TAINTED.ALLOC_SIZE メモリ割り当て時の未検証の整数の使用 |
| CERT MEM36-C (L3): realloc() を呼び出してオブジェクトのアライメントを変更しない |
AUTOSAR.STDLIB.MEMORY 関数 malloc、calloc、realloc、および free は使用してはなりません |
| CERT MSC30-C (L3): 疑似乱数の生成に rand() 関数を使用しない |
CERT.MSC.STD_RAND_CALL 疑似乱数の生成に std::rand() を使用しないでください |
| CERT MSC32-C (L1): 疑似乱数ジェネレータを適切にシードする |
CERT.MSC.SEED_RANDOM 疑似乱数ジェネレータを適切にシードする |
| CERT MSC33-C (L2): asctime() 関数に無効なデータを渡さない |
CERT.MSC.ASCTIME asctime() 関数に無効なデータを渡さないでください |
| CERT MSC37-C (L2): 制御が非 void 関数の終わりに到達しないことを確認する |
FUNCRET.GEN 非 void 関数に戻り値がありません FUNCRET.IMPLICIT 暗黙的に int を返す非 void 関数に戻り値がありません |
| CERT MSC38-C (L3): 定義済み識別子は、マクロとしてのみ実装されている可能性がある場合は、オブジェクトとして扱わない | |
| CERT MSC39-C (L3): 不定値を持つ va_list に対して va_arg() を呼び出さない |
VA.LIST.INDETERMINATE 不定値を持つ va_list に対する va_arg() の呼び出し |
| CERT MSC40-C (L3): 制約に違反しない |
MISRA.FUNC.STATIC.REDECL 関数またはオブジェクトの再宣言に 'static' 修飾子がありません |
| CERT MSC41-C (L2): 機密情報をハードコード化しない |
CXX.SV.PWD.PLAIN プレーンな文字列を使用してパスワードを設定しようとしています CXX.SV.PWD.PLAIN.LENGTH 15 文字未満の長さでパスワードを設定しようとしています CXX.SV.PWD.PLAIN.LENGTH.ZERO ゼロ文字の長さでパスワードを設定しようとしています HCC ハードコードされた資格情報の使用 HCC.PWD ハードコードされたパスワードの使用 HCC.USER ハードコードされたユーザー名の使用 |
| CERT POS30-C (L1): readlink() 関数を適切に使用する |
ABV.GENERAL バッファオーバーフロー - 配列インデックスが範囲外 ABV.GENERAL.MULTIDIMENSION バッファオーバーフロー - 配列インデックスが範囲外 |
| CERT POS34-C (L2): 自動変数へのポインターを引数として putenv() を呼び出さないでください |
CERT.PUTENV.AUTO_VARIABLE 自動変数へのポインターを引数として putenv() を呼び出さないでください |
| CERT POS35-C (L2): シンボリックリンクの有無を確認しながら競合状態を回避する |
CERT.STR.ASSIGN.CONST_TO_NONCONST const char ポインターを非 const char ポインターに割り当てないでください SV.TOCTOU.FILE_ACCESS ファイル アクセス時の作成日時/使用日時の競合状態 |
| CERT POS36-C (L1): 権限放棄時に正しい廃止順序を守る |
SV.USAGERULES.PERMISSIONS 特権の昇給の使用 |
| CERT POS37-C (L1): 権限が正常に放棄されたことを確認する |
SV.USAGERULES.PERMISSIONS 特権の昇給の使用 |
| CERT POS38-C (L3): fork およびファイル記述子を使用する場合は競合状態に注意する | |
| CERT POS39-C (L1): システム間でのデータ転送時は正しいバイトオーダーを使用する |
BYTEORDER.HTON.SEND ホストバイトオーダーからネットワークバイトオーダーの変換が欠落しています BYTEORDER.HTON.WRITE ホストバイトオーダーからネットワークバイトオーダーの変換が欠落しています BYTEORDER.NTOH.READ ネットワークバイトオーダーからホストバイトオーダーの変換が欠落しています BYTEORDER.NTOH.RECV ネットワークバイトオーダーからホストバイトオーダーの変換が欠落しています |
| CERT POS44-C (L3): シグナルを使用してスレッドを終了しない |
MISRA.INCL.SIGNAL.2012 標準ヘッダーファイル signal.h は使用しない |
| CERT POS47-C (L3): 非同期キャンセルが可能なスレッドを使用してはいけません |
CERT.POS.THREAD.ASYNC_CANCEL 非同期キャンセルが可能なスレッドを使用してはいけません |
| CERT POS48-C (L3): 他の POSIX スレッドのミューテックスをロック解除したり、破壊したりしない | |
| CERT POS49-C (L3): 複数のスレッドからデータにアクセスする必要がある場合は、ミューテックスを提供し、隣接データもアクセスされないようにする | |
| CERT POS50-C (L3): POSIX スレッド間で共有されるオブジェクトは適切な保持期間を指定して宣言する | |
| CERT POS51-C (L3): 事前定義された順序でロックすることにより、POSIX スレッドのデッドロックを回避する |
CONC.DL デッドロック CONC.NO_UNLOCK 変数のロック解除の欠落 |
| CERT POS52-C (L3): POSIX ロックの保持中にブロックする可能性のある操作を実行しない |
CONC.SLEEP クリティカルセクションで関数がブロックされる可能性があります |
| CERT POS53-C (L2): 条件変数に対する並行待機操作に複数のミューテックスを使用しない |
CERT.CONC.COND_MULTIPLE_MUTEX 条件変数に対する並行待機操作に複数のミューテックスを使用しない |
| CERT POS54-C (L1): POSIX ライブラリエラーを検出して処理する |
SV.RVT.RETVAL_NOTTESTED 戻り値の無視 |
| CERT PRE30-C (L3): 連結によってユニバーサル文字名を作成しない |
MISRA.DEFINE.SHARP マクロ定義に # 演算子または ## 演算子が使用されています |
| CERT PRE31-C (L2): 安全でないマクロへの引数で副作用を避ける |
PORTING.VAR.EFFECTS ある使用法が副次的な影響を受ける式で変数が 2 回使用されています |
| CERT PRE32-C (L3): 関数のようなマクロの呼び出しでプリプロセッサディレクティブを使用しない |
MISRA.EXPANSION.DIRECTIVE マクロの引数内にディレクティブのようなトークンがあります |
| CERT SIG30-C (L1): シグナルハンドラー内では非同期安全な関数のみを呼び出す |
CERT.SIG.SIG_HANDLER.ASYNC_SAFE シグナルハンドラー内では非同期セーフな関数のみを呼び出す |
| CERT SIG31-C (L1): シグナルハンドラー内で共有オブジェクトにアクセスしない |
CERT.SIG.SIG_HANDLER.SHARED_OBJ シグナルハンドラー内で共有オブジェクトにアクセスしないでください CERT.SIG.SIG_HANDLER.SHARED_OBJ.HEAP シグナルハンドラー内で共有オブジェクトにアクセスしないでください CERT.SIG.SIG_HANDLER.SHARED_OBJ.MIGHT シグナルハンドラー内で共有オブジェクトにアクセスしないでください |
| CERT SIG34-C (L3): 割り込みが可能なシグナルハンドラ内から signal() を呼び出さない |
MISRA.STDLIB.SIGNAL signal.h の信号処理装置の使用 |
| CERT SIG35-C (L3): 計算例外シグナルハンドラーから復帰しない |
CERT.STDLIB.SIGNAL 計算例外シグナルハンドラーから戻らない |
| CERT STR30-C (L2): 文字列リテラルを変更しない |
CERT.STR.ARG.CONST_TO_NONCONST const char ポインターを非 const char ポインター引数に渡さないでください CERT.STR.ASSIGN.CONST_TO_NONCONST const char ポインターを非 const char ポインターに割り当てないでください |
| CERT STR31-C (L2): 文字列のストレージに文字データと null 終了文字を格納するためのスペースが十分にあることを保証する |
SV.FMT_STR.BAD_SCAN_FORMAT 入力書式指定子エラー SV.UNBOUND_STRING_INPUT.FUNC バインドされていない文字列入力の使用法 |
| CERT STR32-C (L1): 文字列を期待するライブラリ関数には null 以外で終了する文字のシーケンスは渡さない |
NNTS.MIGHT バッファオーバーフロー - 非 NULL 終了文字列 NNTS.MUST バッファオーバーフロー - 非 NULL 終了文字列 SV.STRBO.BOUND_COPY.UNTERM 次の文字列演算でバッファオーバーフローの可能性があります |
| CERT STR34-C (L2): 文字をより大きなサイズの整数に変換する前に、unsigned char 型にキャストする |
CXX.CAST.SIGNED_CHAR_TO_INTEGER より大きな整数サイズに変換する前に char を unsigned char にキャストします |
| CERT STR37-C (L3): 文字処理関数への引数は、unsigned char として表現できなければならない |
AUTOSAR.STDLIB.CCTYPE.UCHAR <cctype> で定義される文字処理関数の引数は、unsigned char として表現できなければなりません MISRA.ETYPE.ASSIGN.2012 より狭い基本タイプ、または、異なる基本タイプカテゴリーのオブジェクトへの割り当て |
| CERT STR38-C (L1): ナロー文字の文字列/関数とワイド文字の文字列/関数を混同しない |
CXX.DIFF.WIDTH.STR_AND_FUNC 関数の呼び出し時にナロー文字列とワイド文字列の間で暗黙のキャストが行われます |
| CERT WIN30-C (L3): 割り当ておよび割り当て解除機能を適切に組み合わせる |
FMM.MIGHT メモリの解放の不一致の可能性 FMM.MUST メモリの解放の不一致 |
CERT C 推奨
| ガイドライン | チェッカー名および説明 |
|---|---|
| CERT API00-C (L3): 関数はパラメーターを検証する必要がある | |
| CERT API01-C (L1): メモリ内で機密データの直前に文字列を配置しないようにする | |
| CERT API02-C (L1): 配列に対して読み取り/書き込みをする関数は、ソースまたはターゲットのサイズを指定する引数を取らなければならない | |
| CERT API03-C (L3): 関連する関数全体で一貫したインターフェイスと機能を作成する | |
| CERT API04-C (L3): 一貫性があり、使いやすいエラーチェックメカニズムを提供する | |
| CERT API05-C (L1): 整合配列パラメーターを使用する | |
| CERT API07-C (L3): 型安全性を強化する | |
| CERT API09-C (L3): 互換性のある値は同じ型でなければならない | |
| CERT API10-C (L3): API ではデフォルトでセキュリティオプションが有効になっていなければならない | |
| CERT ARR00-C (L2): 配列の仕組みを理解する |
ABV.ANY_SIZE_ARRAY バッファオーバーフロー - 配列インデックスが範囲外 ABV.GENERAL バッファオーバーフロー - 配列インデックスが範囲外 ABV.GENERAL.MULTIDIMENSION バッファオーバーフロー - 配列インデックスが範囲外 ABV.ITERATOR バッファオーバーフロー - 配列インデックスが範囲外の可能性 ABV.MEMBER バッファオーバーフロー - 配列インデックスが範囲外 ABV.STACK バッファオーバーフロー - ローカル配列インデックスが範囲外 ABV.TAINTED 未検証の入力によるバッファオーバーフロー ABV.UNICODE.BOUND_MAP 文字関数のマッピング時のバッファオーバーフロー ABV.UNICODE.FAILED_MAP 関数のマッピングに失敗します ABV.UNICODE.NNTS_MAP 文字関数のマッピング時のバッファオーバーフロー ABV.UNICODE.SELF_MAP 関数のマッピングに失敗します ABV.UNKNOWN_SIZE バッファオーバーフロー - 配列インデックスが範囲外 NNTS.MIGHT バッファオーバーフロー - 非 NULL 終了文字列 NNTS.MUST バッファオーバーフロー - 非 NULL 終了文字列 NNTS.TAINTED 未検証のユーザー入力が原因のバッファオーバーフロー - 非 NULL 終了文字列 SV.STRBO.BOUND_COPY.OVERFLOW バインドされた文字列コピーでのバッファオーバーフロー SV.STRBO.BOUND_COPY.UNTERM 次の文字列演算でバッファオーバーフローの可能性があります SV.STRBO.BOUND_SPRINTF バインドされた sprintf でのバッファオーバーフロー SV.STRBO.UNBOUND_COPY バインドされていない文字列コピーでのバッファオーバーフロー SV.STRBO.UNBOUND_SPRINTF バインドされていない sprintf でのバッファオーバーフロー SV.TAINTED.ALLOC_SIZE メモリ割り当て時の未検証の整数の使用 SV.TAINTED.CALL.INDEX_ACCESS 関数呼び出し時の配列インデックスとしての未検証の整数の使用 SV.TAINTED.CALL.LOOP_BOUND 関数呼び出しのループ条件での未検証の整数の使用 SV.TAINTED.INDEX_ACCESS 配列インデックスとしての未検証の整数の使用 SV.TAINTED.LOOP_BOUND ループ条件での未検証の整数の使用 SV.UNBOUND_STRING_INPUT.CIN バインドされていない文字列入力についての cin の使用法 SV.UNBOUND_STRING_INPUT.FUNC バインドされていない文字列入力の使用法 |
| CERT ARR01-C (L1): 配列のサイズを使用するときにポインターに sizeof 演算子を適用しない |
CWARN.MEMSET.SIZEOF.PTR ポインタに適用される 'sizeof' には、memset のような関数が呼び出されます |
| CERT ARR02-C (L2): 初期化子によって暗黙的に定義されている場合でも配列境界を明示的に指定する | |
| CERT CON01-C (L3): 同期プリミティブの取得と解放は同一のモジュール内の同一の抽象化レベルで行う | |
| CERT CON02-C (L3): volatile を同期プリミティブとして使用しない | |
| CERT CON03-C (L3): 共有変数にアクセスする場合は可視性を確保する | |
| CERT CON04-C (L3): 終了ステータスが重要でない場合でもスレッドを結合または切り離す | |
| CERT CON05-C (L3): ロックの保持中にブロックする可能性のある操作を実行しない |
CONC.SLEEP クリティカルセクションで関数がブロックされる可能性があります |
| CERT CON06-C (L3): すべてのミューテックスが保護対象のデータよりも長く存続するようにする | |
| CERT CON07-C (L2): 共有変数に対する複合操作のアトミック性を確保する | |
| CERT CON08-C (L3): 独立したアトミックメソッドの呼び出しグループがアトミックグループであると想定しない | |
| CERT CON09-C (L3): ロックフリーアルゴリズムを使用する場合は ABA 問題を回避する | |
| CERT DCL00-C (L3): 不変オブジェクトは const 修飾する | |
| CERT DCL01-C (L3): サブスコープで変数名を再利用しない |
MISRA.VAR.HIDDEN 内部のスコープで宣言された識別子によって外部のスコープの識別子が非表示になっています |
| CERT DCL02-C (L3): 視覚的に区別できる識別子を使用する | |
| CERT DCL03-C (L3): 静的アサーションを使用して定数式の値をテストする | |
| CERT DCL04-C (L3): 1 つの宣言で複数の変数を宣言しない | |
| CERT DCL05-C (L3): 非ポインター型の typedef のみを使用する | |
| CERT DCL06-C (L3): シンボリック定数を使用してリテラル値を表す |
CERT.LITERAL.ARRAY シンボリック定数を使用してリテラル配列サイズ値を表す CERT.LITERAL.BITFIELD シンボリック定数を使用してリテラルビットフィールド値を表す CERT.LITERAL.CHAR.CONST シンボリック定数を使用してリテラル文字値を表す CERT.LITERAL.FLT.CONST シンボリック定数を使用してリテラル浮動小数点値を表す CERT.LITERAL.INT.CONST シンボリック定数を使用してリテラル整数値を表す CERT.LITERAL.STR.CONST シンボリック定数を使用してリテラル文字列値を表す |
| CERT DCL07-C (L3): 関数宣言子に適切な型情報を含める |
MISRA.CAST.FUNC_PTR.2012 関数を指すポインタと、別の非互換タイプとの間で実行された変換 MISRA.FUNC.NOPROT.DEF.2012 関数は定義されていますが、プロトタイプがありません MISRA.FUNC.PROT_FORM.KR.2012 関数タイプはプロトタイプ形式です |
| CERT DCL08-C (L3): 定数定義内で関係を適切にエンコードする | |
| CERT DCL09-C (L3): 戻り型が errno_t である errno を返す関数を宣言する | |
| CERT DCL10-C (L2): variadic 関数のライター (書き込み側) とコーラー (呼び出し側) 間の契約を維持する |
SV.FMT_STR.PRINT_PARAMS_WRONGNUM.FEW print 関数呼び出しの引数が少なすぎます SV.FMT_STR.PRINT_PARAMS_WRONGNUM.MANY print 関数呼び出しの引数が多すぎます SV.FMT_STR.SCAN_PARAMS_WRONGNUM.FEW scan 関数呼び出しの引数が少なすぎます SV.FMT_STR.SCAN_PARAMS_WRONGNUM.MANY scan 関数呼び出しの引数が多すぎます |
| CERT DCL11-C (L1): variadic 関数に関連する型の指摘を理解する |
MISRA.FUNC.VARARG 関数が可変数の引数を持っています SV.FMT_STR.PRINT_FORMAT_MISMATCH.BAD 互換性がない print 関数パラメーターの型 SV.FMT_STR.PRINT_FORMAT_MISMATCH.UNDESIRED 予期しない print 関数パラメーターの型 SV.FMT_STR.PRINT_IMPROP_LENGTH print 関数呼び出しの長さ修飾子の不適切な使用 SV.FMT_STR.PRINT_PARAMS_WRONGNUM.FEW print 関数呼び出しの引数が少なすぎます SV.FMT_STR.PRINT_PARAMS_WRONGNUM.MANY print 関数呼び出しの引数が多すぎます SV.FMT_STR.SCAN_FORMAT_MISMATCH.BAD 互換性がない scan 関数パラメーターの型 SV.FMT_STR.SCAN_FORMAT_MISMATCH.UNDESIRED 予期しない scan 関数パラメーターの型 SV.FMT_STR.UNKWN_FORMAT.SCAN scan 関数呼び出しの書式指定子が不明です |
| CERT DCL12-C (L3): 不透明型を使用して抽象データ型を実装する | |
| CERT DCL13-C (L3): 関数によって変更されていない値へのポインターである関数パラメーターを const として宣言する |
MISRA.PPARAM.NEEDS.CONST ポインタパラメーターを使用しないでアドレスされたオブジェクトを変更していますが、const を指すポインタとして宣言されていません |
| CERT DCL15-C (L3): 外部リンクを必要としないファイルスコープオブジェクトまたは関数を静的オブジェクトまたは関数として宣言する | |
| CERT DCL16-C (L3): long 値を示すには「l」ではなく「L」を使用する | |
| CERT DCL17-C (L3): 誤ってコンパイルされた volatile 修飾変数に注意する | |
| CERT DCL18-C (L3): 10 進値を指定するときに整数定数を 0 で開始しない |
MISRA.TOKEN.OCTAL.ESCAPE 8 進数のエスケープ文字列の使用 MISRA.TOKEN.OCTAL.INT 8 進数の整数定数を使用しています |
| CERT DCL19-C (L3): 変数とメソッドのスコープを最小限にする |
CERT.STATIC.SINGLE.USE ファイルスコープの静的変数は 1 つの関数でのみアクセスされる CERT.TU.UNUSED.GLOBAL.DECL グローバル識別子は宣言されているが、この変換ユニットでは使用されない CXX.ID_VIS.GLOBAL_VARIABLE.EXTERN extern グローバル変数の可視範囲が広すぎます CXX.ID_VIS.GLOBAL_VARIABLE.STATIC static グローバル変数の可視範囲が広すぎます MISRA.VAR.MIN.VIS 名前の可視性が高すぎます |
| CERT DCL20-C (L1): 関数が引数を受け付けないときは、明示的に void を指定する |
MISRA.FUNC.NO_PARAMS パラメーターのない関数に void パラメータータイプがありません |
| CERT DCL21-C (L3): 複合リテラルの記憶域について理解する | |
| CERT DCL22-C (L3): キャッシュできないデータには volatile を使用する | |
| CERT DCL23-C (L2): 相互に識別可能な識別子が一意であることを保証する |
MISRA.IDENT.DISTINCT.C99.2012 同一のスコープまたは同一の名前空間で宣言された識別子が区別されていません |
| CERT ENV01-C (L2): 環境変数のサイズについて仮定を行わない |
ABV.ANY_SIZE_ARRAY バッファオーバーフロー - 配列インデックスが範囲外 ABV.GENERAL バッファオーバーフロー - 配列インデックスが範囲外 ABV.GENERAL.MULTIDIMENSION バッファオーバーフロー - 配列インデックスが範囲外 ABV.ITERATOR バッファオーバーフロー - 配列インデックスが範囲外の可能性 ABV.MEMBER バッファオーバーフロー - 配列インデックスが範囲外 ABV.STACK バッファオーバーフロー - ローカル配列インデックスが範囲外 ABV.TAINTED 未検証の入力によるバッファオーバーフロー ABV.UNICODE.BOUND_MAP 文字関数のマッピング時のバッファオーバーフロー ABV.UNICODE.FAILED_MAP 関数のマッピングに失敗します ABV.UNICODE.NNTS_MAP 文字関数のマッピング時のバッファオーバーフロー ABV.UNICODE.SELF_MAP 関数のマッピングに失敗します ABV.UNKNOWN_SIZE バッファオーバーフロー - 配列インデックスが範囲外 |
| CERT ENV02-C (L3): 同じ有効名を持つ複数の環境変数に注意する | |
| CERT ENV03-C (L2): 外部プログラムを呼び出す場合は環境をサニタイズする | |
| CERT ERR00-C (L3): 一貫性のある包括的なエラー処理方針を採用して実施する | |
| CERT ERR01-C (L2): errno ではなく ferror() を使用して FILE ストリームエラーをチェックする | |
| CERT ERR02-C (L3): インバンドエラーインジケーターを使用しないようにする | |
| CERT ERR04-C (L3): 適切な終了戦略を選択する | |
| CERT ERR05-C (L2): アプリケーション非依存のコードでは、エラー処理を命令せずに、エラー検出を指定しなければならない | |
| CERT ERR06-C (L3): assert() と abort() の終了動作について理解する | |
| CERT ERR07-C (L1): エラーチェックをサポートしない関数よりもサポートする同等の関数を優先する | |
| CERT EXP00-C (L2): 操作の優先順位のために括弧を使用する |
CERT.EXPR.PARENS 式内の演算子の優先度は明示的にする必要があります。 |
| CERT EXP02-C (L3): 論理 AND 演算子と OR 演算子の短絡動作に注意する |
MISRA.LOGIC.SIDEEFF 論理 'and' 式または論理 'or' 式の右側のオペランドは副作用があります |
| CERT EXP03-C (L3): 構造体のサイズがそのメンバーのサイズの合計であると想定しない | |
| CERT EXP05-C (L3): const 修飾子をキャストして外さない | |
| CERT EXP07-C (L3): 式の中で定数の値を仮定することで定数のメリットが損なわれないようにする | |
| CERT EXP08-C (L2): ポインター算術が適切に使用されていることを確認する |
ABV.GENERAL バッファオーバーフロー - 配列インデックスが範囲外 ABV.GENERAL.MULTIDIMENSION バッファオーバーフロー - 配列インデックスが範囲外 ABV.ITERATOR バッファオーバーフロー - 配列インデックスが範囲外の可能性 |
| CERT EXP09-C (L2): sizeof を使用して型または変数のサイズを決定する | |
| CERT EXP10-C (L2): 副次式の評価の順序や、副作用が発生する順序には依存しない |
CERT.MULTI.FUNC.ARG.CALLS 副次式の評価の順序や、副作用が発生する順序には依存しない |
| CERT EXP11-C (L3): ビットフィールドを持つ構造体のレイアウトについて勝手な想定をしない | |
| CERT EXP12-C (L3): 関数から返される値を無視しない |
MISRA.FUNC.UNUSEDRET.2012 非 void 関数の戻り値を使用してください SV.RVT.RETVAL_NOTTESTED 戻り値の無視 |
| CERT EXP13-C (L3): 関係演算子と等価演算子は結合則が成り立たないものとして扱う | |
| CERT EXP14-C (L3): int より小さい整数型に対してビット演算を実行する場合は整数の昇格に注意する | |
| CERT EXP15-C (L1): セミコロンを if、for、または while ステートメントと同じ行に置かない |
SEMICOL セミコロンの位置を確認してください |
| CERT EXP16-C (L2): 関数ポインターを定数値と比較しない |
CWARN.FUNCADDR この関数の呼び出しの代わりに、関数アドレスが使用されます CWARN.NULLCHECK.FUNCNAME 関数アドレスが 0 と直接比較されます |
| CERT EXP19-C (L1): if、for、または while ステートメントの本体に波括弧を使用する |
MISRA.IF.NO_COMPOUND if/else ステートメントのボディが複合ステートメントではありません MISRA.STMT.NO_COMPOUND switch、while、do/while または for ステートメントのボディが複合ステートメントではありません |
| CERT EXP20-C (L1): 成功、真偽、等価性を判断するための明示的なテストを実行する | |
| CERT FIO01-C (L1): 識別にファイル名を使用する関数の使用は慎重に行う |
SV.TOCTOU.FILE_ACCESS ファイル アクセス時の作成日時/使用日時の競合状態 |
| CERT FIO02-C (L3): 汚染された情報源から取得したパス名は正規化する |
SV.DLLPRELOAD.NONABSOLUTE.DLL DLL プリロードのハイジャック ベクターの可能性 SV.TOCTOU.FILE_ACCESS ファイル アクセス時の作成日時/使用日時の競合状態 |
| CERT FIO03-C (L3): fopen() とファイル作成について勝手な想定をしない | |
| CERT FIO05-C (L3): 複数のファイル属性を使用してファイルを識別する | |
| CERT FIO06-C (L3): 適切なアクセス権限を使用してファイルを作成する | |
| CERT FIO08-C (L3): 開いているファイルに対して remove() を呼び出す場合は注意する | |
| CERT FIO09-C (L3): システム間でデータを転送する場合はバイナリデータに注意する | |
| CERT FIO10-C (L3): rename() 関数を使用する場合は注意する | |
| CERT FIO11-C (L3): fopen() の mode パラメーターを指定する場合は注意する | |
| CERT FIO13-C (L3): 読み取られた文字以外のものを決してプッシュバックしない | |
| CERT FIO14-C (L3): ファイルストリームでのテキストモードとバイナリモードの違いについて理解する | |
| CERT FIO15-C (L3): 安全なディレクトリ内でファイル操作が実行されるようにする | |
| CERT FIO17-C (L2): fread() を使用する場合は末尾の null 文字に依存しない | |
| CERT FIO18-C (L3): fwrite() で書き込みプロセスが null 文字で終了するものと想定しない | |
| CERT FIO19-C (L3): 通常のファイルのサイズ計算に fseek() と ftell() を使用しない | |
| CERT FIO20-C (L1): fgets() または fgetws() を使用する場合に意図しない切り捨てが発生しないようにする | |
| CERT FIO21-C (L3): 共有ディレクトリ内に一時ファイルを作成しない | |
| CERT FIO22-C (L3): プロセスを生成する前にファイルを閉じる |
RH.LEAK リソースリーク |
| CERT FIO23-C (L3): フラッシュされていないデータを stdout または stderr に残して終了しない | |
| CERT FIO24-C (L3): 既に開いているファイルを開かない | |
| CERT FLP00-C (L3): 浮動小数点数に関する制限について理解する | |
| CERT FLP01-C (L3): 浮動小数点式の順序変更に注意する | |
| CERT FLP02-C (L3): 正確な計算が必要な場合は浮動小数点数の使用を避ける | |
| CERT FLP03-C (L3): 浮動小数点エラーを検出して処理する | |
| CERT FLP04-C (L3): 浮動小数点数入力が例外値でないかチェックする | |
| CERT FLP05-C (L3): 非正規化数を使用しない | |
| CERT FLP06-C (L3): 浮動小数点演算の場合は整数を浮動小数点に変換する | |
| CERT FLP07-C (L3): 浮動小数点型を返す関数の戻り値をキャストする |
CERT.RTN.FLT.CAST.DBL 浮動小数点型を返す関数の戻り値をキャストする CERT.RTN.FLT.IMPLICIT.CAST.DBL 浮動小数点型を返す関数の戻り値をキャストする |
| CERT INT00-C (L3): 実装で使用されるデータモデルについて理解する | |
| CERT INT01-C (L2): オブジェクトのサイズを表すすべての整数値には size_t または rsize_t を使用する | |
| CERT INT02-C (L3): 整数変換規則を理解する |
MISRA.CAST.INT 自明ではない整数式が広い型または別の符号を持つ型にキャストされています MISRA.CAST.UNSIGNED_BITS unsigned char または short でのビット演算の結果は元の型にキャストできません MISRA.CONV.INT.SIGN 暗黙的な整数変換により符号が変わります MISRA.CVALUE.IMPL.CAST 暗黙の型変換で符号、型サイズ、型の違いにより情報の損失を起こす記述があります。 MISRA.UMINUS.UNSIGNED 単項マイナス演算子が符号なしオペランドに対して使用されています。 PRECISION.LOSS 精度の損失 |
| CERT INT04-C (L1): 汚染された情報源から取得した整数値に制限を強制する |
SV.TAINTED.ALLOC_SIZE メモリ割り当て時の未検証の整数の使用 SV.TAINTED.BINOP バイナリ演算での未検証整数値の使用 SV.TAINTED.CALL.BINOP バイナリ演算での未検証整数値の使用 SV.TAINTED.CALL.INDEX_ACCESS 関数呼び出し時の配列インデックスとしての未検証の整数の使用 SV.TAINTED.CALL.LOOP_BOUND 関数呼び出しのループ条件での未検証の整数の使用 SV.TAINTED.INDEX_ACCESS 配列インデックスとしての未検証の整数の使用 SV.TAINTED.LOOP_BOUND ループ条件での未検証の整数の使用 |
| CERT INT05-C (L2): 可能なすべての入力を処理できない場合は、入力関数を使用して文字データを変換しない | |
| CERT INT07-C (L1): 数値には明示的に符号付きまたは符号なしの char 型のみを使用する |
PORTING.SIGNED.CHAR 明示的に符号が指定されずに 'char' が使用されます |
| CERT INT08-C (L3): すべての整数値が範囲内であることを検証する | |
| CERT INT09-C (L3): 列挙定数が一意の値にマッピングされていることを確認する |
MISRA.ENUM.IMPLICIT.VAL.NON_UNIQUE.2012 暗黙的列挙子値は一意ではありません |
| CERT INT10-C (L3): % 演算子を使用する場合は正の剰余を想定しない | |
| CERT INT12-C (L3): 式で使用される場合、プレーンな int ビットフィールドの型について仮定しない |
MISRA.BITFIELD.TYPE ビットフィールドのタイプは、符号付き/符号なし整数のいずれでもありません |
| CERT INT13-C (L2): ビット演算子は符号なしオペランドでのみ使用する |
MISRA.BITS.NOT_UNSIGNED ビット演算のオペランドが符号なし整数ではありません MISRA.BITS.NOT_UNSIGNED.PREP ビット演算のオペランドが符号なし整数ではありません |
| CERT INT14-C (L3): 同じデータに対してビット演算と算術演算を実行しない | |
| CERT INT15-C (L2): プログラマー定義の整数型に対する書式指定の入出力には intmax_t または uintmax_t を使用する | |
| CERT INT16-C (L3): 符号付き整数の表現について勝手な想定をしない | |
| CERT INT17-C (L3): 整数定数は実装に依存しない方法で定義する | |
| CERT INT18-C (L1): より大きなサイズの整数式との比較や代入を行う前に、その整数式を評価する |
PORTING.CAST.SIZE サイズが異なる可能性がある型に式がキャストされています |
| CERT MEM00-C (L1): 同一の抽象化レベルで同一のモジュール内でメモリの割り当ておよび解放を行う |
FNH.MIGHT 非ヒープメモリの解放の可能性 FNH.MUST 非ヒープメモリの解放 FUM.GEN.MIGHT 未割り当てメモリの解放の可能性 FUM.GEN.MUST 未割り当てメモリの解放 MLK.MIGHT メモリリークの可能性 MLK.MUST メモリリーク MLK.RET.MIGHT メモリリークの可能性 MLK.RET.MUST メモリリーク RH.LEAK リソースリーク UFM.DEREF.MIGHT 解放済みメモリの逆参照の可能性 UFM.DEREF.MUST 解放済みメモリの逆参照 UFM.FFM.MIGHT 解放済みメモリの使用 (二重解放)の可能性 UFM.FFM.MUST 解放済みメモリの解放 UFM.RETURN.MIGHT 解放済みメモリの戻り値への使用の可能性 UFM.RETURN.MUST 解放済みメモリの戻り値への使用 UFM.USE.MIGHT 解放済みメモリの使用の可能性 UFM.USE.MUST 解放済みメモリの使用 |
| CERT MEM01-C (L2): free() の直後に新しい値をポインターに保存する | |
| CERT MEM02-C (L3): メモリ割り当て関数の呼び出し結果は、割り当てられた型へのポインターに直ちにキャストする | |
| CERT MEM03-C (L3): 再利用可能なリソースに保存された機密情報は消去する | |
| CERT MEM04-C (L2): ゼロ長の割り当てに注意する |
MISRA.LANG.OBSOLESCENT.REALLOC_ZERO_SIZE.2023 サイズ引数ゼロでの 'realloc' の呼び出しは廃止された機能です |
| CERT MEM05-C (L1): 大きなスタック割り当てを避ける |
MISRA.FUNC.RECUR 再帰関数 |
| CERT MEM06-C (L3): 機密データがディスクに書き込まれないようにする | |
| CERT MEM07-C (L2): calloc() の引数は、乗算された場合にラップアラウンドされないようにする | |
| CERT MEM10-C (L3): ポインター検証関数を定義して使用する | |
| CERT MEM11-C (L3): ヒープ領域が無限にあると想定しない | |
| CERT MEM12-C (L3): リソースの使用および解放時にエラーが発生した際に関数を抜ける場合には、goto チェーンの使用を検討する |
MLK.MIGHT メモリリークの可能性 MLK.MUST メモリリーク MLK.RET.MIGHT メモリリークの可能性 MLK.RET.MUST メモリリーク RH.LEAK リソースリーク |
| CERT MSC00-C (L3): 高い警告レベルでのコンパイルで警告が出ないようにする | |
| CERT MSC01-C (L3): 論理的な完全さを追求する |
CWARN.EMPTY.LABEL ラベルステートメントが空です INFINITE_LOOP.GLOBAL 無限ループ INFINITE_LOOP.LOCAL 無限ループ INFINITE_LOOP.MACRO 無限ループ LA_UNUSED ラベルが使用されていません MISRA.IF.NO_ELSE if/else-if ステートメントのチェインが else で終了していないか、または空の else 句で終了しています MISRA.SWITCH.WELL_FORMED.DEFAULT.2012 各 switch ステートメントはデフォルトラベルを有するべきです。 |
| CERT MSC04-C (L3): 一貫して読みやすい形でコメントを使用する | |
| CERT MSC05-C (L3): time_t 型の値を直接操作しない | |
| CERT MSC06-C (L1): コンパイラの最適化に注意する | |
| CERT MSC07-C (L3): 到達不能コードを検出して削除する [廃止] |
INVARIANT_CONDITION.UNREACH 不変な条件式 LA_UNUSED ラベルが使用されていません UNREACH.ENUM enum が取りうる値が原因で、コードは到達不能になっています UNREACH.GEN 到達不能コード UNREACH.RETURN 到達不能な void return文 UNREACH.SIZEOF アーキテクチャに関連した到達不能コード |
| CERT MSC09-C (L3): 文字エンコーディング: 安全のため、ASCII のサブセットを使用する | |
| CERT MSC10-C (L3): 文字エンコーディング: UTF8 に関連する問題 | |
| CERT MSC11-C (L3): 診断テストはアサートを使用して組み込む | |
| CERT MSC12-C (L3): 影響を与えないコード、または決して実行されないコードを検出して削除する |
CWARN.NOEFFECT.SELF_ASSIGN 変数は自身に割り当てられます CWARN.NOEFFECT.UCMP.GE 符号なし値と 0 との比較は、常に true になります CWARN.NOEFFECT.UCMP.GE.MACRO マクロ内で符号なし値と 0 との比較は、常に true になります CWARN.NOEFFECT.UCMP.LT 符号なし値と 0 との比較は、常に false になります CWARN.NOEFFECT.UCMP.LT.MACRO マクロ内で符号なし値と 0 との比較は、常に false になります CWARN.NULLCHECK.FUNCNAME 関数アドレスが 0 と直接比較されます EFFECT ステートメントの影響はありません INVARIANT_CONDITION.UNREACH 不変な条件式 LA_UNUSED ラベルが使用されていません MISRA.STMT.NO_EFFECT そのステートメントは副作用がなく、制御フローを変更しません UNREACH.ENUM enum が取りうる値が原因で、コードは到達不能になっています UNREACH.GEN 到達不能コード UNREACH.RETURN 到達不能な void return文 UNREACH.SIZEOF アーキテクチャに関連した到達不能コード VA_UNUSED.GEN 値を割り当て後に使用しません VA_UNUSED.INIT 値を初期化後に使用しません |
| CERT MSC13-C (L3): 未使用値を検出して削除する |
LV_UNUSED.GEN ローカル変数は使用されません VA_UNUSED.GEN 値を割り当て後に使用しません VA_UNUSED.INIT 値を初期化後に使用しません |
| CERT MSC14-C (L3): 不要なプラットフォーム依存状態を取り込まないこと |
CERT.ALIGNOF '__alignof__' の使用は言語拡張である CERT.ANONYMOUS.STRUCT 無名構造体オブジェクトの定義は言語拡張である CERT.ANONYMOUS.UNION 無名共用体オブジェクトの定義は言語拡張である CERT.ARRAY.LENGTH.ZERO 長さゼロの配列は言語拡張である CERT.BITFIELD.NOT.INT 'int' 型として定義されていないビットフィールドは言語拡張である CERT.BITFIELD.SIGN.MODIFIER 符号付きまたは符号なしとして定義されていないビットフィールドは実装定義である CERT.EMPTY.AGR.INIT 空の集約型初期化子は言語拡張である CERT.ENUM.LITERAL.TYPE.INT 列挙リテラル定数が int 型ではない CERT.ENUM.TYPE.SPECIFIER 非標準の拡張列挙型指定子は言語拡張である CERT.FIXED.MEMORY.ADDRESS '@ address' の使用は言語拡張である CERT.LITERAL.BINARY バイナリ定数の使用は言語拡張である CERT.LITERAL.MULTIBYTE.CHAR マルチバイト文字定数の割り当ては実装定義である CERT.LITERAL.OCTAL 8 進定数の使用は言語拡張である CERT.LITERAL.SUFFIX.I64 整数定数の接尾辞として I64 または UI64 を使用することは言語拡張である CERT.NAME.DOLLAR.CHAR オブジェクト名に文字 '$' を使用することは、ISO C では有効な識別子ではない CERT.STMT.EXPR ステートメント式の使用は言語拡張である CERT.STR.RANGE.FORMATTER 文字列範囲フォーマッタの使用は実装定義である CERT.TYPEOF '__typeof__' の使用は言語拡張である CERT.UNNAMED.MEMBER 構造体または共用体における無名メンバーの定義は言語拡張である |
| CERT MSC15-C (L2): 未定義の動作に依存しない | |
| CERT MSC17-C (L1): case ラベルに関連するすべてのステートメントのセットを break ステートメントで終了する |
MISRA.SWITCH.WELL_FORMED.BREAK.2012 条件なしの break ステートメントで各 switch 句を終了するべきです。 |
| CERT MSC18-C (L3): プログラムコードでパスワードなどの機密データを扱うときは注意する | |
| CERT MSC19-C (L3): 配列を返す関数の場合は、null 値ではなく空の配列を返す | |
| CERT MSC20-C (L2): 複雑なブロックに制御を移すために switch ステートメントを使用しない | |
| CERT MSC21-C (L3): 堅牢なループ終了条件を使用する | |
| CERT MSC22-C (L3): setjmp()、longjmp() 機能を安全に使用する | |
| CERT MSC23-C (L3): ベンダー固有のライブラリと言語の違いに注意する | |
| CERT MSC24-C (L1): 非推奨関数や廃止された関数を使用しない | |
| CERT MSC25-C (L3): 安全でない暗号化アルゴリズムや弱い暗号化アルゴリズムを使用しない | |
| CERT POS01-C (L2): ファイルを扱う場合はリンクの存在を確認する | |
| CERT POS02-C (L2): 最小権限の原則に従う |
SV.USAGERULES.PERMISSIONS 特権の昇給の使用 |
| CERT POS04-C (L3): PTHREAD_MUTEX_NORMAL 型のミューテックスロックの使用を避ける | |
| CERT POS05-C (L3): jail を作成してファイルへのアクセスを制限する |
CERT.CHROOT chroot 関数の使用 CERT.CHROOT.CHDIR 'chroot' 関数の呼び出しの後に 'chdir' 関数の呼び出しがない |
| CERT PRE00-C (L3): インライン関数または static 関数を関数のようなマクロに置き換える |
MISRA.DEFINE.FUNC マクロが関数のように定義されています |
| CERT PRE01-C (L1): マクロ内のパラメーター名には括弧を使用する |
MISRA.DEFINE.NOPARS マクロパラメーターに括弧がありません |
| CERT PRE02-C (L1): マクロ置換リストは括弧で囲む |
MISRA.DEFINE.BADEXP 不適切なマクロ展開です |
| CERT PRE04-C (L3): 標準ヘッダーファイル名を再利用しない | |
| CERT PRE05-C (L3): トークンを連結したり、文字列を入力したりする際のマクロ置換を理解する |
MISRA.DEFINE.SHARP.ORDER.2012 複数の '#' または '##' の評価の順番が指定されていません |
| CERT PRE06-C (L3): ヘッダーファイルをインクルードガードで囲む |
MISRA.INCGUARD インクルードガードが入力されていません |
| CERT PRE07-C (L3): 反復的な疑問符の使用を避ける | |
| CERT PRE08-C (L3): ヘッダーファイル名が一意になるようにする | |
| CERT PRE09-C (L1): 安全な関数を廃止された関数や非推奨関数に置き換えない | |
| CERT PRE10-C (L1): マルチステートメントマクロを do-while ループでラップする |
MISRA.DEFINE.BADEXP 不適切なマクロ展開です |
| CERT PRE11-C (L2): マクロ定義をセミコロンで終了させない | |
| CERT PRE12-C (L3): 安全でないマクロを定義しない | |
| CERT PRE13-C (L3): 標準の定義済みマクロを使用してバージョンと機能をテストする | |
| CERT SIG00-C (L2): 割り込み不可能なシグナルハンドラーによって処理されるシグナルをマスクする | |
| CERT SIG01-C (L3): シグナルハンドラーの永続性に関する実装固有の詳細について理解する | |
| CERT SIG02-C (L2): 標準機能を実装する場合はシグナルの使用を避ける | |
| CERT STR00-C (L3): 文字の表現には適切な型を使用する | |
| CERT STR01-C (L3): 文字列を管理するための一貫した計画を採用して実装する | |
| CERT STR02-C (L2): 複雑なサブシステムに渡すデータは無害化する |
NNTS.TAINTED 未検証のユーザー入力が原因のバッファオーバーフロー - 非 NULL 終了文字列 SV.TAINTED.INJECTION コマンドインジェクション |
| CERT STR03-C (L3): 文字列をうっかり一部省略しない |
NNTS.MIGHT バッファオーバーフロー - 非 NULL 終了文字列 NNTS.MUST バッファオーバーフロー - 非 NULL 終了文字列 |
| CERT STR04-C (L3): 基本文字集合では文字に単純な char を使用する | |
| CERT STR05-C (L3): 文字列リテラルを参照する際には const へのポインターを使用する |
MISRA.STRING_LITERAL.NON_CONST.2012 オブジェクトの種類が const-qualified char のポインターでない限り、文字列リテラルはオブジェクトに割り当てられません |
| CERT STR06-C (L2): strtok() が解析文字列を変更しないものと想定しない | |
| CERT STR08-C (L2): 新しい文字列操作コードの開発には managed string を使用する | |
| CERT STR09-C (L3): 単純な文字型の式に対して数値を想定しない | |
| CERT STR10-C (L3): 異なる型の文字列リテラルを連結しない | |
| CERT STR11-C (L2): 文字列リテラルで初期化される文字配列の境界を指定しない | |
| CERT WIN00-C (L2): ライブラリを動的にロードする際には注意する |
SV.DLLPRELOAD.NONABSOLUTE.DLL DLL プリロードのハイジャック ベクターの可能性 SV.DLLPRELOAD.NONABSOLUTE.EXE プロセスインジェクションベクターの可能性 SV.DLLPRELOAD.SEARCHPATH DLL の検索に SearchPath の使用は推奨されません |
| CERT WIN01-C (L1): 実行を強制終了しない | |
| CERT WIN02-C (L1): 子プロセスを生成する場合は権限を制限する | |
| CERT WIN03-C (L3): HANDLE 継承について理解する | |
| CERT WIN04-C (L3): 関数ポインターの暗号化を検討する |