Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Указатель указывает на память, выделенную в стеке (ES.65)
Замечания
Указатель указывает на переменную, выделенную в стеке. Когда переменная выходит из области, она очищается, что приводит к недопустимости указателя.
Эта проверка распознает представления и владельцев из стандартной библиотеки шаблонов C++ (STL). Чтобы научить эту проверку типов, созданных пользователем, используйте заметку [[msvc::lifetimebound]] .
Поддержка [[msvc::lifetimebound]] новая в MSVC 17.7.
Имя анализа кода: LIFETIME_LOCAL_USE_AFTER_FREE_STACK
Примеры
// 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
}
Исправление заключается в расширении срока действия используемого значения. В этом примере мы устраняем предупреждение, возвращая std::string. Его также можно устранить, копируя данные в кучу или добавляя переменную out в список параметров функции.
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();
}