Partager via


Avertissement C6101

Retour de la mémoire non initialisée « parameter-name ».

Un chemin d’accès réussi via la fonction ne définit pas le _Out_ paramètre annoté.

Notes

L’objectif de cet avertissement est d’éviter l’utilisation de valeurs non initialisées par les appelants de la fonction. L’analyseur part du principe que les appelants n’initialisent aucun paramètre annoté _Out_ avant l’appel de fonction et case activée que la fonction les initialise. L’analyseur n’émet pas cet avertissement si la fonction retourne une valeur qui indique qu’elle a eu une erreur ou n’a pas réussi. Pour résoudre ce problème, veillez à initialiser le _Out_ paramètre sous tous les chemins de retour réussis. Le message d’erreur contient les numéros de ligne d’un exemple de chemin d’accès qui n’initialise pas le paramètre.

Si le comportement d’initialisation est par conception, les annotations SAL incorrectes ou manquantes sont probablement à l’origine de l’avertissement. Vous pouvez généralement résoudre ces cas de l’une des deux manières suivantes : soit passer _Out_ à une annotation plus appropriée, soit utiliser l’annotation _Success_() pour définir les états de réussite/erreur de la fonction. Il est important que les outils d’analyse statique aient des annotations correctes sur la fonction lors de l’analyse des sites d’appel de la fonction.

Correction par les modifications apportées aux annotations de paramètre

Si le paramètre doit déjà être dans un état initialisé et que la fonction la modifie de manière conditionnelle, l’annotation _Inout_ peut être plus appropriée. Si aucune autre annotation de haut niveau ne correspond au comportement prévu, vous pouvez utiliser des annotations de bas niveau telles que _Pre_null_, _Pre_satisfies_()et _Post_satisfies_() qui fournissent une flexibilité et un contrôle supplémentaires sur l’état attendu du paramètre. Pour plus d’informations sur les annotations de paramètres, consultez Annoter les paramètres de fonction et les valeurs de retour.

Correction en définissant des chemins de retour réussis

L’analyseur émet uniquement cet avertissement lorsque le code n’initialise pas de _Out_ paramètre dans les chemins de réussite de la fonction. S’il n’existe aucune _Success_ annotation et aucune annotation de type de retour de fonction, elle considère tous les chemins de retour réussis. Pour plus d’informations sur _Success_ les annotations similaires, consultez annotations réussite/échec.

Nom de l’analyse du code : RETURN_UNINIT_VAR

Exemple

Le code suivant génère cet avertissement. Étant donné que la fonction retourne void, l’analyseur considère tous les chemins réussis. Dans ce cas, le correctif correct serait probablement d’ajuster la logique de l’instruction, mais dans le if code réel, il n’est généralement pas aussi simple et la solution dépend du comportement prévu de la fonction.

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

Pour rendre la solution plus intéressante, nous partons du principe qu’elle n’est pas valide pour initialiser output quand input c’est 0. Une approche consiste à modifier la valeur de retour de la fonction en un autre type, par boolexemple . Ensuite, ajoutez une _Success_ annotation pour définir les chemins de retour réussis.

_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 ce modèle est courant dans votre codebase, vous pouvez ajouter l’annotation au type de retour. Les codes d’erreur tels que HRESULT du Kit de développement logiciel (SDK) Windows vous donnent le comportement de l’annotation _Success_ sans avoir à l’ajouter à chaque fonction. Si vous utilisez déjà un type annoté comme type de retour et que vous souhaitez remplacer le comportement, ajoutez l’annotation à la fonction, comme indiqué dans l’exemple précédent.

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

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

Voir aussi

Ensembles de règles pour le code C++
Utilisation d’annotations SAL pour réduire les défauts du code C/C++