# V670. Uninitialized class member is used to initialize another member. Remember that members are initialized in the order of their declarations inside a class.

The analyzer has detected a possible error in the class constructor's initialization list. According to the language standard, class members are initialized in the constructor in the same order as they are declared inside the class. In our case, the program contains a constructor where initialization of one class member depends on the other. At the same time, a variable used for initialization is not yet initialized itself.

Here is an example of such a constructor:

    class Foo
    {
      int foo;
      int bar;
      Foo(int i) : bar(i), foo(bar + 1) { }
    };

The 'foo' variable is initialized first! The variable 'bar' is not yet initialized at this moment. To fix the bug, we need to put the declaration of the 'foo' class member before the declaration of the 'bar' class member. This is the fixed code:

    class Foo
    {
      int bar;
      int foo;
      Foo(int i) : bar(i), foo(bar + 1) { }
    };

If the sequence of class fields cannot be changed, you need to change the initialization expressions:

    class Foo
    {
      int foo;
      int bar;
      Foo(int i) : bar(i), foo(i + 1) { }
    };

This diagnostic is classified as:

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

You can look at examples of errors detected by the V670 diagnostic.