Aracılığıyla paylaş


Uyarı C26816

İşaretçi, yığında ayrılan belleğe işaret eder (ES.65)

Açıklamalar

İşaretçi, yığında ayrılan bir değişkeni gösterir. Değişken kapsamın dışına çıktığında temizlenir ve bu da işaretçinin geçersiz olmasını neden olur.

Bu denetim C++ Standart Şablon Kitaplığı'ndan (STL) görünümleri ve sahipleri tanır. Kullanıcı tarafından yazılan türler hakkında bu denetimi öğretmek için ek açıklamayı [[msvc::lifetimebound]] kullanın. Destek [[msvc::lifetimebound]] MSVC 17.7 sürümünde yenidir.

Kod analizi adı: LIFETIME_LOCAL_USE_AFTER_FREE_STACK

Örnekler

// 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
}

Düzeltme, kullanılan değerin ömrünü uzatmaktır. Bu örnekte, std::dizesini döndürerek uyarıyı ele alıyoruz. Ayrıca, veriler yığına kopyalanarak veya işlev parametre listesine bir "out" değişkeni eklenerek de ele alınabilir.

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

Ayrıca bkz.

C26815
ES.65: Geçersiz işaretçi başvurusu kaldırma