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.
Codeanalysename: 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.
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Tickets als Feedbackmechanismus für Inhalte auslaufen lassen und es durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unter:Einreichen und Feedback anzeigen für