Udostępnij za pośrednictwem


Ostrzeżenie C26810

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.

Zobacz też

C26811