JSF AV C++ コーディング ルール
サポートされる JSF C++ コーディング ルール
コードのサイズと複雑度
| 番号 | JSF®++ 定義 | Polyspace® 実装 |
|---|---|---|
| 1 | どのような関数 (またはメソッド) に含まれる論理ソース コード行 (L-SLOC) も、200 行を超えてはなりません。 | レポート ファイル内のメッセージ:
|
| 3 | すべての関数の循環的複雑度数は 20 以下です。 | レポート ファイル内のメッセージ:
|
環境
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 8 | All code shall conform to ISO/IEC 14882:2002(E) standard C++. | コンパイル エラー メッセージを報告します。 |
| 9 | C++ 基本ソース文字セットで指定されている文字のみが使用されなければなりません。 | |
| 11 | 3 文字表記は使用してはなりません。 | |
| 12 | 次の 2 文字表記は使用してはなりません。 <%, %>, <:, :>, %:, %:%:. | レポート ファイル内のメッセージ: The following digraph will not be used: 2 文字表記を報告します。ルール レベルが警告に設定されている場合、2 文字表記は |
| 13 | マルチバイト文字とワイド文字列リテラルは使用されてはなりません。 | L'c' と L"string" および wchar_t の使用を報告します。 |
| 14 | リテラル接尾辞は、小文字よりも大文字を使用します。 | |
| 15 | 実行時チェックへの準備をします (防御的プログラミング)。 | ソフトウェアでのチェックで行われます。 |
ライブラリ
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 17 | エラー インジケーター | errno は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。 |
| 18 | The macro | offsetof は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。 |
| 19 |
| setlocale および localeconv は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。 |
| 20 | マクロ | setjmp および longjmp は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。 |
| 21 |
| signal および raise は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。 |
| 22 | 入出力ライブラリ | <stdio.h> のすべての標準関数は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。 |
| 23 | ライブラリ | atof、atoi および atol は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。 |
| 24 | ライブラリ | abort、exit、getenv および system は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。 |
| 25 | ライブラリ | clock、difftime、mktime、asctime、ctime、gmtime、localtime および strftime は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。 |
プリプロセッサ命令
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 26 | 次のプリプロセッサ命令 #ifndef、#define、#endif、#include のみが使用されます。 | |
| 27 |
| パターン #if !defined、#pragma once、#ifdef と #define の不足を検出します。 |
| 28 | プリプロセッサ命令 #ifndef および #endif は、同じヘッダー ファイルの複数のインクルードを防ぐため AV ルール 27 に定義された方法によってのみ、使用されなければなりません。 | AV ルール 27 に準拠しないすべての使用を検出します。35/27 に違反していないと見なし、#ifndef のみを報告します。 |
| 29 | プリプロセッサ命令 #define は、インライン マクロの作成には使用されません。代わりにインライン関数が使用されます。 | ルールは 2 つの部分に分かれています。マクロ関数の定義 (29.def) と、マクロ関数の呼び出し (29.use) です。 レポート ファイル内のメッセージ:
|
| 30 | プリプロセッサ命令 #define は、定数値の定義には使用されません。代わりに、定数値を指定するため、修飾子 const が変数宣言に適用されます。 | 単純な定数の #define を報告します。 |
| 31 | プリプロセッサ命令 #define は、同じヘッダー ファイルが複数インクルードされないための手法の一部としてのみ使用されなければなりません。 | ルール 35 および 27 に違反していないとの前提により、複数インクルード防止以外の目的の #define の使用を検出します。 |
| 32 | プリプロセッサ命令 #include は、ヘッダー (*.h) ファイルのインクルードにのみ使用されなければなりません。 |
ヘッダー ファイル
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 33 | #include 命令は、ヘッダー ファイルをインクルードするために、<filename.h> 表記を使用します。 | |
| 35 | ヘッダー ファイルには、自身の複数のインクルードを防ぐためのメカニズムが含まれていなければなりません。 | |
| 39 | ヘッダー ファイル (*.h) には、定数でない変数定義または関数定義を含めてはなりません。 | ヘッダー内のグローバル変数または関数の定義を報告します。 |
スタイル
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 40 | すべての実装ファイルには、使用されているインライン関数、型、テンプレートを一意に定義するヘッダー ファイルが含まれます。 | 型、テンプレート、インライン関数がソース ファイルで定義されている場合に報告します。 |
| 41 | ソース ファイルは、120 文字以内の長さに保たれなければなりません。 | Polyspace は、行の長さをカウントするときに改行文字 (\n) を無視します。 |
| 42 | 各式ステートメントは、個別の行に記述されなければなりません。 | 連続する 2 つの式ステートメントが同じ行にある場合に報告します (ステートメントがマクロ定義の一部である場合を除く)。 |
| 43 | タブは避ける必要があります。 | |
| 44 | すべてのインデントは、少なくとも 2 個のスペースからなり、同じソース ファイル内で一貫しています。 | ステートメントのインデントが、それを含むステートメントよりも少なくともスペース 2 個分多くなっていない場合に報告します。if/else、do/while、for、while ステートメントの後の左中かっこの間の正しくないインデントは報告しません。NB: 最終リリースでは、あらゆるインデントは受け入れられなければなりません。 |
| 46 | ユーザー指定の (内部および外部) 識別子は、64 文字を超える有意性に依存してはなりません。 | このチェッカーは、既定の Polyspace as You Code 解析では非アクティブにされます。Polyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください。 |
| 47 | 識別子は、アンダースコア文字 '_' で始まってはなりません。 | |
| 48 | 識別子には次による区別があってはなりません。
| スコープにかかわらずチェックされます。マクロとその他の識別子の間ではチェックされません。 レポート ファイル内のメッセージ:
|
| 50 | クラス、構造体、名前空間、列挙値または | レポート ファイル内のメッセージ:
|
| 51 | 関数名と変数名に含まれているすべての文字には、すべて小文字を使用しなければなりません。 | レポート ファイル内のメッセージ:
|
| 52 | 定数と列挙値の識別子は小文字です。 | レポート ファイル内のメッセージ:
|
| 53 | ヘッダー ファイルには常に ".h" のファイル名拡張子が付かなければなりません。 | オプション |
| 53.1 | 次の文字シーケンスヘッダー ファイル名には現われません。'、\、/*、// または "。 | |
| 54 | 実装ファイルには常に ".cpp" のファイル名拡張子が付かなければなりません。 | オプション -dos を指定した場合、大文字と小文字は区別されません。 |
| 57 | クラスのパブリック セクション、保護された セクション、プライベート セクションは、この順序で宣言されなければなりません。 | |
| 58 | 3 つ以上のパラメーターをもつ関数を宣言および定義する場合、先頭のかっこと最初の引数は、関数名と同じ行に記述されなければなりません。追加の各引数は、個別の行に記述されなければなりません (閉じかっこは最後の引数のすぐ後になります)。 | 2 つのパラメーターが同じ行にないことを検出します。最初のパラメーターが、関数名と同じ行にあるようにします。閉じかっこはチェックされません。 |
| 59 | if、else if、else、while、do ... while または for ステートメントの本体を構成するステートメントは、中かっこで、たとえそれが空のブロックを構成するとしても、常に囲まれます。 | レポート ファイル内のメッセージ:
|
| 60 | ブロックを囲む中かっこ ("{}") は、ブロックのすぐ上と下の行の同じ列にそれぞれ配置されなければなりません。 | ステートメント ブロックの中かっこが同じ列にあることを検出します。 |
| 61 | ブロックを囲む中かっこ ("{}") がある行には、コメント以外には何も記述してはなりません。 | |
| 62 | デリファレンス演算子 '*' とアドレス演算子 '&' は、型指定子と直接結合されます。 | 変数、パラメーター、フィールド宣言で、型と"*" "&" の間にスペースがある場合に報告します。 |
| 63 | '.' または '->' の周囲や、単項演算子とオペランドの間には、スペースが使用されてはなりません。 | 次の文字が空白に直接結合されていない場合に報告します。
float/double の定義で "." が使用された場合に違反が報告されます。 |
クラス
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 67 | パブリック データおよび保護されたデータは、クラスではなく構造体でのみ使用される必要があります。 | |
| 68 | 暗黙的に生成された不要なメンバー関数は、明示的に禁止されます。 | 既定のコンストラクター、代入演算子、コピー コンストラクターまたはデストラクターが宣言されていない場合に報告します。 |
| 71.1 | クラスのバーチャル関数は、そのデストラクターまたはそのいずれかのコンストラクターからは実行されません。 | コンストラクターまたはデストラクターが直接バーチャル関数を呼び出している場合に報告します。 |
| 74 | 非静的クラスメンバーは、コンストラクターの本体での代入よりも、メンバー初期化リストによって実行されなければなりません。 | 配列を除くすべてのデータは、初期化リストで初期化される必要があります。 レポート ファイル内のメッセージ: Initialization of nonstatic class members " |
| 75 | 初期化リストのメンバーは、クラス内の宣言順序と同じ順序でリストされます。 | |
| 76 | コピー コンストラクターと代入演算子は、データ項目へのポインターまたは非トリビアル デストラクターを含むクラスに対して宣言されます。 | レポート ファイル内のメッセージ:
|
| 77.1 | メンバー関数の定義は、対応するクラスまたは構造体の暗黙的に宣言されたコピー コンストラクターと同じシグネチャを生成する既定の引数を含みません。 | 明示的なコピー コンストラクターが存在する場合は報告しません。 |
| 78 | バーチャル関数をもつすべての基底クラスは、バーチャル デストラクターを定義します。 | |
| 79 | クラスによって取得されたすべてのリソースは、クラスのデストラクターで解放されます。 | コンストラクターで呼び出される "new" の数が、そのデストラクターで呼び出される "delete" よりも多い場合に報告します。
メモ "new" が "if/else" の中で実行される場合でも違反になります。
|
| 81 | 代入演算子は自己代入を正しく処理するものとします。 | コピー代入の本体が " 空の
|
| 82 | 代入演算子は *this への参照を返します。 | 次の演算子は、メソッドについては
戻り値が存在しない場合は報告しません。 型が一致しない場合、特にメッセージはありません。 レポート ファイル内のメッセージ:
|
| 83 | 代入演算子は、クラスの不変性に影響を与えるすべてのデータ メンバーと基底を代入します (たとえば、キャッシュを表すデータ要素はコピーされる必要はありません)。 | コピー代入でデータ メンバーのすべてが代入されない場合に報告します。派生クラスでは、継承されたコピー代入がコピー代入において呼び出さない場合にも報告します。 |
| 88 | 多重継承は、次の限定形式でのみ許可されます。n 個のインターフェイスと m 個のプライベート実装、さらに最大 1 個の保護された実装。 | レポート ファイル内のメッセージ:
|
| 88.1 | ステートフルなバーチャル基底は、それにアクセスする各派生クラスで明示的に宣言されます。 | |
| 89 | 基底クラスは、同じ階層内でバーチャルと非バーチャルの両方にはなりません。 | |
| 94 | 継承された非バーチャル関数は派生クラスで再定義されません。 | デストラクターについては報告しません。 レポート ファイル内のメッセージ: Inherited nonvirtual function |
| 95 | 継承された既定のパラメーターは再定義されることはありません。 | |
| 96 | 配列はポリモーフィックには扱われません。 | 指し示されている型が基底クラスとして使用される式での、ポインター演算と配列に似たアクセスを報告します。 |
| 97 | 配列はインターフェイスで使用されません。 | 配列からポインターへの減衰を防ぐためだけのものです。プライベート メソッドに対してはチェックされません。 |
| 97.1 | 等価演算子 (== または !=) のオペランドは、バーチャル メンバー関数へのポインターにはなりません。 | ポリモーフィック クラス (バーチャルかどうかを静的に決定できない) のメンバー関数のポインターについて == および != を報告します。ただし、1 つの引数が null 定数の場合を除きます。 |
名前空間
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 98 | main() を除くすべての非ローカル名は、何らかの名前空間の中に配置される必要があります。 | |
| 99 | 名前空間は、2 レベルを超える深さの入れ子にしてはなりません。 |
テンプレート
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 104 | テンプレートの特殊化はその使用前に宣言されます。 | 実際のコンパイル エラー メッセージを報告します。 |
関数
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 107 | 関数は必ずファイル スコープで宣言されます。 | |
| 108 | 引数の数が可変の関数は使用されません。 | |
| 109 | 関数定義は、関数をインライン化することを意図しているのでない限り、クラス指定内に配置されないようにします。 | クラス定義内のメンバー関数の定義に "inline" がない場合に報告します。 |
| 110 | 引数の数が 7 個を超える関数を使用してはなりません。 | |
| 111 | 関数は、非静的ローカル オブジェクトへのポインターまたは参照を返しません。 | エイリアス効果のない単純なケースを検出します。 |
| 113 | 関数の出口は 1 つにしなければなりません。 | 関数ごとに一度、最初の return を報告します。 |
| 114 | 値を返す関数のすべての出口では return ステートメントが使用されます。 | |
| 116 | 仮パラメーターに対して行った変更が呼び出し元関数に反映されないようにする場合は、小さい具象型引数 (サイズが 2 ~ 3 ワード) を値渡しにする必要があります。 | sizeof <= 2 * sizeof(int) を使用した定数パラメーター参照を報告します。コピー コンストラクターについては報告しません。 |
| 117 | NULL 値を使用できない場合は、引数を参照渡しにする必要があります。
| 関数本体でパラメーターが 以下の場合、チェッカーは違反を報告しません。
|
| 119 | 関数は、それ自身を直接的にも間接的にも呼び出しません (つまり、再帰は許可されません)。 | チェッカーは、それ自体を直接的または間接的に呼び出すそれぞれの関数について報告します。1 つの再帰サイクルに複数の関数が関与している場合でも、それぞれの関数が個別に報告されます。 再帰サイクルの総数は、コード複雑度メトリクス |
| 121 | ステートメントが 1 個または 2 個の関数だけがインライン関数の候補と見なされることが必要です。 | ステートメントが 2 個を超えるインライン関数を報告します。 |
| 122 | トリビアル アクセサー関数とミューテーター関数はインライン化される必要があります。 | メソッドがトリビアルかどうかを判断するため、チェッカーでは以下の条件を使用します。
チェッカーは、 チェッカーは、テンプレート メソッドやバーチャル メソッドにはフラグを設定しません。 |
コメント
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 126 | 有効な C++ スタイル コメント (//) のみが使用されます。 | |
| 127 | 使用されない (コメント アウトされた) コードは削除されます。 | チェッカーは内部でヒューリスティックな方法を使用してコメントアウトされたコードを検出します。たとえば、 チェッカーは、コードを含んでいても次のコメントに対してはフラグを設定しません。
チェッカーは、このようなコメントがドキュメンテーション目的か、または事前に考慮されたうえで意図的に入力されたものと見なします。 |
| 133 | すべてのソース ファイルは、ファイル名についての情報、その内容、およびプログラムで必要とされる情報 (たとえば、法的声明、著作権情報など) を提供する概要コメントと共にドキュメント化されなければなりません。 | ファイルが 2 つのコメント行で始まっていない場合に報告します。 メモ: このルールについては、ソース コードに注釈を付けることができません。 |
宣言と定義
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 135 | 内側のスコープの識別子は外側のスコープの識別子と同じ名前を使用せず、したがってその識別子を隠蔽しません。 | |
| 136 | 宣言は、できるだけ小さいスコープにする必要があります。 | 次の場合に報告します。
メモ
|
| 137 | ファイル スコープのすべての宣言は、できるだけ静的であることが必要です。 | R2021a 以降、このチェッカーは 1 ファイルのみで使用する非静的オブジェクトの宣言に対して起動されます。単一ファイルを解析する場合でもチェッカーは起動します。このチェッカーは、次のような未使用のままのオブジェクトの宣言では起動されません。
このチェッカーは、既定の Polyspace as You Code 解析では非アクティブにされます。Polyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください。 |
| 138 | 同一翻訳単位内で、識別子が同時に内部リンクと外部リンクの両方をもつことはありません。 | |
| 139 | 外部オブジェクトは、複数のファイルで宣言されてはなりません。 | 1 つの翻訳単位内で重複するすべての宣言を報告します。宣言の局所化がすべての翻訳単位で同じでない場合に報告します。 |
| 140 | レジスタ ストレージ クラス指定子は使用されません。 | |
| 141 | クラス、構造体、列挙値は、その型の定義の中で宣言されてはなりません。 |
初期化
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 142 | すべての変数は使用前に初期化されます。 | Polyspace は、コードに以下の問題が含まれている場合にこの違反を報告します。
|
| 144 | Braces shall be used to indicate and match the structure in the non-zero initialization of arrays and structures. | これには部分的な初期化が含まれます。 |
| 145 | 列挙子リストでは、すべての項目を明示的に初期化する場合を除き、最初のメンバー以外のメンバーを明示的に初期化するために '=' 構造は使用されません。 | 1 つの列挙リストについて 1 件のレポートを生成します。 |
型
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 147 | 浮動小数点数の基になるビット表現は、どのような方法でもプログラマによって使用されません。 | 浮動小数点ポインターを使用したキャストについて報告します (void* を除く)。 |
| 148 | 一連の限定的な選択肢から選択する場合は、整数型 (および定数) の代わりに列挙型が使用されます。 | switch で非列挙型が使用されている場合に報告します。 |
定数
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 149 | 8 進定数 (ゼロ以外) は使用されません。 | |
| 150 | 16 進定数は、すべて大文字により表現されなければなりません。 | |
| 151 | コード内では数値を使用してはなりません。代わりにシンボリック値が使用されなければなりません。 | 式、 |
| 151.1 | 文字列リテラルは変更されません。 | ルール チェッカーは、以下への文字列リテラルの割り当てにフラグを設定します。
|
変数
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 152 | 同じ行で複数の変数を宣言してはなりません。 | 連続する 2 つの宣言ステートメントが同じ行にある場合に報告します (ステートメントがマクロ定義の一部である場合を除く)。 |
共用体とビット フィールド
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 153 | 共用体は使用されません。 | |
| 154 | ビット フィールドには、明示的に符号のない整数型または列挙型のみが使用されます。 | |
| 156 | 構造体 (またはクラス) のすべてのメンバーには名前が付けられ、その名前でのみアクセスされます。 | 名前のないビット フィールドを報告します (名前のないフィールドは許可されません)。 |
演算子
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 157 | && または || 演算子の右オペランドは、二次的影響を含みません。 | ルール 159 に違反していないことを前提としています。 レポート ファイル内のメッセージ:
|
| 158 | The operands of a logical | レポート ファイル内のメッセージ:
例外: |
| 159 | 演算子 | レポート ファイル内のメッセージ:
|
| 160 | 代入式は、式ステートメントの式としてのみ使用されます。 | += や ++ などでない、単純な代入のみ。 |
| 162 | 算術演算または比較演算では、符号付きの値と符号なしの値は混在されません。 | |
| 163 | 符号なし演算は使用されません。 | |
| 164 | シフト演算子の右オペランドは、ゼロ以上、左オペランドのビット幅マイナス 1 未満になります。 | |
| 164.1 | 右シフト演算子の左オペランドは負の値にはなりません。 | 定数の場合の + を検出します。動的変数の場合にはソフトウェアによって検出されます。 |
| 165 | 単項マイナス演算子は符号なしの式に適用されません。 | |
| 166 | sizeof 演算子は、二次的影響がある式に使用してはなりません。 | |
| 168 | コンマ演算子は使用されません。 |
ポインターと参照
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 169 | ポインターへのポインターはできるだけ避けるようにします。 | main の引数を除く、第 2 レベルのポインターを報告します。 |
| 170 | 2 レベルを超えるポインター間接参照は使用されません。 | 変数またはパラメーターについてのみ報告します。 |
| 171 | 関係演算子は、両方のオペランドが同じ型で次のものを指しているのでない限り、ポインター型に適用されません。
| 関係演算子がポインター型に対して使用されている場合に報告します (キャストは無視されます)。 |
| 173 | 自動ストレージを使用したオブジェクトのアドレスは、そのオブジェクトが存在しなくなった後まで存続するオブジェクトに代入されません。 | |
| 174 | null ポインターはデリファレンスされません。 | ソフトウェアでのチェックで行われます。 |
| 175 | ポインターには NULL との比較または NULL の代入は行われません。代わりにプレーンな 0 を使用します。 | ポインター コンテキストでの NULL マクロの使用を報告します。 |
| 176 |
| typedef でない関数ポインターか、変数、フィールド、パラメーターの型に対するメンバー関数のポインターを報告します。関数、キャスト、例外指定の型を返します。 |
型変換
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 177 | ユーザー定義の変換関数は避けるようにします。 | ユーザー定義変換関数、1 つのパラメーターをとる明示的でないコンストラクター、その他の既定値 (未定義のものも含む) を報告します。 コピー コンストラクターは報告しません。 コンストラクターの場合の追加のメッセージ: This constructor should be flagged as "explicit". |
| 178 | ダウン キャスト (基底クラスから派生クラスへのキャスト) は、次のいずれかのメカニズムによってのみ可能になります。
| dynamic_cast を含む、明示的なダウン キャストを報告します(ビジター パターンについては特別なケースはありません)。 |
| 179 | バーチャル基底クラスへのポインターは派生クラスへのポインターに変換されません。 | この特定のダウン キャストを報告します。dynamic_cast を許可します。 |
| 180 | 情報が失われる可能性がある暗黙的変換は使用されません。 | 次の暗黙的キャストを報告します。
|
| 181 | 冗長な明示的キャストは使用してはなりません。 | 無駄なキャスト cast T to T を報告します。同等の typedefs へのキャストも報告されます。 |
| 182 | 任意の型とポインターの間では型キャストは使用されません。 | ルール 181 が適用される場合は報告しません。 |
| 184 | 浮動小数点数は整数に変換されません。ただし、そのような変換がアルゴリズムの要件に指定されていたり、ハードウェア インターフェイスに必要である場合を除きます。 | float->int 変換を報告します。暗黙的な変換は報告しません。 |
| 185 | 従来の C スタイルのキャストではなく、C++ スタイルのキャスト (const_cast、reinterpret_cast および static_cast) が使用されます。 |
フロー制御標準
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 186 | 到達不能コードがないものとします。 | ソフトウェアでのグレー チェックで行われます。 |
| 187 | すべての非 null ステートメントは、潜在的に副次的影響を備えています。 | |
| 188 | switch ステートメント以外ではラベルは使用されてはなりません。 | |
| 189 | goto ステートメントは使用されません。 | |
| 190 | continue ステートメントは使用されません。 | |
| 191 | break ステートメントは使用されません (switch ステートメントの各ケースを終了する場合を除く)。 | |
| 192 | すべての if、else if 文には、最終の else 句か、最終の else 句が不要である理由を示すコメントが含まれなければなりません。 | else if は else 句を含む必要があります。 |
| 193 | switch ステートメントの空でない case 句はすべて、break ステートメントで終わります。 | |
| 194 | 全列挙値のテストを意図していない switch ステートメントにはすべて、最終の default 句が含まれます。 | 不足している default についてのみ報告します。 |
| 195 | switch 式は、ブール値を表してはなりません。 | |
| 196 | すべての switch ステートメントには、2 つ以上の case とオプションの default がなければなりません。 | |
| 197 | 浮動小数点変数はループ カウンターとして使用されません。 | 1 個のループ パラメーターを仮定します。 |
| 198 | for ループの初期化式では、単一の for ループ パラメーターの値の初期化以外の処理を実行してはなりません。 | loop パラメーターを決定できない場合に報告します。ルール 200 に違反していないことを前提としています。loop variable パラメーターは変数であると仮定されます。 |
| 199 | for ループのインクリメント式は、単一ループ パラメーターをループの次の値に変更する以外の処理を実行してはなりません。 | クラス タイプでない 1 個のループ パラメーターを仮定します (ルール 198)。このルールが報告されるには、ルール 200 に違反してはなりません。 |
| 200 | for ループでは null 初期化またはインクリメント式を使用してはなりません。代わりに while ループが使用されます。 | |
| 201 | 反復カウントのために for ループの中で使用される数値変数は、ループの本体内では変更されません。 | 1 個のループ パラメーター (AV ルール 198) と、エイリアス書き込みがないことを仮定します。 |
式
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 202 | 浮動小数点変数について、完全な等価性または非等価性はテストされません。 | 直接の等価性/非等価性のみを報告します。すべての式に対してチェックが行われます。 |
| 203 | 式の評価の結果によるオーバーフロー/アンダーフローは生じません。 | ソフトウェアでのオーバーフロー チェックで行われます。 |
| 204 | 副次的影響がある単一の操作は、次のコンテキストでのみ使用されます。
| 次の場合に報告します。
|
| 204.1 | The value of an expression shall be the same under any order of evaluation that the standard permits. | 次の場合に報告します。
|
| 205 | volatile キーワードは、ハードウェアとの直接インターフェイス以外には使用されません。 | volatile キーワードが使用されている場合に報告します。 |
メモリ割り当て
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 206 | 空きストア (ヒープ) への割り当てとその解放は、初期化後には行いません。 | C ライブラリ関数 malloc、calloc、realloc、free の呼び出しと、関数またはメソッド内のすべての new/delete 演算子を報告します。 |
障害処理
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 208 | C++ の例外は使用されません。 | try、catch、throw spec および throw を報告します。 |
移植可能コード
| 番号 | JSF++ 定義 | Polyspace 実装 |
|---|---|---|
| 209 | 基本的な型 | 直接の typedefs を通じた基本的な型のみが使用可能です。 |
| 213 | 式内では、算術演算子の下位という C++ の演算子の優先順位規則には依存しません。 | 二項演算に、かっこで囲まれていない、優先順位が下位の操作であるオペランドがある場合に報告します。 かっこで囲まれずに使用されているビット演算子およびシフト演算子と、二項演算の引数を報告します。 |
| 215 | ポインター演算は使用してはなりません。 | 次を報告します。
|
サポートされていない JSF++ ルール
コードのサイズと複雑度
| 番号 | JSF++ 定義 |
|---|---|
| 2 | 自己変更コードはないものとします。 |
ルール
| 番号 | JSF++ 定義 |
|---|---|
| 4 | "Should (勧告)" ルールを破る場合は、開発者から次の承認を受けなければなりません。
|
| 5 | "Will (必要)" または "Shall (必須)" ルールを破る場合は、開発者から次の承認を受けなければなりません。
|
| 6 | "Shall (必須)" ルールからの逸脱は、逸脱が含まれるファイル内に記載されます。AV ルール 5 にかかわらず、このルールからの逸脱は許可されません。 |
| 7 | "Shall (必須)" または "Will (必要)" ルールで、そのルールで規定されている例外に従った逸脱については、承認は必要ありません。 |
環境
| 番号 | JSF++ 定義 |
|---|---|
| 10 | 文字型の値は、ISO 10646 1 のサブセットにおける定義および記載に制限されなければなりません。 |
ライブラリ
| 番号 | JSF++ 定義 |
|---|---|
| 16 | セーフティ クリティカルな (つまり SEAL 1) コードでは、DO-178B レベル A [15] 認定ライブラリまたは SEAL 1 C/C++ ライブラリのみが使用されます。 |
ヘッダー ファイル
| 番号 | JSF++ 定義 |
|---|---|
| 34 | ヘッダー ファイルには、論理的に関連のある宣言のみが含まれている必要があります。 |
| 36 | コンパイルの依存関係は、できるだけ最小化する必要があります。 |
| 37 | ヘッダー (インクルード) ファイルは、自身が正常にコンパイルされるために必要なヘッダー ファイルのみをインクルードする必要があります。関係する .cpp ファイルでのみ使用されるファイルは、その .h ファイルではなく .cpp ファイルに記述する必要があります。 |
| 38 | ポインター (*) または参照 (&) によってのみアクセスされるクラスの宣言は、事前宣言のみが格納された事前ヘッダーによって提供される必要があります。 |
スタイル
| 番号 | JSF++ 定義 |
|---|---|
| 45 | 識別子の中のすべての単語は、'_' 文字で区切らなければなりません。 |
| 49 | 識別子中のすべての頭字語は、大文字で記述しなければなりません。 |
| 55 | ヘッダー ファイルの名前には、それが宣言を提供する論理エンティティが反映されている必要があります。 |
| 56 | 実装ファイルの名前には、それが定義を提供する論理エンティティが反映され、拡張子 ".cpp" をもつ必要があります (通常この名前は、対応する宣言を提供するヘッダー ファイルと同じになります)。 場合によっては、特定の論理エンティティに対し複数の .cpp ファイルが必要になります。その場合、接尾辞を追加して論理的な違いを反映させる必要があります。 |
クラス
| 番号 | JSF++ 定義 |
|---|---|
| 64 | クラス インターフェイスは完全で最小であることが必要です。 |
| 65 | 不変性が不要なエンティティのモデル化には構造体を使用する必要があります。 |
| 66 | 不変性を維持するエンティティのモデル化にはクラスを使用する必要があります。 |
| 69 | オブジェクトの状態 (そのインスタンス変数) に影響を与えないメンバー関数は const として宣言されます。メンバー関数は既定で const となります。明確かつ明示的な理由がある場合のみ、メンバー関数に対する const 修飾子の省略がなされるようにします。 |
| 70 | クラスは、関数またはオブジェクトが、クラスのプライベート要素にアクセスする必要があるが、論理的または効率上の理由からクラスのメンバーになれない場合のみ、フレンドをもたなければなりません。 |
| 70.1 | オブジェクトは、その存在期間の開始前または終了後に不適切に使用されないものとします。 |
| 71 | 外部認識されるオブジェクト操作の呼び出しは、そのコンストラクターを除き、オブジェクトが完全に初期化されるまで許可されません。 |
| 72 | クラスの不変性としては以下が必要です。
|
| 73 | 不必要な既定のコンストラクターは定義されないものとします。 |
| 77 | コピー コンストラクターは、クラスの不変性に影響を与えるすべてのデータ メンバーと基底をコピーします (たとえば、キャッシュを表すデータ要素はコピーされる必要はありません)。 |
| 80 | クラスの既定のコピー演算子と代入演算子が、妥当なセマンティクスを提供する場合は、それらを使用しなければなりません。 |
| 84 | 演算子のオーバーロードは、慎重かつ通常の方法で使用されなければなりません。 |
| 85 | 2 個の演算子が反対の場合 (たとえば == と !=)、両方が定義され、一方は他方との関係で定義されなければなりません。 |
| 86 | 単純で独立した概念を表すには、具象型を使用する必要があります。 |
| 87 | 階層は、抽象クラスに基づいている必要があります。 |
| 90 | 頻繁に使用されるインターフェイスは、最小限、一般的および抽象的であることが必要です。 |
| 91 | "is-a" 関係を実装するには、パブリックな継承を使用しなければなりません。 |
| 92 | サブタイプ (パブリックに派生するクラス) は、システム実行時の、異なるサブクラス インスタンスの同一変数またはパラメーターへのポリモーフィックな代入に関係するすべてのクラスにおいて、次のガイドラインに従わなければなりません。
つまり、サブクラスのメソッドは、それがオーバーライドする基底クラスのメソッドよりも少ないものを期待し多くのものを提供しなければなりません。このルールは、サブタイプがリスコフの置換原則に従わなければならないことを意味します。 |
| 93 | "has-a" または "is-implemented-in-terms-of" 関係は、メンバーシップまたはパブリックでない継承を通じてモデル化されなければなりません。 |
名前空間
| 番号 | JSF++ 定義 |
|---|---|
| 100 | 名前空間の要素は、次のように選択される必要があります。
|
テンプレート
| 番号 | JSF++ 定義 |
|---|---|
| 101 | テンプレートは、次の点についてレビューされます。
|
| 102 | テンプレート テストは、実際のテンプレートのすべてのインスタンス化を網羅するように作成されます。 |
| 103 | テンプレート引数には制約チェックが適用される必要があります。 |
| 105 | テンプレート定義のそのインスタンス化コンテキストに対する依存は、最小限にされる必要があります。 |
| 106 | ポインター型の特殊化が適切な場合は、それを行う必要があります。 |
関数
| 番号 | JSF++ 定義 |
|---|---|
| 112 | 関数の戻り値は、リソースのオーナーを不明瞭にしないようにします。 |
| 115 | 関数がエラー情報を返す場合、そのエラー情報はテストされなければなりません。 |
| 118 | NULL 値を使用できる場合は、引数をポインターによって渡す必要があります。
|
| 120 | オーバーロードされた演算またはメソッドは、同じセマンティクスを使用し、同じ名前を共有し、同じ目的をもち、仮パラメーターで区別されたファミリを構成する必要があります。 |
| 123 | アクセサー関数とミューテーターの数は最小限にする必要があります。 |
| 124 | トリビアルな転送関数はインライン化する必要があります。 |
| 125 | 不要な一時オブジェクトは避ける必要があります。 |
コメント
| 番号 | JSF++ 定義 |
|---|---|
| 128 | ドキュメント化対象のファイルの外部で動作またはソースをドキュメント化するコメント (たとえば、表、図、段落など) は、許可されてはなりません。 |
| 129 | ヘッダー ファイル内のコメントは、ドキュメント化対象の関数またはクラスの外部認識され得る動作を記述する必要があります。 |
| 130 | 実行可能コードのすべての行の目的は、コメントによって説明される必要があります。1 つのコメントが複数のコード行を説明していてもかまいません。 |
| 131 | コードによる記述の方が適切な内容をコメントで記述しないようにします (つまり、コードの内容の単なる繰り返しは避けます)。 |
| 132 | それぞれの変数宣言、typedef、列挙値、構造体メンバーにコメントを付けなければなりません。 |
| 134 | 関数によって行われる仮定 (制限) は、関数のプリアンブルでドキュメント化される必要があります。 |
初期化
| 番号 | JSF++ 定義 |
|---|---|
| 143 | 変数は、意味のある値で初期化されることができるまで導入してはなりません(それぞれ宣言スコープ、使用前の初期化、既定のコンストラクターに関する、AV ルール 136、AV ルール 142 および AV ルール 73 も参照してください)。 |
型
| 番号 | JSF++ 定義 |
|---|---|
| 146 | Floating point implementations shall comply with a defined floating point standard. 使用する規格は、ANSI®/IEEE® Std 754 [1] です。 |
共用体とビット フィールド
| 番号 | JSF++ 定義 |
|---|---|
| 155 | スペースを節約するためだけの目的で、データを 1 単語にパックするためにビット フィールドを使用してはなりません。 |
演算子
| 番号 | JSF++ 定義 |
|---|---|
| 167 | 選択したコンパイラの整数除算の実装について確認、ドキュメント化し、考慮します。 |
型変換
| 番号 | JSF++ 定義 |
|---|---|
| 183 | 型のキャストを避けるために考えられるあらゆる手段を実施する必要があります。 |
式
| 番号 | JSF++ 定義 |
|---|---|
| 204 | 副次的影響がある単一の操作は、次のコンテキストでのみ使用されます。
|
メモリ割り当て
| 番号 | JSF++ 定義 |
|---|---|
| 207 | カプセル化解除されたグローバル データは避けなければなりません。 |
移植可能コード
| 番号 | JSF++ 定義 |
|---|---|
| 210 | アルゴリズムでは、データがメモリ内でどのように表現されるかに関して仮定を行いません (たとえば、ビッグ エンディアンとリトル エンディアン、派生クラスにおける基底クラス サブオブジェクトの順序、アクセス指定子にまたがる非静的データ メンバーの順序など)。 |
| 210.1 | アルゴリズムは、アクセス指定子で区切られた非静的データ メンバーの割り当て順序に関する仮定を行いません。 |
| 211 | アルゴリズムは、short、int、long、float、double、long double が特定のアドレスで始まると仮定しません。 |
| 212 | アンダーフローまたはオーバーフローの機能はいかなる特別な方法によっても依存されません。 |
| 214 | ローカルでない静的オブジェクトが、別々の翻訳単位内において、特別な順序で初期化されるとは仮定されません。 |
効率についての注意点
| 番号 | JSF++ 定義 |
|---|---|
| 216 | プログラマは、コードの最適化を尚早に行わないようにします。 |
その他
| 番号 | JSF++ 定義 |
|---|---|
| 217 | コンパイル時のエラーとリンク時のエラーは、ランタイム エラーよりも優先される必要があります。 |
| 218 | コンパイラ警告レベルは、プロジェクトのポリシーに準拠して設定されなければなりません。 |
テスト
| 番号 | JSF++ 定義 |
|---|---|
| 219 | 基底クラスのインターフェイスに適用されるすべてのテストは、すべての派生クラスのインターフェイスにも適用されます。派生クラスが、より強力な事後条件/不変性を課している場合、新しい事後条件/不変性が派生クラスのテストに代入されます。 |
| 220 | フラット化されたクラスに対しては、構造カバレッジ アルゴリズムが適用されます。 |
| 221 | バーチャル関数を含む継承階層内のクラスの構造カバレッジは、同じポリモーフィック参照の各セットに対して可能なすべての解決のテストを含みます。 |