# V788. Consider reviewing a captured variable in lambda expression.

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

Рассмотрим несколько вариантов срабатывания диагностики.

Пример 1:

    int x = 0;
    auto f = [x] { };
    ....
    x = 42;
    f();
    ...

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

    int x = 0;
    auto f = [&x] { };
    ....
    x = 42;
    f();
    ...

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

    int x = 0;
    if (condition) x = 42;
    else x = 43;
    auto f = [x] { };

Если же необходимо захватить некую константу, то лучше явно указать в типе переменной 'const' или 'constexpr'.

    constexpr int x = 0;
    auto f = [x] { };

Пример 2:

    int x;
    auto f = [x] { };

Неинициализированная переменная захватывается по значению. Её использование приведёт к Undefined Behavior. Если предполагалось, что вызов функции должен проинициализировать переменную, то её необходимо захватить по ссылке.

    int x;
    auto f = [&x] { x = 42; };

Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки использования неинициализированных переменных.

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

CWE-457 CERT-EXP53-CPP