Ostrzeżenie C6001

Używanie niezainicjowanej pamięci "zmiennej".

Uwagi

To ostrzeżenie jest zgłaszane, gdy jest używana niezainicjowana zmienna lokalna, zanim zostanie przypisana wartość. To użycie może prowadzić do nieprzewidywalnych wyników. Przed użyciem należy zawsze inicjować zmienne.

Nazwa analizy kodu: USING_UNINIT_VAR

Przykład

Poniższy kod generuje to ostrzeżenie, ponieważ zmienna i jest inicjowana tylko wtedy, gdy b ma wartość true:

int f( bool b )
{
   int i;
   if ( b )
   {
      i = 0;
   }
   return i; // i is uninitialized if b is false
}

Aby poprawić to ostrzeżenie, zainicjuj zmienną, jak pokazano w poniższym kodzie:

int f( bool b )
{
   int i = -1;

   if ( b )
   {
      i = 0;
   }
   return i;
}

Algorytmy heurystyczne

W poniższym przykładzie pokazano, że przekazanie zmiennej do funkcji przez odwołanie powoduje, że kompilator zakłada, że został zainicjowany:

void init( int& i );

int f( bool b )
{
   int i;

   init(i);

   if ( b )
   {
      i = 0;
   }
   return i; // i is assumed to be initialized because it's passed by reference to init()
}

Obsługuje to wzorzec przekazywania wskaźnika do zmiennej do funkcji inicjowania.

Ta heurystyka może prowadzić do fałszywych ujemnych wyników, ponieważ wiele funkcji oczekuje wskaźników wskazujących zainicjowane dane. Użyj adnotacji SAL, takich jak _In_ i _Out_, aby opisać zachowanie funkcji. W poniższym przykładzie wywoływana jest funkcja, która oczekuje zainicjowania argumentu, więc zostanie wygenerowane ostrzeżenie:

void use( _In_ int& i );

int f( bool b )
{
   int i;

   use(i); // uninitialized variable warning because of the _In_ annotation on use()

   if ( b )
   {
      i = 0;
   }
   return i;
}

Zobacz też

Ostrzeżenie kompilatora (poziom 1 i 4) C4700