# V1099. Using the function of uninitialized derived class while initializing the base class will lead to undefined behavior.

Анализатор обнаружил использование нестатической функции-члена производного класса при инициализации базового класса. Согласно стандарту, такой код приводит к неопределённому поведению.

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

    struct Base
    {
      Base(int);
    };

    struct Derived : public Base
    {
      int FuncFromDerived();
      Derived() : Base(FuncFromDerived()) {}   // <=
    };

Конструктор структуры 'Derived' вызывает конструктор базового класса 'Base' в списке инициализации. При этом, в качестве аргумента конструктора передаётся результат функции 'FuncFromDerived', которая принадлежит производной структуре. При создании объекта типа 'Derived' инициализация будет произведена в следующем порядке:

- Вызов функции 'Derived::FuncFromDerived()';
- Вызов конструктора 'Base';
- Вызов конструктора 'Derived'.

В результате произойдёт вызов функции у структуры, которая не была инициализирована, что нарушает правило стандарта:

> Member functions (including virtual member functions, [class.virtual]) can be called for an object under construction.

> Similarly, an object under construction can be the operand of the typeid operator ([expr.typeid]) or of a dynamic_cast ([expr.dynamic.cast]).

> However, if these operations are performed in a ctor-initializer (or in a function called directly or indirectly from a ctor-initializer) before all the mem-initializers for base classes have completed, the program has undefined behavior.

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

CWE-908 CERT-EXP54-CPP

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