# V1047. Lifetime of the lambda is greater than lifetime of the local variable captured by reference.

Анализатор обнаружил подозрительный захват переменной в лямбда функции.

Рассмотрим варианты срабатывания диагностики:

Пример 1:

    function lambda;
    {
      auto obj = dummy<int>{ 42 };
      lambda = [&obj]() { .... };
    }

Переменную, которая будет уничтожена при выходе из блока, захватывают по ссылке. Время жизни лямбда функции при этом превышает время жизни объекта. Это приведет к использованию ссылки на уничтоженный объект при вызове лямбда функции.

Вероятно, объект нужно захватить по значению:

    function lambda;
    {
      auto obj = dummy<int>{ 42 };
      lambda = [obj]() { .... };
    }

Пример 2:

    function lambda;
    {
      auto obj1 = dummy<int>{ 42 };
      auto obj2 = dummy<int>{ 42 };
      lambda = [&]() { .... };
    }

В этом случае диагностика определит, что обе переменные захвачены по ссылке и выдаст предупреждение на каждую из них.

Также возможно, что функция возвращает лямбду, захватившую локальную переменную по ссылке.

Пример 3:

    auto obj = dummy<int>{ 42 };
    return [&obj]() { .... };

В этом случае вызывающий код получит из функции лямбду, вызов которой приведет к использованию невалидной ссылки.

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

CWE-672 CERT-EXP61-CPP