Advertencia C26810
La duración de la variable capturada "var" puede terminar por el momento en que se reanuda la corrutina.
Comentarios
Advertencia C26810 se desencadena cuando se puede usar una variable después de que finalice su vigencia en una corrutina reanudada.
Nombre de análisis de código: COROUTINES_USE_AFTER_FREE_CAPTURE
Ejemplo
El código siguiente genera la advertencia C26810.
#include <experimental/generator>
#include <future>
using namespace std::experimental;
coroutine_handle<> g_suspended_coro;
// Simple awaiter to allows to resume a suspended coroutine
struct ManualControl
{
coroutine_handle<>& save_here;
bool await_ready() { return false; }
void await_suspend(coroutine_handle<> h) { save_here = h; }
void await_resume() {}
};
void bad_lambda_example1()
{
int x = 5;
auto bad = [x]() -> std::future<void> {
co_await ManualControl{g_suspended_coro}; // @expected(26810), Lifetime of capture 'x' might end by the time this coroutine is resumed.
printf("%d\n", x);
};
bad();
}
Para corregir esta advertencia, considere la posibilidad de usar argumentos por valor en lugar de capturas:
void bad_lambda_example1()
{
int x = 5;
auto good = [](int x) -> std::future<void> {
co_await ManualControl{g_suspended_coro};
printf("%d\n", x);
};
good(x);
}
Como alternativa, si se garantiza que la duración de la corrutina es más corta que el objeto lambda, use gsl::suppress
para suprimir la advertencia y documente los contratos de duración en un comentario.