Aviso C26816

O ponteiro aponta para a memória alocada na pilha (ES.65)

Comentários

O ponteiro aponta para uma variável alocada na pilha. Quando a variável sai do escopo, ela é limpa, o que faz com que o ponteiro seja inválido.

Essa verificação reconhece exibições e proprietários da STL (Biblioteca de Modelos Padrão) do C++. Para ensinar essa verificação sobre tipos criados pelo usuário, use a [[msvc::lifetimebound]] anotação. O [[msvc::lifetimebound]] suporte é novo no MSVC 17.7.

Nome da análise de código: LIFETIME_LOCAL_USE_AFTER_FREE_STACK

Exemplos

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

A correção é estender a vida útil do valor usado. Neste exemplo, abordamos o aviso retornando a cadeia de caracteres std::string. Ele também pode ser abordado copiando os dados para o heap ou adicionando uma variável "out" à lista de parâmetros de função.

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

Confira também

C26815
ES.65: não desreferenciar um ponteiro inválido