メインコンテンツ

JSF AV C++ コーディング ルール

サポートされる JSF C++ コーディング ルール

コードのサイズと複雑度

番号JSF®++ 定義Polyspace® 実装
1どのような関数 (またはメソッド) に含まれる論理ソース コード行 (L-SLOC) も、200 行を超えてはなりません

レポート ファイル内のメッセージ:

<function name> has <num> logical source lines of code.

3すべての関数の循環的複雑度数は 20 以下です

レポート ファイル内のメッセージ:

<function name> has cyclomatic complexity number equal to <num>.

環境

番号JSF++ 定義Polyspace 実装
8All code shall conform to ISO/IEC 14882:2002(E) standard C++.コンパイル エラー メッセージを報告します。
9C++ 基本ソース文字セットで指定されている文字のみが使用されなければなりません 
113 文字表記は使用してはなりません 
12次の 2 文字表記は使用してはなりません<%, %>, <:, :>, %:, %:%:.

レポート ファイル内のメッセージ:

The following digraph will not be used: <digraph>.

2 文字表記を報告します。ルール レベルが警告に設定されている場合、2 文字表記は -compiler iso でサポートされていない場合でも許可されます。

13マルチバイト文字とワイド文字列リテラルは使用されてはなりませんL'c'L"string" および wchar_t の使用を報告します。
14リテラル接尾辞は、小文字よりも大文字を使用します 
15実行時チェックへの準備をします (防御的プログラミング)。ソフトウェアでのチェックで行われます。

ライブラリ

番号JSF++ 定義Polyspace 実装
17

エラー インジケーター errno は使用されません

errno は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。
18

The macro offsetof, in library <stddef.h>, shall not be used.

offsetof は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。
19

<locale.h> および関数 setlocale は使用されません

setlocale および localeconv は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。
20

マクロ setjmp と関数 longjmp は使用されません

setjmp および longjmp は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。
21

<signal.h> の信号処理機能は使用されません

signal および raise は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。
22

入出力ライブラリ <stdio.h> は使用されません

<stdio.h> のすべての標準関数は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。
23

ライブラリ <stdlib.h> のライブラリ関数 atofatoi および atol は使用されません

atofatoi および atol は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。
24

ライブラリ <stdlib.h> のライブラリ関数 abortexitgetenv および system は使用されません

abortexitgetenv および system は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。
25

ライブラリ <time.h> の時間処理関数は使用されません

clockdifftimemktimeasctimectimegmtimelocaltime および strftime は、マクロとして、また外部 "C" リンクをもつグローバルとして使用されないようにします。

プリプロセッサ命令

番号JSF++ 定義Polyspace 実装
26次のプリプロセッサ命令 #ifndef#define#endif#include のみが使用されます 
27

#ifndef, #define and #endif will be used to prevent multiple inclusions of the same header file.その他の、ヘッダー ファイルを複数インクルードさせないための手法は使用してはなりません

パターン #if !defined#pragma once#ifdef #define の不足を検出します。
28プリプロセッサ命令 #ifndef および #endif は、同じヘッダー ファイルの複数のインクルードを防ぐため AV ルール 27 に定義された方法によってのみ、使用されなければなりませんAV ルール 27 に準拠しないすべての使用を検出します。35/27 に違反していないと見なし、#ifndef のみを報告します。
29プリプロセッサ命令 #define は、インライン マクロの作成には使用されません。代わりにインライン関数が使用されます。

ルールは 2 つの部分に分かれています。マクロ関数の定義 (29.def) と、マクロ関数の呼び出し (29.use) です。

レポート ファイル内のメッセージ:

  • 29.1 :プリプロセッサ命令 #define は、インライン マクロの作成には使用されません。

  • 29.2 :Inline functions shall be used instead of inline macros.

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

識別子には次による区別があってはなりません

  • 大文字と小文字の区別の混在

  • アンダースコア文字の有無

  • 文字 'O' と、数字 '0' または文字 'D' の入れ替え

  • 文字 'I' と、数字 '1' または文字 'l' の入れ替え

  • 文字 'S' と数字 '5' の入れ替え

  • 文字 'Z' と数字 2 の入れ替え

  • 文字 'n' と文字 'h' の入れ替え

スコープにかかわらずチェックされます。マクロとその他の識別子の間ではチェックされません。

レポート ファイル内のメッセージ:

  • Identifier Idf1 (file1.cpp line l1 column c1) and Idf2 (file2.cpp line l2 column c2) only differ by the presence/absence of the underscore character.

  • Identifier Idf1 (file1.cpp line l1 column c1) and Idf2 (file2.cpp line l2 column c2) only differ by a mixture of case.

  • Identifier Idf1 (file1.cpp line l1 column c1) and Idf2 (file2.cpp line l2 column c2) only differ by letter O, with the number 0.

50

クラス、構造体、名前空間、列挙値または typedef を使用して作成された型の名前の最初の単語は、大文字で開始されなければなりません。その他の文字はすべて小文字でなければなりません

レポート ファイル内のメッセージ:

  • The first word of the name of a class will begin with an uppercase letter.

  • The first word of the namespace of a class will begin with an uppercase letter.

51関数名と変数名に含まれているすべての文字には、すべて小文字を使用しなければなりません

レポート ファイル内のメッセージ:

  • All letters contained in variable names will be composed entirely of lowercase letters.

  • All letters contained in function names will be composed entirely of lowercase letters.

52定数と列挙値の識別子は小文字です

レポート ファイル内のメッセージ:

  • Identifier for enumerator value shall be lowercase.

  • Identifier for template constant parameter shall be lowercase.

53ヘッダー ファイルには常に ".h" のファイル名拡張子が付かなければなりません

オプション -dos が指定された場合は .H が使用可能です。

53.1次の文字シーケンスヘッダー ファイル名には現われません'\/*// または " 
54実装ファイルには常に ".cpp" のファイル名拡張子が付かなければなりませんオプション -dos を指定した場合、大文字と小文字は区別されません。
57クラスのパブリック セクション、保護された セクション、プライベート セクションは、この順序で宣言されなければなりません 
583 つ以上のパラメーターをもつ関数を宣言および定義する場合、先頭のかっこと最初の引数は、関数名と同じ行に記述されなければなりません。追加の各引数は、個別の行に記述されなければなりません (閉じかっこは最後の引数のすぐ後になります)。2 つのパラメーターが同じ行にないことを検出します。最初のパラメーターが、関数名と同じ行にあるようにします。閉じかっこはチェックされません。
59if、else if、else、while、do ... while または for ステートメントの本体を構成するステートメントは、中かっこで、たとえそれが空のブロックを構成するとしても、常に囲まれます

レポート ファイル内のメッセージ:

  • The statements forming the body of an if statement shall always be enclosed in braces.

  • The statements forming the body of an else statement shall always be enclosed in braces.

  • The statements forming the body of a while statement shall always be enclosed in braces.

  • The statements forming the body of a do ... while statement shall always be enclosed in braces.

  • The statements forming the body of a for statement shall always be enclosed in braces.

60ブロックを囲む中かっこ ("{}") は、ブロックのすぐ上と下の行の同じ列にそれぞれ配置されなければなりませんステートメント ブロックの中かっこが同じ列にあることを検出します。
61ブロックを囲む中かっこ ("{}") がある行には、コメント以外には何も記述してはなりません 
62デリファレンス演算子 '*' とアドレス演算子 '&' は、型指定子と直接結合されます。変数、パラメーター、フィールド宣言で、型と"*" "&" の間にスペースがある場合に報告します。
63'.' または '->' の周囲や、単項演算子とオペランドの間には、スペースが使用されてはなりません。

次の文字が空白に直接結合されていない場合に報告します。

  • .

  • ->

  • !

  • ~

  • -

  • ++

float/double の定義で "." が使用された場合に違反が報告されます。

クラス

番号JSF++ 定義Polyspace 実装
67パブリック データおよび保護されたデータは、クラスではなく構造体でのみ使用される必要があります 
68暗黙的に生成された不要なメンバー関数は、明示的に禁止されます。既定のコンストラクター、代入演算子、コピー コンストラクターまたはデストラクターが宣言されていない場合に報告します。
71.1クラスのバーチャル関数は、そのデストラクターまたはそのいずれかのコンストラクターからは実行されません。コンストラクターまたはデストラクターが直接バーチャル関数を呼び出している場合に報告します。
74非静的クラスメンバーは、コンストラクターの本体での代入よりも、メンバー初期化リストによって実行されなければなりません

配列を除くすべてのデータは、初期化リストで初期化される必要があります。ctor の本体に代入が存在することを報告するわけではありません。

レポート ファイル内のメッセージ:

Initialization of nonstatic class members "<field>" will be performed through the member initialization list.

75初期化リストのメンバーは、クラス内の宣言順序と同じ順序でリストされます 
76コピー コンストラクターと代入演算子は、データ項目へのポインターまたは非トリビアル デストラクターを含むクラスに対して宣言されます

レポート ファイル内のメッセージ:

  • no copy constructor and no copy assign

  • no copy constructor

  • no copy assign

77.1メンバー関数の定義は、対応するクラスまたは構造体の暗黙的に宣言されたコピー コンストラクターと同じシグネチャを生成する既定の引数を含みません明示的なコピー コンストラクターが存在する場合は報告しません。
78バーチャル関数をもつすべての基底クラスは、バーチャル デストラクターを定義します 
79クラスによって取得されたすべてのリソースは、クラスのデストラクターで解放されます。

コンストラクターで呼び出される "new" の数が、そのデストラクターで呼び出される "delete" よりも多い場合に報告します。

メモ

"new" が "if/else" の中で実行される場合でも違反になります。

81代入演算子は自己代入を正しく処理するものとします。

コピー代入の本体が "if (this != arg)" で始まっていない場合に報告します。

空の else ステートメントが if の後に続いているか、本体に return ステートメントのみが含まれている場合は、違反になりません。

if ステートメントの後に return ステートメント以外のステートメントが続いている場合は違反になります。

82代入演算子は *this への参照を返します

次の演算子は、メソッドについては *this を返し、プレーン関数については *first_arg を返す必要があります。

  • operator=

  • operator+=

  • operator-=

  • operator*=

  • operator >>=

  • operator <<=

  • operator /=

  • operator %=

  • operator |=

  • operator &=

  • operator ^=

  • 接頭辞 operator++

  • 接頭辞 operator--

戻り値が存在しない場合は報告しません。

型が一致しない場合、特にメッセージはありません。

レポート ファイル内のメッセージ:

  • An assignment operator shall return a reference to *this.

  • An assignment operator shall return a reference to its first arg.

83代入演算子は、クラスの不変性に影響を与えるすべてのデータ メンバーと基底を代入します (たとえば、キャッシュを表すデータ要素はコピーされる必要はありません)。コピー代入でデータ メンバーのすべてが代入されない場合に報告します。派生クラスでは、継承されたコピー代入がコピー代入において呼び出さない場合にも報告します。
88多重継承は、次の限定形式でのみ許可されますn 個のインターフェイスと m 個のプライベート実装、さらに最大 1 個の保護された実装。

レポート ファイル内のメッセージ:

  • Multiple inheritance on public implementation shall not be allowed: <public_base_class> is not an interface.

  • Multiple inheritance on protected implementation shall not be allowed : <protected_base_class_1>.

  • <protected_base_class_2> はインターフェイスではありません。

88.1ステートフルなバーチャル基底は、それにアクセスする各派生クラスで明示的に宣言されます 
89基底クラスは、同じ階層内でバーチャルと非バーチャルの両方にはなりません 
94継承された非バーチャル関数は派生クラスで再定義されません

デストラクターについては報告しません。

レポート ファイル内のメッセージ:

Inherited nonvirtual function %s shall not be redefined in a derived class.

95継承された既定のパラメーターは再定義されることはありません 
96配列はポリモーフィックには扱われません指し示されている型が基底クラスとして使用される式での、ポインター演算と配列に似たアクセスを報告します。
97配列はインターフェイスで使用されません配列からポインターへの減衰を防ぐためだけのものです。プライベート メソッドに対してはチェックされません。
97.1等価演算子 (== または !=) のオペランドは、バーチャル メンバー関数へのポインターにはなりませんポリモーフィック クラス (バーチャルかどうかを静的に決定できない) のメンバー関数のポインターについて == および != を報告します。ただし、1 つの引数が null 定数の場合を除きます。

名前空間

番号JSF++ 定義Polyspace 実装
98main() を除くすべての非ローカル名は、何らかの名前空間の中に配置される必要があります 
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 値を使用できない場合は、引数を参照渡しにする必要があります。

  • 117.1:関数がオブジェクトの値を変更すべきではない場合は、オブジェクトを const T& として渡す必要があります。

  • 117.2:関数がオブジェクトの値を変更できる場合は、オブジェクトを T& として渡す必要があります。

関数本体でパラメーターが NULL または nullptr と比較されない場合、チェッカーはパラメーターのポインター渡しにフラグを設定します。NULL に対するチェックが行われないことはパラメーターが NULL である可能性がないことを示すので、参照渡しにすることができます。

以下の場合、チェッカーは違反を報告しません。

  • パラメーターがスマート ポインターを使用して渡された場合。

    生のポインターのみが考慮されます。

  • ポインター パラメーターが関数内でデリファレンスされない場合。

119関数は、それ自身を直接的にも間接的にも呼び出しません (つまり、再帰は許可されません)。

チェッカーは、それ自体を直接的または間接的に呼び出すそれぞれの関数について報告します。1 つの再帰サイクルに複数の関数が関与している場合でも、それぞれの関数が個別に報告されます。

再帰サイクルの総数は、コード複雑度メトリクス [再帰の数] を使用して計算できます。チェッカーと違って、メトリクスでは、オブジェクトの作成中にコンパイラが生成したコンストラクターなどに対する暗黙的な呼び出しも考慮されます。

121ステートメントが 1 個または 2 個の関数だけがインライン関数の候補と見なされることが必要ですステートメントが 2 個を超えるインライン関数を報告します。
122トリビアル アクセサー関数とミューテーター関数はインライン化される必要があります

メソッドがトリビアルかどうかを判断するため、チェッカーでは以下の条件を使用します。

  • アクセサー メソッドは、パラメーターがなく、非静的データ メンバーまたは非静的データ メンバーへの参照を返す 1 つの return ステートメントを含む場合、トリビアルです。

    メソッドの戻り値の型は、データ メンバーの型と正確に一致するか、その型への参照でなければなりません。

  • ミューテーター メソッドは、戻り値の型が void で、パラメーターが 1 つ、非静的データ メンバーにパラメーターを代入する 1 つの代入ステートメントを含む場合、トリビアルです。

    パラメーター型は、データ メンバーの型と正確に一致するか、その型への参照でなければなりません。

チェッカーは、inline キーワードが付いていないクラス外部で定義されたトリビアル アクセサー メソッドとミューテーター メソッドを報告します。

チェッカーは、テンプレート メソッドやバーチャル メソッドにはフラグを設定しません。

コメント

番号JSF++ 定義Polyspace 実装
126有効な C++ スタイル コメント (//) のみが使用されます 
127使用されない (コメント アウトされた) コードは削除されます。

チェッカーは内部でヒューリスティックな方法を使用してコメントアウトされたコードを検出します。たとえば、#;{} などの文字はコードを含む可能性があるコメントを示します。このようなコメントは他のメトリクスに対して評価されて、コメントになりすましたコードである可能性を判断します。たとえば、数個の単語が間に記号をはさまずに連続していれば、この可能性は減少します。

チェッカーは、コードを含んでいても次のコメントに対してはフラグを設定しません。

  • /**/*!///、または //! で始まる doxygen コメント。

  • 同じ記号を複数個繰り返すコメント。たとえば、次の場合の = 記号。

    // ================================
    // A comment
    // ================================*/

  • ファイルの最初の行のコメント。

  • C スタイル (/* */) と C++ スタイル (//) が混在したコメント。

チェッカーは、このようなコメントがドキュメンテーション目的か、または事前に考慮されたうえで意図的に入力されたものと見なします。

133すべてのソース ファイルは、ファイル名についての情報、その内容、およびプログラムで必要とされる情報 (たとえば、法的声明、著作権情報など) を提供する概要コメントと共にドキュメント化されなければなりません。

ファイルが 2 つのコメント行で始まっていない場合に報告します。

メモ: このルールについては、ソース コードに注釈を付けることができません。

宣言と定義

番号JSF++ 定義Polyspace 実装
135内側のスコープの識別子は外側のスコープの識別子と同じ名前を使用せず、したがってその識別子を隠蔽しません 
136宣言は、できるだけ小さいスコープにする必要があります。

次の場合に報告します。

  • グローバル変数が 1 つの関数のみで使用されている場合。

  • ローカル変数が、同じブロック内のその宣言と同じレベルのステートメント (exprreturninit など) で使用されていないか、その宣言の 2 つのサブ ステートメントで使用されていない場合。

メモ

  • 使用されていない変数が報告されます。

  • 定義での初期化は無視されます (アクセスと見なされません)。

137ファイル スコープのすべての宣言は、できるだけ静的であることが必要です。

R2021a 以降、このチェッカーは 1 ファイルのみで使用する非静的オブジェクトの宣言に対して起動されます。単一ファイルを解析する場合でもチェッカーは起動します。このチェッカーは、次のような未使用のままのオブジェクトの宣言では起動されません。

  • インスタンス化されていないテンプレート

  • 呼び出されない関数 static または extern

  • 呼び出されない未定義のローカル関数

  • 未使用の型および変数

このチェッカーは、既定の Polyspace as You Code 解析では非アクティブにされますPolyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください

138同一翻訳単位内で、識別子が同時に内部リンクと外部リンクの両方をもつことはありません 
139外部オブジェクトは、複数のファイルで宣言されてはなりません。

1 つの翻訳単位内で重複するすべての宣言を報告します。宣言の局所化がすべての翻訳単位で同じでない場合に報告します。

140レジスタ ストレージ クラス指定子は使用されません 
141クラス、構造体、列挙値は、その型の定義の中で宣言されてはなりません 

初期化

番号JSF++ 定義Polyspace 実装
142すべての変数は使用前に初期化されます

Polyspace は、コードに以下の問題が含まれている場合にこの違反を報告します。

144Braces 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 実装
1498 進定数 (ゼロ以外) は使用されません 
15016 進定数は、すべて大文字により表現されなければなりません 
151コード内では数値を使用してはなりません。代わりにシンボリック値が使用されなければなりません。

式、-const 以外の初期化および switch case 内の直接の数値定数 (整数、浮動小数点数、1, 0 以外) を報告します。char 定数は許可されます。テンプレートの型でないパラメーターについては報告しません。

151.1文字列リテラルは変更されません。

ルール チェッカーは、以下への文字列リテラルの割り当てにフラグを設定します。

  • const オブジェクトへのポインター以外のポインター。

  • const 修飾子が付いていない配列。

変数

番号JSF++ 定義Polyspace 実装
152同じ行で複数の変数を宣言してはなりません連続する 2 つの宣言ステートメントが同じ行にある場合に報告します (ステートメントがマクロ定義の一部である場合を除く)。

共用体とビット フィールド

番号JSF++ 定義Polyspace 実装
153共用体は使用されません 
154ビット フィールドには、明示的に符号のない整数型または列挙型のみが使用されます 
156構造体 (またはクラス) のすべてのメンバーには名前が付けられ、その名前でのみアクセスされます名前のないビット フィールドを報告します (名前のないフィールドは許可されません)。

演算子

番号JSF++ 定義Polyspace 実装
157&& または || 演算子の右オペランドは、二次的影響を含みません。

ルール 159 に違反していないことを前提としています。

レポート ファイル内のメッセージ:

  • The right hand operand of a && operator shall not contain side effects.

  • The right hand operand of a || operator shall not contain side effects.

158

The operands of a logical && or || shall be parenthesized if the operands contain binary operators.

レポート ファイル内のメッセージ:

  • The operands of a logical && shall be parenthesized if the operands contain binary operators.

  • The operands of a logical || shall be parenthesized if the operands contain binary operators.

例外: X || Y || Z Z&&Y &&Z

159

演算子 ||&&、単項演算子 & は、オーバーロードされません

レポート ファイル内のメッセージ:

  • Unary operator & shall not be overloaded.

  • Operator || shall not be overloaded.

  • Operator && shall not be overloaded.

160代入式は、式ステートメントの式としてのみ使用されます+=++ などでない、単純な代入のみ。
162算術演算または比較演算では、符号付きの値と符号なしの値は混在されません 
163符号なし演算は使用されません 
164シフト演算子の右オペランドは、ゼロ以上、左オペランドのビット幅マイナス 1 未満になります 
164.1右シフト演算子の左オペランドは負の値にはなりません定数の場合の + を検出します。動的変数の場合にはソフトウェアによって検出されます。
165単項マイナス演算子は符号なしの式に適用されません 
166sizeof 演算子は、二次的影響がある式に使用してはなりません 
168コンマ演算子は使用されません 

ポインターと参照

番号JSF++ 定義Polyspace 実装
169ポインターへのポインターはできるだけ避けるようにします。main の引数を除く、第 2 レベルのポインターを報告します。
1702 レベルを超えるポインター間接参照は使用されません変数またはパラメーターについてのみ報告します。
171

関係演算子は、両方のオペランドが同じ型で次のものを指しているのでない限り、ポインター型に適用されません。

  • 同じオブジェクト

  • 同じ関数

  • 同じオブジェクトのメンバー

  • 同じ配列の要素 (同じ配列の終わりを超えた要素を含む)

関係演算子がポインター型に対して使用されている場合に報告します (キャストは無視されます)。
173自動ストレージを使用したオブジェクトのアドレスは、そのオブジェクトが存在しなくなった後まで存続するオブジェクトに代入されません 
174null ポインターはデリファレンスされませんソフトウェアでのチェックで行われます。
175ポインターには NULL との比較または NULL の代入は行われません。代わりにプレーンな 0 を使用します。ポインター コンテキストでの NULL マクロの使用を報告します。
176

typedef は、関数ポインターの宣言時にプログラムの構文を単純化するために使用されなければなりません

typedef でない関数ポインターか、変数、フィールド、パラメーターの型に対するメンバー関数のポインターを報告します。関数、キャスト、例外指定の型を返します。

型変換

番号JSF++ 定義Polyspace 実装
177ユーザー定義の変換関数は避けるようにします

ユーザー定義変換関数、1 つのパラメーターをとる明示的でないコンストラクター、その他の既定値 (未定義のものも含む) を報告します。

コピー コンストラクターは報告しません。

コンストラクターの場合の追加のメッセージ:

This constructor should be flagged as "explicit".

178

ダウン キャスト (基底クラスから派生クラスへのキャスト) は、次のいずれかのメカニズムによってのみ可能になります

  • 動的なキャストのように振る舞うバーチャル関数 (比較的単純な場合に最も有用)。

  • ビジター (または類似の) パターンの使用 (複雑なケースで最も有用)。

dynamic_cast を含む、明示的なダウン キャストを報告します(ビジター パターンについては特別なケースはありません)。
179バーチャル基底クラスへのポインターは派生クラスへのポインターに変換されませんこの特定のダウン キャストを報告します。dynamic_cast を許可します。
180情報が失われる可能性がある暗黙的変換は使用されません

次の暗黙的キャストを報告します。

integer => smaller integer unsigned => smaller or eq signed signed => smaller or eq un-signed integer => float float => integer

bool に対するキャストは報告しません。定数に対する暗黙的キャストの報告は、オプション -scalar-overflows-checks signed-and-unsigned で実行されます。

181冗長な明示的キャストは使用してはなりません無駄なキャスト cast T to T を報告します。同等の typedefs へのキャストも報告されます。
182任意の型とポインターの間では型キャストは使用されませんルール 181 が適用される場合は報告しません。
184浮動小数点数は整数に変換されません。ただし、そのような変換がアルゴリズムの要件に指定されていたり、ハードウェア インターフェイスに必要である場合を除きます。float->int 変換を報告します。暗黙的な変換は報告しません。
185従来の C スタイルのキャストではなく、C++ スタイルのキャスト (const_castreinterpret_cast および static_cast) が使用されます 

フロー制御標準

番号JSF++ 定義Polyspace 実装
186到達不能コードがないものとします

ソフトウェアでのグレー チェックで行われます。

187すべての非 null ステートメントは、潜在的に副次的影響を備えています 
188switch ステートメント以外ではラベルは使用されてはなりません 
189goto ステートメントは使用されません 
190continue ステートメントは使用されません 
191break ステートメントは使用されません (switch ステートメントの各ケースを終了する場合を除く)。 
192すべての ifelse if 文には、最終の else 句か、最終の else 句が不要である理由を示すコメントが含まれなければなりません。else ifelse 句を含む必要があります。
193switch ステートメントの空でない case 句はすべて、break ステートメントで終わります 
194全列挙値のテストを意図していない switch ステートメントにはすべて、最終の default 句が含まれます不足している default についてのみ報告します。
195switch 式は、ブール値を表してはなりません 
196すべての switch ステートメントには、2 つ以上の case とオプションの defaultなければなりません 
197浮動小数点変数はループ カウンターとして使用されません1 個のループ パラメーターを仮定します。
198for ループの初期化式では、単一の for ループ パラメーターの値の初期化以外の処理を実行してはなりませんloop パラメーターを決定できない場合に報告します。ルール 200 に違反していないことを前提としています。loop variable パラメーターは変数であると仮定されます。
199for ループのインクリメント式は、単一ループ パラメーターをループの次の値に変更する以外の処理を実行してはなりませんクラス タイプでない 1 個のループ パラメーターを仮定します (ルール 198)。このルールが報告されるには、ルール 200 に違反してはなりません。
200for ループでは null 初期化またはインクリメント式を使用してはなりません。代わりに while ループが使用されます。 
201反復カウントのために for ループの中で使用される数値変数は、ループの本体内では変更されません。1 個のループ パラメーター (AV ルール 198) と、エイリアス書き込みがないことを仮定します。

番号JSF++ 定義Polyspace 実装
202浮動小数点変数について、完全な等価性または非等価性はテストされません直接の等価性/非等価性のみを報告します。すべての式に対してチェックが行われます。
203式の評価の結果によるオーバーフロー/アンダーフローは生じませんソフトウェアでのオーバーフロー チェックで行われます。
204

副次的影響がある単一の操作は、次のコンテキストでのみ使用されます。

  • それ自身

  • 代入の右側

  • 条件

  • 関数呼び出しの中で副次的影響がある唯一の引数式

  • ループの条件

  • switch 条件

  • チェーン操作の単一の部分

次の場合に報告します。

  • return ステートメントで二次的影響が見つかった場合。

  • 1 つの値に対する二次的影響が存在し、関数呼び出しの 1 つのオペランドのみに二次的影響がある場合。

204.1The value of an expression shall be the same under any order of evaluation that the standard permits.

次の場合に報告します。

  • 同じ式で変数が記述されて再利用される場合。

  • volatile 変数が複数回アクセスされる場合。

205volatile キーワードは、ハードウェアとの直接インターフェイス以外には使用されませんvolatile キーワードが使用されている場合に報告します。

メモリ割り当て

番号JSF++ 定義Polyspace 実装
206空きストア (ヒープ) への割り当てとその解放は、初期化後には行いませんC ライブラリ関数 malloccallocreallocfree の呼び出しと、関数またはメソッド内のすべての new/delete 演算子を報告します。

障害処理

番号JSF++ 定義Polyspace 実装
208C++ の例外は使用されませんtrycatchthrow spec および throw を報告します。

移植可能コード

番号JSF++ 定義Polyspace 実装
209

基本的な型 intshortlongfloat および double は使用されません。特定の長さの同等の型をコンパイラごとに typedef で定義し、これらの型名をコードで使用します。

直接の typedefs を通じた基本的な型のみが使用可能です。
213式内では、算術演算子の下位という C++ の演算子の優先順位規則には依存しません。

二項演算に、かっこで囲まれていない、優先順位が下位の操作であるオペランドがある場合に報告します。

かっこで囲まれずに使用されているビット演算子およびシフト演算子と、二項演算の引数を報告します。

215ポインター演算は使用してはなりません

次を報告します。p + Ip - Ip++p--p+=p-=

p[i] は許可されます。

サポートされていない JSF++ ルール

コードのサイズと複雑度

番号JSF++ 定義
2自己変更コードはないものとします。

ルール

番号JSF++ 定義
4

"Should (勧告)" ルールを破る場合は、開発者から次の承認を受けなければなりません。

  • ソフトウェア エンジニアリング リーダーからの承認 (開発 CM ツールにおいてユニットごとに承認取得)

5

"Will (必要)" または "Shall (必須)" ルールを破る場合は、開発者から次の承認を受けなければなりません。

  • ソフトウェア エンジニアリング リーダーからの承認 (開発 CM ツールにおいてユニットごとに承認取得)

  • ソフトウェア製品マネージャーからの承認 (開発 CM ツールにおいてユニットごとに承認取得)

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演算子のオーバーロードは、慎重かつ通常の方法で使用されなければなりません。
852 個の演算子が反対の場合 (たとえば == と !=)、両方が定義され、一方は他方との関係で定義されなければなりません。
86単純で独立した概念を表すには、具象型を使用する必要があります。
87階層は、抽象クラスに基づいている必要があります。
90頻繁に使用されるインターフェイスは、最小限、一般的および抽象的であることが必要です。
91"is-a" 関係を実装するには、パブリックな継承を使用しなければなりません。
92

サブタイプ (パブリックに派生するクラス) は、システム実行時の、異なるサブクラス インスタンスの同一変数またはパラメーターへのポリモーフィックな代入に関係するすべてのクラスにおいて、次のガイドラインに従わなければなりません。

  • 派生メソッドの前提条件は、それがオーバーライドするメソッドの前提条件と少なくとも同じくらい弱くなければなりません。

  • 派生メソッドの事後条件は、それがオーバーライドするメソッドの事後条件と少なくとも同じくらい強くなければなりません。

つまり、サブクラスのメソッドは、それがオーバーライドする基底クラスのメソッドよりも少ないものを期待し多くのものを提供しなければなりません。このルールは、サブタイプがリスコフの置換原則に従わなければならないことを意味します。

93"has-a" または "is-implemented-in-terms-of" 関係は、メンバーシップまたはパブリックでない継承を通じてモデル化されなければなりません。

名前空間

番号JSF++ 定義
100

名前空間の要素は、次のように選択される必要があります。

  • 少ない (およそ 5 個の) 名前については、宣言または明示的な制限を使用します。

  • 多数の名前については、命令を使用します。

テンプレート

番号JSF++ 定義
101

テンプレートは、次の点についてレビューされます。

  1. その引数に対する仮定または要件を考慮しながら、単独のテンプレートに関して

  2. 実際の引数によってインスタンス化されたすべての関数に関して

102テンプレート テストは、実際のテンプレートのすべてのインスタンス化を網羅するように作成されます。
103テンプレート引数には制約チェックが適用される必要があります。
105テンプレート定義のそのインスタンス化コンテキストに対する依存は、最小限にされる必要があります。
106ポインター型の特殊化が適切な場合は、それを行う必要があります。

関数

番号JSF++ 定義
112関数の戻り値は、リソースのオーナーを不明瞭にしないようにします。
115関数がエラー情報を返す場合、そのエラー情報はテストされなければなりません。
118

NULL 値を使用できる場合は、引数をポインターによって渡す必要があります。

  • 118.1 – オブジェクトの値を変更すべきではない場合は、オブジェクトを const T* として渡す必要があります。

  • 118.2 – オブジェクトの値を変更できる場合は、オブジェクトを T* として渡す必要があります。

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

副次的影響がある単一の操作は、次のコンテキストでのみ使用されます。

  1. それ自身

  2. 代入の右側

  3. 条件

  4. 関数呼び出しの中で副次的影響がある唯一の引数式

  5. ループの条件

  6. switch 条件

  7. チェーン操作の単一の部分

メモリ割り当て

番号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バーチャル関数を含む継承階層内のクラスの構造カバレッジは、同じポリモーフィック参照の各セットに対して可能なすべての解決のテストを含みます。