Avertissement C6031

Valeur de retour ignorée : 'called-function' pouvait retourner une valeur inattendue

Notes

L’avertissement C6031 indique que l’appelant ne vérifie pas la valeur de retour d’une fonction en cas d’échec. Selon la fonction appelée, ce dysfonctionnement peut entraîner un comportement anormal du programme apparemment aléatoire. Cela comprend les plantages et les altérations de données dans des conditions d’erreur ou des situations à faible ressource.

En général, il ne vaut mieux pas supposer que les appels aux fonctions nécessitant un disque, un réseau, une mémoire ou d’autres ressources vont réussir. L’appelant doit toujours vérifier la valeur de retour et gérer correctement les cas d’erreur. Envisagez également d’utiliser l’annotation _Must_inspect_result_, qui vérifie que la valeur est examinée de manière utile.

Cet avertissement s’applique à la fois au code C et C++.

Nom de l’analyse du code : RETVAL_IGNORED_FUNC_COULD_FAIL

Exemple

Le code suivant génère l’avertissement C6031 :

#include <stdio.h>
int main()
{
    fopen("test.c", "r"); // C4996, C6031 return value ignored
    // code ...
}

Pour corriger cet avertissement, vérifiez la valeur de retour de la fonction, comme illustré dans le code suivant :

#include <stdio.h>
int main()
{
    FILE* stream;
    if ((stream = fopen("test.c", "r")) == NULL)
    {
        return;
    }
    // code ...
}

Le code suivant utilise la fonction plus sûre fopen_s pour corriger cet avertissement :

#include <stdio.h>
int main()
{
    FILE* stream;
    errno_t err;

    if ((err = fopen_s(&stream, "test.c", "r")) != 0)
    {
        // code ...
    }
}

Cet avertissement est également généré si l’appelant ignore la valeur de retour d’une fonction annotée avec la propriété _Check_return_, comme indiqué dans le code suivant.

#include <sal.h>
_Check_return_ bool func()
{
    return true;
}

int main()
{
    func();
}

Pour corriger l’avertissement précédent, vérifiez la valeur de retour, comme illustré dans le code suivant :

#include <sal.h>
_Check_return_ bool func()
{
    return true;
}

int main()
{
    if (func())
    {
        // code ...
    }
}

Dans les cas où il est nécessaire d’ignorer la valeur de retour d’une fonction, affectez la valeur retournée à std::ignore. L’affectation à std::ignore indique clairement l’intention du développeur et contribue à la future maintenance du code.

#include <tuple>
#include <ctime>
#include <cstdlib>
#include <stdio.h>

int main()
{
    std::srand(static_cast<unsigned int>(std::time(nullptr))); // set initial seed value to system clock
    std::ignore = std::rand(); // Discard the first result as the few random results are always small.
    // ... 
}

Voir aussi

fopen_s, _wfopen_s
Utilisation d’annotations SAL pour réduire les défauts du code