CERT C++: OOP53-CPP

Напишите инициализаторы члена конструктора в каноническом порядке

Описание

Управляйте определением

Напишите инициализаторы члена конструктора в каноническом order.[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 конструктора и затем aVar инициализируется bVar:

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]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ-МЕЛЛОН И/ИЛИ ЕГО ИНСТИТУТА ПРОГРАММНОЙ ИНЖЕНЕРИИ СОДЕРЖАЛ, ЗДЕСЬ ПРЕДОСТАВЛЯЕТСЯ НА ОСНОВЕ "ASIS". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.