C6237
경고 C6237: (<zero> && <expression>)은(는) 언제나 0입니다.<expression>은(는) 평가되지 않으므로 의도하지 않은 결과가 발생할 수 있습니다.
이 경고는 테스트 컨텍스트에서 수행되는 논리 AND 연산의 왼쪽에 상수 값 0이 있음을 나타냅니다.이 경우 결과 식은 항상 false로 평가됩니다.따라서 논리 AND 연산의 오른쪽이 평가되지 않습니다.이것을 "단락(short-circuit) 계산"이라고 합니다.
식의 오른쪽을 신중하게 검사하여 적절한 기능에 필요한 할당, 함수 호출, 증가 및 감소 연산과 같은 파생 작업이 단락 계산의 영향을 받지 않도록 해야 합니다.
(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");
}
}