メインコンテンツ

命令の数

関数ごとの指示の数

説明

このメトリクスは関数本体内の命令の数を測定します。

このメトリクスの推奨上限は 50 です。さらにモジュール化されたコードについては、このメトリクスの上限を適用するようにしてください。

メトリクスに制限を適用するには、Polyspace を使用したコード複雑度メトリクスの計算を参照してください。

計算の詳細

メトリクスは、次のルールを使って計算されます。

  • セミコロン (;) で終わる単純なステートメントが 1 つの命令です。ステートメントが空の場合、命令としてカウントされません。

  • 変数宣言が 1 つの命令としてカウントされるのは、以下の条件のいずれかを満たす場合です。

    • 変数が非静的で、初期化されている。次に例を示します。

      int var = 0;
      静的変数の宣言はステートメントとしてカウントされない。これらは、コンパイル時に C++ で初期化される可能性があります。

    • 変数がコンストラクターなどの関数呼び出しによって初期化されている。次に例を示します。

      class A {
      public:
      	A();
      	A(int in) {
      		/*..*/
      	}
      };
      //...
      A obj(5); //Calls A::A(int). This is considered a single instruction.

  • ifforbreakgotoreturnswitchwhiledo-while などの制御フロー ステートメントは 1 つの命令としてカウントされます。

  • コード ブロックの開始と終了を示す中かっこは、命令としてカウントされません。次のブロックは 1 つの命令としてカウントされます。

    {
        int var = 1;
    }

  • ラベル自体は命令としてカウントされません。次のコードは 2 つの命令を示しています。case ラベル自体は命令としてカウントされません。

    switch (1) {  // Instruction 1: switch 
        case 0: 
        case 1: 
        case 2: 
        default: 
        break;    // Instruction 2: break 
     } 

必要に応じてコンパイラにより生成される暗黙的なコンストラクターについては、命令の数は計算されません。たとえば、コンストラクターを =default として宣言すると、Polyspace® はこのコンストラクターの命令の数を計算しません。

すべて展開する

int func(int *arr, int size) {
	int i, countPos = 0, countNeg = 0, countZero = 0;
	for(i = 0; i < size; i++) {
		if(arr[i] > 0)
			countPos++;
		else
			if(arr[i] == 0)
				countZero++;
			else
				countNeg++;
	}
}

この例では、Polyspace は func のメトリクス "命令の数" の値は 9 であることを報告します。命令は以下のとおりです。

  • countPos = 0

  • countNeg = 0

  • countZero = 0

  • for(i = 0;i < size; i++) { ... }

  • if(arr[i] >= 0)

  • countPos++

  • else if(arr[i] == 0)

    最後の elseif-else 命令の一部としてカウントされます。

  • countZero++

  • countNeg++

メモ

このメトリクスは、メトリクス実行可能行数とは異なります。次に例を示します。

  • for(i = 0;i < size; i++) には命令が 1 つ、実行可能行が 1 つあります。

  • 次のコードには命令が 1 つありますが、実行可能行は 3 つあります。

    for(i=0;
        i<size;
        i++)

この例は、Polyspace がクラスの命令数を計算する方法を示しています。クラス myClass には 3 つのデータ メンバーが含まれており、そのうち 2 つは非静的データ メンバー初期化を使用して初期化されます。クラスの既定のコンストラクターは = default として宣言されています。このクラスはユーザー定義の既定以外のコンストラクターも宣言しています。

#include <cstdint>

class myClass
{
public:
	myClass(uint32_t &a) : num1(a) {}
	myClass() = default;

private:
	uint32_t num1;
	uint32_t num2{};
	uint32_t num3{};

};

コンストラクター myClass(uint32_t &a) は非静的データ メンバー初期化を使用して 2 つのデータ メンバーを初期化します。各初期化は 1 つの命令としてカウントされますが、初期化子リストの num1 の初期化はカウントされません。このコンストラクターの場合、命令の数は 2 です。

既定のコンストラクターは = default として宣言されています。この既定のコンストラクターは必要に応じてコンパイラにより生成されます。Polyspace は、このようなコンパイラ生成の暗黙的なコンストラクターの命令数を計算しません。

メトリクス情報

グループ: 関数
頭字語: STMT
HIS メトリクス:あり