メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C++:2023 Rule 16.5.2

The address-of operator shall not be overloaded

R2024b 以降

説明

ルール定義

The address-of operator shall not be overloaded. 1

根拠

C++11 以前の C++ バージョンを使用している場合、クラス内でアドレス演算子 (単項の &) をオーバーロードすると、未定義の動作が発生する可能性があります。C++14 以降の C++ バージョンを使用している場合、単項の & 演算子のオーバーロードは未指定の動作です。以下の条件の両方が true の場合に未定義または未指定の動作が発生します。

  • 不完全な型のアドレスを取得する。

  • オーバーロードされた単項の & 演算子が型に含まれている。

& 演算子をオーバーロードすると、コードが理解しにくくなります。これは、*&aa に評価されない可能性があるからです。

Polyspace 実装

単項の & 演算子をオーバーロードすると、Polyspace® は違反を報告します。

トラブルシューティング

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

すべて展開する

この例では、myclass クラスでアドレス演算子がオーバーロードされています。ソース ファイル file1.cpp では、myclass.h がインクルードされていないため、myclass は不完全な型になります。組み込みの単項の & 演算子を使用して myclass のオブジェクト a のアドレスを取得すると、C++ のバージョンに応じて未定義の動作または未指定の動作が発生します。Polyspace は、単項の & 演算子のオーバーロードに対して違反を報告します。予期しないエラーを回避するには、単項の & 演算子をオーバーロードしないでください。

//myclass.h
class myclass{
public:
myclass * operator&();  //Noncompliant
};
//file1.cpp
class myclass; //Incomplete type

void foo(myclass& a){
&a; // undefined or unspecified behavior;
}
//file2.cpp
#include"myclass.h"
void foo2(myclass& a){
&a; //Uses user-defined operator &
}
 

チェック情報

グループ: オーバーロード
カテゴリ: Required

バージョン履歴

R2024b で導入


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.