exponenta event banner

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 а затем 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. Объектно-ориентированное программирование (ООП)
Представлен в R2020a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.