Bagikan melalui


Peringatan C26816

Pointer menunjuk ke memori yang dialokasikan pada tumpukan (ES.65)

Keterangan

Pointer menunjuk ke variabel yang dialokasikan pada tumpukan. Ketika variabel keluar dari cakupan, variabel dibersihkan, yang menyebabkan penunjuk tidak valid.

Pemeriksaan ini mengenali tampilan dan pemilik dari Pustaka Templat Standar (STL) C++. Untuk mengajarkan pemeriksaan ini tentang jenis yang ditulis pengguna, gunakan [[msvc::lifetimebound]] anotasi. [[msvc::lifetimebound]] Dukungan ini baru dalam MSVC 17.7.

Nama analisis kode: LIFETIME_LOCAL_USE_AFTER_FREE_STACK

Contoh

// In this example, std::string is being used internally because the implementer felt it was easier to
// perform the non-trivial initialization of the value but the function returns a C-style string.
const char *danglingRawPtrFromLocal() {
  std::string s;
  
  // interesting string initialization here
  
  return s.c_str(); // Oops, The pointer points to memory that will be cleaned up upon return. Warning C26816.
}

struct Y { int& get() [[msvc::lifetimebound]]; };
int& f() {
    Y y;
    return y.get(); // Warning C26826
}

Perbaikannya adalah memperpanjang masa pakai nilai yang digunakan. Dalam contoh ini, kami mengatasi peringatan dengan mengembalikan std::string. Ini juga dapat diatasi dengan menyalin data ke timbunan atau menambahkan variabel "keluar" ke daftar parameter fungsi.

std::string danglingRawPtrFromLocal() {
  std::string s;
  
  // interesting string initialization here
  
  return s;
}

struct Y { int& get() [[msvc::lifetimebound]]; };
int f() {
    Y y;
    return y.get();
}

Lihat juga

C26815
ES.65: Jangan dereferensi penunjuk yang tidak valid