メインコンテンツ

CERT C++: EXP59-CPP

有効な型およびメンバーに対して offsetof() を使用する

説明

ルール定義

有効な型およびメンバーに対して offsetof() を使用します。1

Polyspace 実装

ルール チェッカーは、"C++ の offsetof の誤った使用" をチェックします。

すべて展開する

問題

この欠陥は、動作が定義されていない offsetof マクロに引数が渡された場合に発生します。

offsetof マクロ:

offsetof(classType, aMember)
これは、classType 型のオブジェクトの先頭からのデータ メンバー aMember のオフセットをバイト単位で返します。offsetof で使用する場合、classTypeaMember には一定の制限があります。

  • classType は標準レイアウト クラスでなければならない。

    たとえば、メンバー関数 virtual を含んでいてはなりません。標準レイアウト クラスの要件の詳細は、C++ named requirements: StandardLayoutType を参照してください。

  • aMember は静的であってはならない。

  • aMember はメンバー関数であってはならない。

チェッカーは、引数がこれらの 1 つ以上の制限に違反している場合、offsetof マクロの使用にフラグを設定します。

リスク

offsetof マクロの引数の制限に違反すると未定義の動作につながります。

修正方法

offsetof マクロは、標準レイアウト クラスの非静的データ メンバーに対してのみ使用します。

結果の詳細に、offsetof マクロのどの制限に違反しているかが示されます。その違反を修正します。

例 – offsetof マクロと非標準レイアウト クラスの併用
#include <cstddef>

class myClass {
     int privateData;
  public:
     int publicData;
};

void func() {
  size_t off = offsetof(myClass, publicData); //Noncompliant
  // ...
}

この例では、クラス myClass にはアクセス制御が異なる 2 つのデータ メンバーがあり、一方はプライベートで他方はパブリックです。そのため、このクラスは標準レイアウト クラスの要件を満たさず、offsetof マクロと共に使用できません。

修正 — すべてのデータ メンバーで同一のアクセス制御を使用

アプリケーションにおいて offsetof の使用が重要な場合、最初の引数が標準レイアウトのクラスであることを確認します。たとえば、パブリック データ メンバーの必要性を回避できるか確認します。


#include <cstddef>
  
class myClass {
     int member1;
     int member2;
  public:
     int getMember2(void) { return member2;}
     friend void func(void);
};
  
void func() {
  size_t off = offsetof(myClass, member2);
  // ...
}

チェック情報

グループ: 02.式 (EXP)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.