.. title:: clang-tidy - cppcoreguidelines-init-variables

cppcoreguidelines-init-variables
================================

Checks whether there are local variables that are declared without an initial
value. These may lead to unexpected behavior if there is a code path that reads
the variable before assigning to it.

Only integers, booleans, floats, doubles and pointers are checked. The fix
option initializes all detected values with the value of zero. An exception is
float and double types, which are initialized to NaN.

As an example a function that looks like this:

.. code-block:: c++

   void function() {
     int x;
     char *txt;
     double d;

     // Rest of the function.
   }

Would be rewritten to look like this:

.. code-block:: c++

   #include <math.h>

   void function() {
     int x = 0;
     char *txt = nullptr;
     double d = NAN;

     // Rest of the function.
   }

It warns for the uninitialized enum case, but without a FixIt:

.. code-block:: c++

   enum A {A1, A2, A3};
   enum A_c : char { A_c1, A_c2, A_c3 };
   enum class B { B1, B2, B3 };
   enum class B_i : int { B_i1, B_i2, B_i3 };
   void function() {
     A a;     // Warning: variable 'a' is not initialized
     A_c a_c; // Warning: variable 'a_c' is not initialized
     B b;     // Warning: variable 'b' is not initialized
     B_i b_i; // Warning: variable 'b_i' is not initialized
   }

Options
-------

.. option:: IncludeStyle

   A string specifying which include-style is used, `llvm` or `google`. Default
   is `llvm`.

.. option:: MathHeader

   A string specifying the header to include to get the definition of `NAN`.
   Default is `<math.h>`.
