Warnung C26811
Die Lebensdauer des Speichers, auf den der Parameter "var" verweist, kann enden, wenn die Coroutine fortgesetzt wird.
Hinweise
Warnung C26811 wird ausgelöst, wenn eine Variable nach Beendigung ihrer Lebensdauer in einem fortgesetzten Coroutine verwendet werden kann.
Codeanalysename: COROUTINES_USE_AFTER_FREE_PARAM
Beispiel
Der folgende Code generiert C26811.
#include <experimental/generator>
#include <future>
using namespace std::experimental;
// 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() {}
};
coroutine_handle<> g_suspended_coro;
std::future<void> async_coro(int &a)
{
co_await ManualControl{g_suspended_coro}; // @expected(26811), Lifetime of 'a' might end by the time this coroutine is resumed.
++a;
}
Um diese Warnung zu beheben, sollten Sie das Argument nach Wert verwenden:
std::future<void> async_coro(int a)
{
co_await ManualControl{g_suspended_coro};
++a;
}
Wenn die Lebensdauer a
des Coroutins garantiert ist, die Lebensdauer des Coroutins zu überleben, unterdrücken Sie die Warnung, indem gsl::suppress
Sie die Lebenszeitverträge des Codes dokumentieren.
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für