Bagikan melalui


Peringatan C26810

Masa pakai variabel 'var' yang ditangkap mungkin berakhir pada saat koroutin dilanjutkan.

Keterangan

Peringatan C26810 dipicu ketika variabel dapat digunakan setelah masa pakainya berakhir dengan coroutine yang dilanjutkan.

Nama analisis kode: COROUTINES_USE_AFTER_FREE_CAPTURE

Contoh

Kode berikut menghasilkan 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();
}

Untuk memperbaiki peringatan ini, pertimbangkan untuk menggunakan argumen berdasarkan nilai alih-alih menangkap:

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);
}

Atau, jika coroutine dijamin hidup lebih pendek dari objek lambda, gunakan gsl::suppress untuk menekan peringatan dan mendokumentasikan kontrak seumur hidup dalam komentar.

Lihat juga

C26811