Advertencia C6101

Devolver memoria no inicializada "parameter-name".

Una ruta de acceso correcta a través de la función no establece el _Out_ parámetro anotado.

Comentarios

El propósito de esta advertencia es evitar el uso de valores no inicializados por los autores de llamada de la función. El analizador supone que los autores de llamadas no inicializan ningún parámetro anotado con _Out_ antes de la llamada de función y comprueba que la función las inicializa. El analizador no emite esta advertencia si la función devuelve un valor que indica que tuvo un error o no se realizó correctamente. Para corregir este problema, asegúrese de inicializar el _Out_ parámetro en todas las rutas de acceso de devolución correctas. El mensaje de error contiene los números de línea de una ruta de acceso de ejemplo que no inicializa el parámetro.

Si el comportamiento de inicialización es por diseño, las anotaciones SAL incorrectas o que faltan son una causa probable de la advertencia. Normalmente, puede resolver estos casos de una de estas dos maneras: cambiar _Out_ a una anotación más adecuada o usar la _Success_() anotación para ayudar a definir los estados correctos o de error de la función. Es importante que las herramientas de análisis estático tengan anotaciones correctas en la función al analizar los sitios de llamada de la función.

Corrección mediante cambios en las anotaciones de parámetros

Si el parámetro ya debe estar en un estado inicializado y la función lo modifica condicionalmente, la _Inout_ anotación puede ser más adecuada. Si ninguna otra anotación de alto nivel se ajusta al comportamiento previsto, puede usar anotaciones de bajo nivel como _Pre_null_, _Pre_satisfies_()y _Post_satisfies_() que proporcionan flexibilidad adicional y control sobre el estado esperado del parámetro. Para obtener más información sobre las anotaciones de parámetros, consulte Anotación de parámetros de función y valores devueltos.

Corrección mediante la definición de rutas de acceso de devolución correctas

El analizador solo emite esta advertencia cuando el código no inicializa un _Out_ parámetro en las rutas de acceso correctas de la función. Si no hay ninguna _Success_ anotación y ninguna anotación de tipo de valor devuelto de función, considera que todas las rutas de acceso de devolución se han realizado correctamente. Para obtener más información sobre _Success_ las anotaciones similares y las anotaciones similares, vea Anotaciones de éxito o error.

Nombre del análisis de código: RETURN_UNINIT_VAR

Ejemplo

El código siguiente genera esta advertencia. Dado que la función devuelve void, el analizador considera que todas las rutas de acceso se han realizado correctamente. En este caso, la corrección correcta probablemente sería ajustar la lógica de la if instrucción, pero en el código del mundo real, normalmente no es tan sencilla y la solución depende del comportamiento previsto de la función.

#include <sal.h>
void AlwaysInit(_Out_ int* output, int input) // : warning C6101: Returning uninitialized memory '*p'.: Lines: 2, 4, 9, 14, 2
{
  if( input > 0 )
  {
    *output = input;
    return;
  }
  else if( input < 0 )
  {
    *output = 0;
    return;
  }
  return; // Oops, input was 0
}

Para que la solución sea más interesante, se supone que no es válida inicializar output cuando input es 0. Un enfoque consiste en modificar el valor devuelto de la función a un tipo diferente, como bool. A continuación, agregue una _Success_ anotación para definir las rutas de acceso de devolución correctas.

_Success_(return == true)
bool InitNotZero(_Out_ int* output, int input)
{
  if( input > 0 )
  {
    *output = input;
    return true;
  }
  else if( input < 0 )
  {
    *output = 0;
    return true;
  }
  return false;
}

Si este patrón es común en el código base, puede agregar la anotación al tipo de valor devuelto. Los códigos de error, como HRESULT desde Windows SDK, proporcionan el comportamiento de la _Success_ anotación sin necesidad de agregarlo a cada función. Si ya usa un tipo anotado como tipo de valor devuelto y desea invalidar el comportamiento, agregue la anotación a la función, como se muestra en el ejemplo anterior.

using SuccessWhenTrue = _Success_(return == true) bool;

SuccessWhenTrue InitNotZero(_Out_ int* output, int input)
{
  // ...
}

Consulte también

Conjuntos de reglas para código de C++
Uso de anotaciones SAL para reducir defectos de código de C/C++