C6237
Предупреждение C6237: (<нуль> && <выражение>) всегда равно нулю. <выражение> никогда не вычисляется и может иметь побочные эффекты
Данное предупреждение указывает, что в левой части операции логического И, используемой в контексте проверки, обнаружено константное значение ноль. Результирующее выражение всегда равно значению "false". Поэтому правая часть операции логического И не вычисляется. Это называется "сокращенным вычислением".
Следует тщательно изучить правую сторону выражения и убедиться, что сокращенное вычисление не повлияет на такие необходимые для правильно работы кода побочные эффекты, как присвоение, вызов функции, операции увеличения и уменьшения.
Выражение (0 && n) не производит побочных эффектов и повсеместно используется для выбора ветвей кода.
Пример
В следующем коде показаны различные примеры создания данного предупреждения:
#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);
}
}
Для устранения этого предупреждения используйте следующий код:
#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");
}
}