Condividi tramite


Avviso C6237

('zero' && 'expression') è sempre zero. 'expression' non viene mai valutato e può avere effetti collaterali

Questo avviso indica che è stato rilevato un valore costante pari a zero sul lato sinistro di un'operazione e logica che si verifica in un contesto di test. L'espressione risultante restituisce sempre false. Di conseguenza, il lato destro dell'operazione LOGICAL-AND non viene valutato. Questa funzionalità del linguaggio è definita "valutazione a corto circuito".

Osservazioni:

È consigliabile esaminare attentamente il lato destro dell'espressione: assicurarsi che eventuali effetti collaterali, ad esempio assegnazione, chiamata di funzione, incremento e decremento necessari per la funzionalità appropriata non siano interessati dalla valutazione del corto circuito.

L'espressione (0 && n) non produce effetti collaterali e viene comunemente usata per scegliere in modo selettivo i percorsi di codice.

Nome dell'analisi del codice: ZEROLOGICALANDLOSINGSIDEEFFECTS

Esempio

Il codice seguente illustra vari esempi di codice che generano questo avviso:

#include <stdio.h>
#define INPUT_TYPE 0

int test();

// side effect: n not incremented
void f1( int n )
{
   if(INPUT_TYPE && n++) //warning: 6237
   {
      puts("code path disabled");
   }
   else
   {
      printf_s("%d - n was not incremented",n);
   }
}

// side effect: test() not called
void f2( )
{
   if(INPUT_TYPE && test()) //warning: 6237
   {
      puts("code path disabled");
   }
   else
   {
      puts("test() was not called");
   }
}

//side effect: assignment and function call did not occur
void f3( int n )
{
   if(INPUT_TYPE && ( n=test() )) //warning: 6237
   {
      puts("code path disabled");
   }
   else
   {
      printf_s("%d -- n unchanged. test() was not called", n);
   }
}

Per correggere questo avviso, usare il codice seguente:

#include <stdio.h>
#define INPUT_TYPE 0
int test();

void f1( int n )
{
   if(INPUT_TYPE)
   {
      if(n++)
      {
         puts("code path disabled");
      }
   }
   else
   {
      puts("n was not incremented");
   }
}

void f2( )
{
   if(INPUT_TYPE)
   {
      if( test() )
      {
         puts("code path disabled");
      }
   }
   else
   {
      puts("test() was not called");
   }
}

void f3( int n )
{
   if(INPUT_TYPE)
   {
      n = test();
      if( n )
      {
         puts("code path disabled");
      }
   }
   else
   {
      puts("test() was not called");
   }
}

Vedi anche

Operatori logici C