C6237
advertencia C6237: (<cero> && <expresión>) es siempre cero.<expresión> nunca se evalúa y puede tener efectos secundarios
Esta advertencia indica que un valor constante de cero se ha detectado en el lado izquierdo de una operación AND lógica que tiene lugar en un contexto de prueba.La expresión resultante siempre se evalúa como false.Por consiguiente, no se evalúa el lado derecho de la operación de AND lógica.Esto se conoce como "evaluación cortocircuitada".
Debe examinar con atención el lado derecho de la expresión para asegurarse de que la evaluación cortocircuitada no afecte a ningún efecto secundario, como la asignación, la llamada a funciones, y las operaciones de incremento y decremento necesarias para una funcionalidad correcta.
La expresión (0 && n) no genera ningún efecto secundario y normalmente se utiliza para elegir selectivamente las rutas de acceso del código.
Ejemplo
El código siguiente muestra distintos ejemplos de código que generan esta advertencia:
#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);
}
}
Para corregir esta advertencia, utilice el código siguiente:
#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");
}
}