Warnung C26810
Die Lebensdauer der erfassten Variablen "var" kann enden, wenn der Coroutin fortgesetzt wird.
Hinweise
Warnung C26810 wird ausgelöst, wenn eine Variable nach Beendigung ihrer Lebensdauer in einem fortgesetzten Coroutine verwendet werden kann.
Name der Codeanalyse: COROUTINES_USE_AFTER_FREE_CAPTURE
Beispiel
Der folgende Code generiert 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();
}
Um diese Warnung zu beheben, sollten Sie anstelle von Erfassungen die Verwendung von Wertargumenten in Betracht ziehen:
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);
}
Wenn die Coroutine garantiert kürzer als das Lambda-Objekt ist, sollten Sie gsl::suppress
die Warnung unterdrücken und die Lebensdauerverträge in einem Kommentar dokumentieren.