>
>
>
V1099. Using the function of uninitiali…


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.

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