# V1050. Uninitialized class member is used when initializing the base class.

Анализатор обнаружил, что вызов базового конструктора в списке инициализации выполняется с использованием неинициализированных полей дочернего класса.

Рассмотрим пример:

    struct C : public Base
    {
      C(int i) : m_i(i), Base(m_i) {};
      ....
      int m_i;
    };

Согласно стандарту, сперва инициализируются базовые классы в порядке, указанном в объявлении. На момент вызова конструктора 'Base' переменная 'm_i' ещё не инициализирована, поэтому исправить код можно, например, так:

    struct C : public Base
    {
      C(int i) : m_i(i), Base(i) {};
      ....
      int m_i;
    };

Также анализатор может обнаружить использование неинициализированных переменных, находящихся не только внутри класса, но и внутри базовых классов:

    struct Base1
    {
      Base1(int i) : m_base1(i) { };
      virtual ~Base1() = default;
      ....
      int m_base1;
    };

    struct Base2
    {
      Base2(int i) : m_base2(i) { };
      virtual ~Base2() = default;
      ....
      int m_base2;
    };
    struct C : public Base1, public Base2
    {
      C(int i) : m_i(i), Base1(m_base2), Base2(i) {};
      ....
      int m_i;
    };

Если нужно инициализировать один из базовых классов полем другого, то нужно убедиться в том, что они инициализируются в нужном порядке:

    struct C : public Base2, public Base1
    {
      C(int i) : m_i(i), Base1(m_base2), Base2(i) {};
      ....
      int m_i;
    };

Похожие проблемы способна искать диагностика V670. Однако она занимается поиском проблем, связанных с порядком инициализации полей одного класса, когда порядок инициализации переменных зависит от порядка их объявления в классе.

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки использования неинициализированных переменных.

Данная диагностика классифицируется как:

CWE-457 CERT-EXP33-C CERT-EXP53-CPP

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V1050.