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 bool
exemple . 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++
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour