メインコンテンツ

AUTOSAR C++14 Rule A0-1-3

Every function defined in an anonymous namespace, or static function with internal linkage, or private member function shall be used

説明

ルール定義

Every function defined in an anonymous namespace, or static function with internal linkage, or private member function shall be used.

根拠

匿名の名前空間で定義された関数と内部リンクを含む静的関数は、それらが定義されたコンパイル ユニット内部でしか呼び出すことができません。同様に、プライベート メンバー関数は、それらが属しているクラス実装内部でしか呼び出すことができません。このいずれの場合も、このような関数の目的は、後でプロジェクトに統合する外部コードではなく、現在のソース コードでのみ使用することです。このような関数を使用しない場合は、不十分なソフトウェア設計や現在のコード ベース内のロジックの不足と見なされます。

メモ

ソース コード内で明示的に関数を呼び出せば、実行時にその呼び出しまで到達できなくても、このルールを満たしていることになります。別のルールの M0-1-1 では、到達不能なすべてのコード出現がチェックされます。

Polyspace 実装

ソース コード内で定義された関数が明示的に呼び出されず、次のカテゴリのいずれかに属している場合は、チェッカーがその関数定義にフラグを設定します。

  • 匿名の名前空間で定義された関数

  • 内部リンクを含む静的関数

  • クラス定義の外部で定義されたプライベート メンバー関数

チェッカーは、クラス定義の内部で定義された呼び出されないプライベート メンバー関数にフラグを設定しません。

既定の Polyspace® as You Code 解析では、チェッカーがクラス定義の外部で定義されたプライベート メンバー関数にフラグを設定しませんPolyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <cstdint>

namespace
{
  void F1()   // Compliant, function in anonymous namespace used
  {
  }
  
  void F2()   // Noncompliant, function in anonymous namespace not used
  {
  }
}

int main()
{
  F1();
  return 0;
}

静的関数 F2 は、匿名の名前空間で定義されていますが、main 関数から呼び出されていないため、このコーディング ルールに違反します。

#include <cstdint>
static void F1() // Compliant, static function called from main
{
}

static void F2() // Noncompliant, static function not called from main
{
}

int main()
{
  F1();
  return 0;
}

静的関数 F2 は、内部リンクを含みますが、main 関数から呼び出されていないため、このコーディング ルールに違反します。

#include <cstdint>

class C
{
  public:
    C() : x(0) {}
    void M1(std::int32_t);                
    void M2(std::int32_t, std::int32_t);  
  private:
    std::int32_t x;
    void M1PrivateImpl(std::int32_t j);    
};

// Compliant, member function is used
void C::M1(std::int32_t i)   
{
  x = i;
}

// Compliant, never used but declared as public
void C::M2(std::int32_t i, std::int32_t j)     
{
  x = (i > j) ? i : j;
}

void C::M1PrivateImpl(std::int32_t j) // Noncompliant, private member function never used
{
  x = j;
}

int main()
{
  C c;
  c.M1(1);
  return 0;
}

プライベート メンバー関数 M1PrivateImpl はクラス C のどのメンバーからも呼び出されていないため、このコーディング ルールに違反します。

チェック情報

グループ: 言語に依存しない問題
カテゴリ: Required、Automated

バージョン履歴

R2020b で導入