C6237
avviso C6237: (<zero> && <espressione>) è sempre zero. <espressione> non viene mai valutata e può avere effetti collaterali
L'avviso indica che un valore di costante zero è stato rilevato a sinistra di un'operazione di AND logico in un contesto di test. Il valore dell'espressione risultante è sempre false, pertanto il lato destro dell'operazione di AND logico non verrà valutato. Questa condizione viene denominata anche "valutazione short circuit".
Esaminare con attenzione il lato destro dell'espressione per accertarsi che qualsiasi effetto collaterale, ad esempio operazioni di assegnazione, chiamata a funzione, incremento e decremento, necessarie per garantire una corretta funzionalità, non sia influenzato dalla valutazione short-circuit.
L'espressione (0 && n) non produce effetti collaterali e viene comunemente utilizzata per scegliere in maniera selettiva percorsi di codice.
Esempio
Nel codice riportato di seguito vengono riportati vari esempi che generano l'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 risolvere il problema, utilizzare 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");
}
}