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