Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Okres istnienia przechwyconej zmiennej "var" może zakończyć się do czasu wznowienia kohroutyny.
Uwagi
Ostrzeżenie C26810 jest wyzwalane, gdy zmienna może być używana po jego okresie istnienia zakończonym w wznowionej kohroutynie.
Nazwa analizy kodu: COROUTINES_USE_AFTER_FREE_CAPTURE
Przykład
Poniższy kod generuje kod 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();
}
Aby naprawić to ostrzeżenie, rozważ użycie argumentów by-value zamiast przechwytywania:
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);
}
Alternatywnie, jeśli coroutine ma zagwarantować krótsze niż obiekt lambda, użyj polecenia gsl::suppress , aby pominąć ostrzeżenie i udokumentować kontrakty okresu istnienia w komentarzu.