# V1041. Class member is initialized with dangling reference.

Диагностика выявляет случаи инициализации членов класса "плохим" указателем или ссылкой.

Пример:

    class Foo {
      int *x;
      int &y;
      Foo(int a, int b);
    };

    Foo::Foo(int a, int b) :
      x(&a),  // <=
      y(b)    // <=
    {};

Переменная 'x' является указателем, при инициализации ей присваивается адрес переменной 'a'. Переменная 'a' - аргумент и является локальной для конструктора, поэтому область ее видимости короче, чем у 'x'. После выхода из конструктора 'x' будет иметь неверный указатель.

То же самое верно и для ссылки 'y'.

Правильный вариант будет выглядеть таким образом:

    class Foo {
      int *x;
      int &y;
      Foo(int *a, int &b) :
        x(a),
        y(b)
      {}
    };

    Foo::Foo(int *a, int &b) :
      x(a),
      y(b),
      {}
    };

Теперь конструктору передаются адрес и ссылка напрямую, их область видимости все так же ограничена областью видимости конструктора, но область видимости их значений - нет.

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

CWE-825 CERT-EXP54-CPP