Klocwork C++ チェッカーにマッピングされた次世代主力戦闘機 C++ ID

以下の表では、次世代主力戦闘機 C++ コーディング基準を Klocwork C++ チェッカーにマッピングしています。Lockheed Martin 社が開発した次世代主力戦闘機 C++ コーディング基準は、プログラマーがセーフティクリティカルシステム用にエラーのないコードを開発するために役立ちます。

ガイドライン チェッカー名および説明
11

MISRA.CHAR.TRIGRAPH   3 文字表記の使用

12

MISRA.CHAR.DIGRAPH   2 文字表記の使用

13

AUTOSAR.TYPE.WCHAR_T   wchar_t 型は使用してはなりません

14

MISRA.LITERAL.SUFFIX.CASE   リテラルの添え字は小文字です

17

MISRA.STDLIB.ERRNO   エラーインジケーター 'errno' が使用されています

18

MISRA.EXPANSION.UNSAFE   安全ではないマクロの使用

19

AUTOSAR.SETLOCALE   ライブラリ <clocale> (locale.h) と setlocale 関数は使用してはなりません

20

MISRA.STDLIB.LONGJMP   setjmp マクロまたは longjmp 関数の使用

21

MISRA.STDLIB.SIGNAL   signal.h の信号処理装置の使用

22

MISRA.STDLIB.STDIO   プロダクションコードで入力/出力ライブラリ stdio.h が使用されています

23

MISRA.STDLIB.ATOI   ライブラリ stdlib.h から 'atof'、'atoi' または 'atol' が使用されています

24

MISRA.STDLIB.ABORT   ライブラリ stdlib.h から 'abort'、'exit'、'getenv' または 'system' が使用されています

25

MISRA.STDLIB.TIME   ライブラリ time.h の時間処理関数の使用

26

MISRA.ELIF.COND.NOT_BOOL.2012   #elif 条件が 0 または 1 ではありません

MISRA.ELIF.DEFINED   #elif ディレクティブで不正な 'defined' が使用されています

MISRA.ELIF.UNDEF   #elif ディレクティブでマクロが定義されていません

MISRA.ELIF.WRAPAROUND   #elif ディレクティブでラップアラウンドします

MISRA.EXPANSION.DIRECTIVE   マクロの引数内にディレクティブのようなトークンがあります

MISRA.IF.COND.NOT_BOOL.2012   #if 条件が 0 または 1 ではありません

MISRA.IF.DEFINED   #if ディレクティブで不正な 'defined' が使用されています

MISRA.IF.UNDEF   #if ディレクティブでマクロが定義されていません

MISRA.IF.WRAPAROUND   #if ディレクティブでラップアラウンドします

MISRA.UNDEF   定義のない使用です

MISRA.USE.EXPANSION   マクロの展開

MISRA.USE.UNKNOWNDIR   不明なプリプロセッサディレクティブが使用されています

MISRA.USE.WRONGDIR   不適切なプリプロセッサディレクティブです

27

MISRA.INCGUARD   インクルードガードが入力されていません

MISRA.USE.DEFINE   マクロが保護されずに定義されています

28

MISRA.USE.DEFINE   マクロが保護されずに定義されています

29

MISRA.DEFINE.FUNC   マクロが関数のように定義されています

30

MISRA.DEFINE.BADEXP.CPP   C++ ソースで不適切なマクロ展開です

31

MISRA.USE.DEFINE   マクロが保護されずに定義されています

32

MISRA.USE.DEFINE   マクロが保護されずに定義されています

33

MISRA.INCL.BAD   非標準の include ディレクティブです

35

MISRA.INCGUARD   インクルードガードが入力されていません

36

HA.DUPLICATE  

HA.UNUSED  

37

HA.OPTIMIZE  

39

MISRA.ONEDEFRULE.FUNC   ヘッダーファイルでグローバル関数が定義されています

MISRA.ONEDEFRULE.VAR   ヘッダーファイルでグローバル変数が定義されています

40

CWARN.INCL.NO_INTERFACE   ソースファイルにインターフェイスヘッダーが含まれていません

42

AUTOSAR.STYLE.SINGLE_STMT_PER_LINE   各式ステートメントと識別子宣言は、個別の行に配置する必要があります

46

MISRA.DEFINE.NOT_DISTINCT.C99.2012   識別子名が長すぎます

53.1

MISRA.INCL.SYMS   ヘッダーファイル名に非標準文字が使用されています

57

JSF.ORDER.ACCESS_SPEC   クラスの public、protected、および private セクションは、この順に宣言する必要があります

59

MISRA.IF.NO_COMPOUND   if/else ステートメントのボディが複合ステートメントではありません

67

MISRA.MEMB.NOT_PRIVATE   非 POD クラスのメンバー変数がプライベートではありません

69

MISRA.MEMB.NON_CONST   非定数のメンバー関数はどのメンバー変数も変更しません

70

AUTOSAR.FRIEND_DECL   フレンド宣言は使用してはなりません

70.1

AUTOSAR.DTOR.NON_VIRTUAL   クラスのパブリックデストラクタが非仮想的である場合、そのクラスは final と宣言する必要があります

71

UNINIT.CTOR.MIGHT   コンストラクタにおける未初期化の変数の可能性

71.1

MISRA.CTOR.DYNAMIC   オブジェクトの動的タイプがそのコンストラクタのボディから使用されています

74

AUTOSAR.CTOR.NSDMI_INIT_LIST   コンストラクタ内の NSDMI と非静的メンバー初期化子の両方を同じ型で使用してはなりません

75

CWARN.MEMBER.INIT.ORDER   初期化リストのメンバーが、クラスで宣言された順序でリストされません

76

CL.FFM.ASSIGN   解放済みメモリの使用 (二重解放) - operator= が無いため

CL.FFM.COPY   解放済みメモリの使用 (二重解放) - コピーコンストラクタが無いため

CL.SHALLOW.ASSIGN   解放済みメモリの使用 (二重解放) - 演算子 = での浅いコピー

CL.SHALLOW.COPY   解放済みメモリの使用 (二重解放) - コピーコンストラクタでの浅いコピー

77

MISRA.CTOR.BASE   コンストラクタがその基本クラスのコンストラクタを明示的に呼び出していません

UNINIT.CTOR.MIGHT   コンストラクタにおける未初期化の変数の可能性

UNINIT.CTOR.MUST   コンストラクタにおける未初期化の変数

77.1

JSF.MBR.SIG.MATCHES.COPY_CSTR   メンバー関数の定義には、暗黙に宣言されたコピーコンストラクタのシグネチャと同一のシグネチャを生成するデフォルト引数を含めてはなりません。

78

CWARN.DTOR.NONVIRT.DELETE   仮想メソッドを持ち、仮想デストラクタを持たないクラスのオブジェクトの式を削除しています

CWARN.DTOR.NONVIRT.NOTEMPTY   クラスには、基本クラスから継承された仮想関数が含まれていますが、そのデストラクタは仮想ではなく、空ではありません

79

CL.MLK   メモリリーク - デストラクタで発生

CL.MLK.VIRTUAL   メモリリーク - デストラクタで発生している可能性

81

CL.SELF-ASSIGN   解放済みメモリの使用 (二重解放) - operator=

82

AUTOSAR.ASSIGN.RETURN   代入演算子は "this" への参照を返す必要があります

84

MISRA.BIN_OP.OVERLOAD   カンマ、|| または && 演算子が多重定義されています

MISRA.UN_OP.OVERLOAD   単項の & 演算子が多重定義されています

85

JSF.CLASS.DEFINE.OPPOSITE_OPERATOR   2 つの演算子が相反する場合 (== と != など)、両方とも定義し、一方を他方の観点から定義する必要があります

87

JSF.INHERITANCE.NON_ABSTRACT   階層は抽象クラスに基づいていなければなりません

88

MISRA.DERIVE.VIRTUAL   クラスが仮想基本クラスから派生しています

MISRA.VIRTUAL.BASE.DIAMOND   基本クラスがダイヤモンド階層以外で仮想として使用されています

89

MISRA.VIRTUAL.NOVIRTUAL   オーバーライドする仮想関数が 'virtual' キーワードなしで宣言されています

94

JSF.DERIVED.NON_VIRT.REDEFINED   継承された非仮想関数を派生クラスで再定義してはなりません

95

MISRA.SAME.DEFPARAMS   オーバーライドする仮想関数とオーバーライドされる関数が異なるデフォルト引数を持っています

96

JSF.CAST.DERIVED.ARRAY.FUNC.CALL   配列を多型的に扱ってはなりません

97

MISRA.FUNC.ARRAY.PARAMS   配列タイプの関数引数がポインタに減退しています

98

MISRA.NS.GLOBAL   グローバル名前空間で関数、変数、または型が宣言されています

107

MISRA.OBJ.TYPE.COMPAT   型がその他の宣言の型と互換性がありません

108

MISRA.FUNC.VARARG   関数が可変数の引数を持っています

109

AUTOSAR.FUNC.INLINE_DEF   関数定義をクラス定義内に配置できるのは、(1) その関数がインライン化される予定であるか、(2) それがメンバー関数テンプレートであるか、(3) それがクラステンプレートのメンバー関数である場合のみです

111

LOCRET.ARG   関数がローカル変数のアドレスを返しています

LOCRET.GLOB   関数がローカル変数のアドレスを返しています

LOCRET.RET   関数がローカル変数のアドレスを返しています

112

MLK.MIGHT   メモリリークの可能性

MLK.MUST   メモリリーク

MLK.RET.MIGHT   メモリリークの可能性

MLK.RET.MUST   メモリリーク

113

MISRA.RETURN.NOT_LAST   関数内で return が最後のステートメントになっていません

114

FUNCRET.GEN   非 void 関数に戻り値がありません

115

MISRA.FUNC.UNUSEDRET   非 void 関数の戻り値が使用されていません

117.1

MISRA.VAR.NEEDS.CONST   変数は変更されませんが、const 修飾子なしで宣言されています

118.1

MISRA.PPARAM.NEEDS.CONST   ポインタパラメーターを使用しないでアドレスされたオブジェクトを変更していますが、const を指すポインタとして宣言されていません

119

MISRA.FUNC.RECUR   再帰関数

135

MISRA.VAR.HIDDEN   内部のスコープで宣言された識別子によって外部のスコープの識別子が非表示になっています

136

MISRA.VAR.MIN.VIS   名前の可視性が高すぎます

138

MISRA.FUNC.STATIC.REDECL   関数またはオブジェクトの再宣言に 'static' 修飾子がありません

MISRA.VAR.UNIQUE.STATIC   静的ストレージ指定の識別子がその他の識別子と不整合です

140

AUTOSAR.REGISTER   register キーワードは使用してはなりません

141

AUTOSAR.DECL.IN_DEFN   クラス、構造体、または列挙をその型の定義で宣言してはなりません

MISRA.CT.UNIQUE.ID   識別子がタグ名と不整合です

142

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   未初期化の変数

144

MISRA.INIT.BRACES   不適切な初期化子が配置を固定しています

145

MISRA.ENUM.INIT   1 番目以外の列挙子が明示的に初期化されていますが、一部の要素が明示的に初期化されていません

147

MISRA.FLOAT.BIT.REPR   浮動小数点値のビット操作結果はストレージのレイアウトによって変わります

149

MISRA.TOKEN.OCTAL.ESCAPE   8 進数のエスケープ文字列の使用

MISRA.TOKEN.OCTAL.INT   8 進数の整数定数を使用しています

150

AUTOSAR.HEX.UPPER   16 進定数は大文字で記述する必要があります

151.1

CERT.STR.ASSIGN.CONST_TO_NONCONST   const char ポインターを非 const char ポインターに割り当てないでください

152

MISRA.DECL.MANY_DCLS   1 つの宣言に複数の宣言子があります

153

MISRA.UNION   和集合が使用されています

154

MISRA.BITFIELD.SIGNED   名前付きの符号付きビットフィールドの長さが 2 未満です

MISRA.BITFIELD.TYPE.CPP   ビットフィールドの型は、ブール、符号付き/符号なし整数のいずれでもありません

MISRA.FIELD.BIT.ENUM   ビットフィールドが列挙型を持っています

156

JSF.UNNAMED.MEMBER   構造体 (またはクラス) のメンバーはすべて名前を付け、それらの名前を介してのみアクセスされるようにする必要があります

157

MISRA.LOGIC.POSTFIX   論理 'and' 式または論理 'or' 式のオペランドが後置式ではありません

MISRA.LOGIC.SIDEEFF   論理 'and' 式または論理 'or' 式の右側のオペランドは副作用があります

158

MISRA.LOGIC.PRIMARY   論理 'and' 式または論理 'or' 式のオペランドが 1 次式ではありません

159

MISRA.BIN_OP.OVERLOAD   カンマ、|| または && 演算子が多重定義されています

MISRA.UN_OP.OVERLOAD   単項の & 演算子が多重定義されています

160

MISRA.ASSIGN.COND   条件内で代入演算子が使用されています

MISRA.ASSIGN.SUBEXPR   代入演算子は条件外の部分式に使用されています

162

MISRA.CAST.INT.SIGN   自明ではない複合式が別の符号を持つ型にキャストされています

MISRA.CONV.INT.SIGN   暗黙的な整数変換により符号が変わります

164

MISRA.SHIFT.RANGE   シフト演算子の右側のオペランドは範囲外 (左側のオペランドの最大ビット長以上か、または負) です

164.1

MISRA.SHIFT.RANGE   シフト演算子の右側のオペランドは範囲外 (左側のオペランドの最大ビット長以上か、または負) です

165

MISRA.UMINUS.UNSIGNED   単項マイナス演算子が符号なしオペランドに対して使用されています。

166

MISRA.SIZEOF.SIDE_EFFECT   sizeof のオペランドに副作用があります

168

MISRA.COMMA   カンマ演算子が使用されています

169

JSF.POINTER_TO_POINTER   可能な限り、ポインターを指すポインターは避ける必要があります

170

MISRA.PTR.TO_PTR_TO_PTR   ポインタ宣言に 2 つ以上のレベルの間接指定があります

173

LOCRET.ARG   関数がローカル変数のアドレスを返しています

LOCRET.GLOB   関数がローカル変数のアドレスを返しています

LOCRET.RET   関数がローカル変数のアドレスを返しています

174

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 チェック前のポインタの逆参照は問題となる可能性があります

175

MISRA.LITERAL.NULL.PTR   リテラルのゼロが NULLポインタ定数として使用されています

176

JSF.FUNC.PTR.TYPEDEF   関数ポインターの宣言時にプログラムの構文を簡略化するには typedef を使用します

177

MISRA.CTOR.NOT_EXPLICIT   組み込み型の引数を持つコンストラクタが '明示的に' 宣言されていません

178

MISRA.CAST.PTR.VRCLASS   仮想基本クラスを指すポインタから派生クラスを指すポインタへのキャストにおいて、'dynamic_cast' を用いていません

179

MISRA.CAST.POLY.TYPE   多様性基本クラスから派生クラスへのキャストです

180

MISRA.CONV.NUM.NARROWER   狭いタイプへの暗黙的な数値変換です

182

MISRA.CAST.INT_TO_PTR   整数型または void を指すポインタを持つオブジェクトがポインタ型にキャストされています

MISRA.CAST.PTR.UNRELATED   ポインタ型のオブジェクトを関連のない型にキャストしています

MISRA.CAST.PTR_TO_INT   ポインタと整数型間のキャスト

184

MISRA.CONV.FLOAT   暗黙的な浮動小数点変換です

185

MISRA.C_CAST   非 void タイプへの C スタイルのキャストです

MISRA.FUNC_CAST   関数表記が明示的なコンストラクタ呼び出しとは異なるものにキャストされています

186

UNREACH.ENUM   enum が取りうる値が原因で、コードは到達不能になっています

UNREACH.GEN   到達不能コード

UNREACH.RETURN   到達不能な void return文

187

MISRA.STMT.NO_EFFECT   そのステートメントは副作用がなく、制御フローを変更しません

188

JSF.LABEL   switch ステートメント内を除き、ラベルを使用してはなりません

189

AUTOSAR.GOTO   goto ステートメントは使用してはなりません

190

MISRA.CONTINUE.ILL   continue ステートメントが不適切な形式の for ループで使用されています

191

JSF.BREAK   break ステートメントは使用してはなりません

192

MISRA.IF.NO_ELSE   if/else-if ステートメントのチェインが else で終了していないか、または空の else 句で終了しています

193

MISRA.SWITCH.NOT_WELL_FORMED   switch ステートメントの形式が不適切です

MISRA.SWITCH.NO_BREAK   switch 句の最後に break ステートメントまたは throw ステートメントがありません

194

MISRA.SWITCH.NODEFAULT   switch ステートメントの最後に default 句がありません

MISRA.SWITCH.NOT_WELL_FORMED   switch ステートメントの形式が不適切です

195

MISRA.SWITCH.BOOL   switch ステートメントの条件がブール式です

196

MISRA.SWITCH.NOT_WELL_FORMED   switch ステートメントの形式が不適切です

MISRA.SWITCH.NO_CASE   switch ステートメントに case 句がありません

197

MISRA.FOR.COUNTER.FLT   for ループのカウンターが浮動小数点タイプです

MISRA.FOR.COUNTER.MANY   for ループのカウンターが多すぎます

198

MISRA.FOR.COUNTER.MANY   for ループのカウンターが多すぎます

199

MISRA.FOR.COND.EQ   ループカウンターに対して++ 演算子または -- 演算子を使用していませんが、ループカウンターがイコールかどうかで判定しています

MISRA.FOR.INCR   for ループのカウンターが不適切な方法で変更されています

MISRA.FOR.INCR.CHANGE   for ループの増分式がループカウンターで変化していません

200

JSF.LOOP.NULL.INIT_OR_INCR   for ループ内での NULL の初期化式と増分式は使用されません

201

MISRA.FOR.COND.CHANGE   for ループのカウンターがループ条件セクション内で変更されています

MISRA.FOR.STMT.CHANGE   for ループのカウンターがループステートメント内で変更されています

202

MISRA.FLOAT_EQUAL   浮動小数点式のイコールがテストされています

203

NUM.OVERFLOW   オーバーフローの可能性

NUM.OVERFLOW.DF   起こり得る数値のオーバーフローまたはラップアラウンド

204

MISRA.INCR_DECR.OTHER   増分または減分の演算子がその他の演算子と混合して式で使用されています

204.1

PORTING.VAR.EFFECTS   ある使用法が副次的な影響を受ける式で変数が 2 回使用されています

205

AUTOSAR.TYPE.QUAL.VOLATILE   volatile 型修飾子は使用してはなりません

206

AUTOSAR.OP.NEW_DELETE   non-placement new 式または non-placement delete 式を使用してはなりません

AUTOSAR.STDLIB.MEMORY   関数 malloc、calloc、realloc、および free は使用してはなりません

FMM.MIGHT   メモリの解放の不一致の可能性

FMM.MUST   メモリの解放の不一致

207

JSF.UNENCAPSULATED.GLOBAL   カプセル化されていないグローバルデータは避ける必要があります

208

JSF.EXCEPTION   C++ 例外を使用してはなりません

209

AUTOSAR.BUILTIN_NUMERIC   基本的な数値型の代わりに <cstdint> で提供される固定幅の整数型を使用する必要があります

PORTING.MACRO.NUMTYPE   組み込み数値型を記述するマクロが使用されています

210

PORTING.BITFIELDS   構造内でのビットフィールドの使用法

PORTING.BSWAP.MACRO   カスタムバイトの swap マクロがエンディアンのチェックなしで使用されています

PORTING.BYTEORDER.SIZE   互換性がない型が 'ntohl' などのネットワークマクロで使用されています

210.1

JSF.CAST.MBR.ORDER.ACCESS_SPEC   アクセス指定子で区切られた非静的データメンバーの割り当て順序についての仮定をアルゴリズムで行ってはなりません

212

PORTING.UNSIGNEDCHAR.OVERFLOW.FALSE   'char' 型の符号によっては関係式が常に false になる場合があります

PORTING.UNSIGNEDCHAR.OVERFLOW.TRUE   'char' 型の符号によっては関係式が常に true になる場合があります

213

MISRA.EXPR.PARENS.INSUFFICIENT   式の演算子優先規則に制限された依存性が必要です

MISRA.EXPR.PARENS.REDUNDANT   式の演算子優先規則に制限された依存性が必要です

214

JSF.USE.STATIC.NON_LOCAL   変換単位が異なる非ローカル静的オブジェクトが特別な順序で初期化されると想定してはなりません

215

MISRA.PTR.ARITH   代数式または配列インデックス式でポインタが使用されています

"MISRA"、"MISRA C" および、"MISRA C++" は、The MISRA Consortium Limited の登録商標です。​