メインコンテンツ

MISRA C++:2008 Rule 14-5-3

A copy assignment operator shall be declared when there is a template assignment operator with a parameter that is a generic parameter.

説明

ルール定義

A copy assignment operator shall be declared when there is a template assignment operator with a parameter that is a generic parameter. 1

根拠

ユーザー定義の代入演算子を宣言すると、対応する暗黙的演算子が抑止されます。ジェネリック パラメーターを持つテンプレート代入演算子を宣言すると、この動作は維持されません。この場合、暗黙的なシャロー コピー代入演算子を抑止するには、該当するクラスに対して明示的にコピー代入演算子のバージョンをインスタンス化します。

クラスに対してコピー代入演算子を宣言しない場合、コンパイラによって生成されたコピー代入演算子が代わりに実装で使用される可能性があります。明示的にコピー代入演算子を宣言しない場合、ディープ コピーが意図されているのにシャロー コピーが作成されるなど、予期せぬ結果を招く場合があります。

Polyspace 実装

構造体、クラス、または共用体にジェネリック パラメーターを持つテンプレート代入演算子が含まれるが、その構造体、クラス、または共用体内にコピー代入演算子が存在しない場合、Polyspace® はこのチェッカーにフラグを設定します。

トラブルシューティング

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

すべて展開する


#include<cstdint>
namespace example
{
  class A  //Noncompliant               
  {
    public:		
	  
      template <typename T>
      T & operator= ( T const & rhs ) 
      {
        if ( this != &rhs ) {
          delete i;
          i = new int32_t;
          *i = *rhs.i;
        }
        return *this;
      }
    private:
      int32_t * i;      // Member requires deep copy
  };
  
  void f ( A const & a1, A & a2 )
  {
    a2 = a1;   
  }
};

class A 内でコピー代入演算子が宣言されていないため、Polyspace はこのクラスにフラグを設定します。暗黙的に定義されたコピー代入演算子はテンプレート代入演算子によって抑止されません。その結果、a1 から a2 へのディープ コピーが必要な場合にシャロー コピーが作成されます。


#include<cstdint>
namespace example
{
  class A//Compliant                 
  {
    public:
      A & operator= (A const & rhs) {};
	  
      template <typename T>
      T & operator= ( T const & rhs )
      {
        if ( this != &rhs ) {
          delete i;
          i = new int32_t;
          *i = *rhs.i;
        }
        return *this;
      }
    private:
      int32_t * i;
  };
  
  void f ( A const & a1, A & a2 )
  {
    a2 = a1;   
  }
};

class A にはコピー代入演算子の宣言が含まれているため、Polyspace はこのクラスにフラグを設定しません。

チェック情報

グループ: Templates
カテゴリ: 必要

バージョン履歴

R2013b で導入


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.