Bagikan melalui


Peringatan C26815

Pointer menjuntai karena menunjuk pada instans sementara yang dihancurkan. (ES.65)

Keterangan

Penunjuk atau tampilan yang dibuat mengacu pada objek sementara yang tidak disebutkan namanya yang dihancurkan di akhir pernyataan. Penunjuk atau tampilan akan menjuntai.

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_TEMP

Contoh

Pertimbangkan kode berikut yang dikompilasi dalam versi C++ sebelum C++23:

std::optional<std::vector<int>> getTempOptVec();

void loop() {
    // Oops, the std::optional value returned by getTempOptVec gets deleted
    // because there is no reference to it.
    for (auto i : *getTempOptVec()) // warning C26815
    {
        // do something interesting
    }
}

void views()
{
    // Oops, the 's' suffix turns the string literal into a temporary std::string.
    std::string_view value("This is a std::string"s); // warning C26815
}

struct Y { int& get() [[msvc::lifetimebound]]; };
void f() {
    int& r = Y{}.get(); // warning C26815
}

Peringatan ini dapat diperbaiki dengan memperpanjang masa pakai objek sementara.

std::optional<std::vector<int>> getTempOptVec();

void loop() {
    // Fixed by extending the lifetime of the std::optional value by giving it a name.
    auto temp = getTempOptVec();
    for (auto i : *temp)
    {
        // do something interesting
    }
}

void views()
{
    // Fixed by changing to a constant string literal.
    std::string_view value("This is a string literal");
}

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

Lihat juga

C26816
ES.65: Jangan dereferensi penunjuk yang tidak valid