Предупреждение C26816
Указатель указывает на память, выделенную в стеке (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();
}