メインコンテンツ

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

CERT C++: OOP53-CPP

コンストラクター メンバーの初期化子を正規順序で書き込む

説明

ルール定義

コンストラクター メンバーの初期化子を正規順序で書き込みます。1

Polyspace 実装

ルール チェッカーは、"正規順序で初期化されていないメンバー" をチェックします。

すべて展開する

説明

正規順序で初期化されていないメンバーは、クラス コンストラクターの初期化子リストが以下の場合に発生します。

  • クラスのデータ メンバーが宣言順に初期化されない。

    次に例を示します。

    class aClass {
       int var1;
       int var2;
    public: 
       aClass(int val): var2(val), var1(val) {}
    };

  • 基底クラス コンストラクターが基底指定子リストの出現順に呼び出されない。

    次に例を示します。

    
    class aClass: baseClass1, baseClass2 {
       aClass(int val): baseClass2(val), baseClass1(val) {}
    }

リスク

データ メンバーまたは基底クラス コンストラクターが初期化子リストに出現する順序は、実際の初期化順序には反映されません。データ メンバーは宣言順に初期化され、基底クラス コンストラクターは基底指定子リストでの出現順に呼び出されます。

ただし、開発者が、初期化子リストでの順序を実際の初期化順と誤解する場合があります。その結果、初期化間に依存関係が生じ、初期化されていないメモリ領域を読み取ることになる可能性があります。たとえば、この初期化子リストで bVar が最初にコンストラクター引数 x を使用して初期化されてから、aVarbVar を使用して初期化されると指定されているとします。


class aClass {
   int aVar;
   int bVar;
public: 
   aClass(int x): bVar(x), aVar(bVar) {}
};
ところが、初期化は宣言順に行われ、初期化されていない bVar が最初に読み取られます。

修正方法

クラス コンストラクターの初期化子リストで、次の操作を行います。

  • クラス データ メンバーをクラス内の宣言順に指定する。

    次に例を示します。

    
    class aClass {
       int var1;
       int var2;
    public: 
       aClass(int val): var1(val), var2(val) {}
    };

  • 基底コンストラクターを基底指定子リストでの指定順に呼び出す。

    次に例を示します。

    
    class aClass: baseClass1, baseClass2 {
       aClass(int val): baseClass1(val), baseClass2(val) {}
    }

チェック情報

グループ: 09.オブジェクト指向プログラミング (OOP)

バージョン履歴

R2020a で導入


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.