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.
Name der Codeanalyse: 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.