Partager via


Avertissement du compilateur (niveaux 1 et 4) C4700

variable locale non initialisée 'name' utilisée

Notes

Le nom de la variable locale a été utilisé, c’est-à-dire lu à partir de, avant d’avoir affecté une valeur. En C et C++, les variables locales ne sont pas initialisées par défaut. Les variables non initialisées peuvent contenir n’importe quelle valeur et leur utilisation entraîne un comportement non défini. Avertissement C4700 indique presque toujours un bogue qui peut provoquer des résultats imprévisibles ou des incidents dans votre programme.

Pour résoudre ce problème, vous pouvez initialiser des variables locales lorsqu’elles sont déclarées ou leur attribuer une valeur avant d’être utilisées. Une fonction peut être utilisée pour initialiser une variable passée en tant que paramètre de référence ou lorsque son adresse est passée en tant que paramètre de pointeur.

L’option /sdl du compilateur (Activer des vérifications de sécurité supplémentaires) élève cet avertissement à une erreur.

Exemple

Cet exemple génère l’erreur C4700 lorsque les variables t, uet v sont utilisées avant qu’elles ne soient initialisées, et affiche le type de valeur de garbage qui peut se produire. Les variables x, yet z ne provoquent pas l’avertissement, car elles sont initialisées avant l’utilisation :

// c4700.cpp
// compile by using: cl /EHsc /W4 c4700.cpp
#include <iostream>

// function takes an int reference to initialize
void initialize(int& i)
{
    i = 21;
}

int main()
{
    int s, t, u, v;   // Danger, uninitialized variables

    s = t + u + v;    // C4700: t, u, v used before initialization
    std::cout << "Value in s: " << s << std::endl;

    int w, x;         // Danger, uninitialized variables
    initialize(x);    // fix: call function to init x before use
    int y{10};        // fix: initialize y, z when declared
    int z{11};        // This C++11 syntax is recommended over int z = 11;

    w = x + y + z;    // Okay, all values initialized before use
    std::cout << "Value in w: " << w << std::endl;
}

Lorsque ce code est exécuté, t, uet v qu’il n’est pas initialisé et que la sortie est s imprévisible :

Value in s: 37816963
Value in w: 42