16e566bc5SRichard.. title:: clang-tidy - cppcoreguidelines-avoid-non-const-global-variables
26e566bc5SRichard
36e566bc5SRichardcppcoreguidelines-avoid-non-const-global-variables
46e566bc5SRichard==================================================
56e566bc5SRichard
60f1f1d45SPiotr ZegarFinds non-const global variables as described in `I.2
70f1f1d45SPiotr Zegar<https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#i2-avoid-non-const-global-variables>`_
80f1f1d45SPiotr Zegarof C++ Core Guidelines.
90f1f1d45SPiotr ZegarAs `R.6 <https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rr-global>`_
100f1f1d45SPiotr Zegarof C++ Core Guidelines is a duplicate of rule `I.2
110f1f1d45SPiotr Zegar<https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#i2-avoid-non-const-global-variables>`_
120f1f1d45SPiotr Zegarit also covers that rule.
136e566bc5SRichard
146e566bc5SRichard.. code-block:: c++
156e566bc5SRichard
166e566bc5SRichard    char a;  // Warns!
176e566bc5SRichard    const char b =  0;
186e566bc5SRichard
196e566bc5SRichard    namespace some_namespace
206e566bc5SRichard    {
216e566bc5SRichard        char c;  // Warns!
226e566bc5SRichard        const char d = 0;
236e566bc5SRichard    }
246e566bc5SRichard
256e566bc5SRichard    char * c_ptr1 = &some_namespace::c;  // Warns!
266e566bc5SRichard    char *const c_const_ptr = &some_namespace::c;  // Warns!
276e566bc5SRichard    char & c_reference = some_namespace::c;  // Warns!
286e566bc5SRichard
296e566bc5SRichard    class Foo  // No Warnings inside Foo, only namespace scope is covered
306e566bc5SRichard    {
316e566bc5SRichard    public:
326e566bc5SRichard        char e = 0;
336e566bc5SRichard        const char f = 0;
346e566bc5SRichard    protected:
356e566bc5SRichard        char g = 0;
366e566bc5SRichard    private:
376e566bc5SRichard        char h = 0;
386e566bc5SRichard    };
396e566bc5SRichard
402928746aSBjörn SvenssonThe variables ``a``, ``c``, ``c_ptr1``, ``c_const_ptr`` and ``c_reference``
412928746aSBjörn Svenssonwill all generate warnings since they are either a non-const globally accessible
422928746aSBjörn Svenssonvariable, a pointer or a reference providing global access to non-const data
432928746aSBjörn Svenssonor both.
44*7c50187bSPascal Jungblut
45*7c50187bSPascal JungblutOptions
46*7c50187bSPascal Jungblut-------
47*7c50187bSPascal Jungblut
48*7c50187bSPascal Jungblut.. option:: AllowInternalLinkage
49*7c50187bSPascal Jungblut
50*7c50187bSPascal Jungblut   When set to `true`, static non-const variables and variables in anonymous
51*7c50187bSPascal Jungblut   namespaces will not generate a warning. The default value is `false`.
52