('zero' && 'expression')은 항상 0입니다. 'expression'은 평가되지 않으며 부작용이 있을 수 있습니다.
설명
이 경고는 테스트 컨텍스트에서 발생하는 논리 및 작업의 왼쪽에서 상수 값 0이 검색되었음을 나타냅니다. 결과 식은 항상 false로 평가됩니다. 따라서 논리 AND 작업의 오른쪽은 평가되지 않습니다. 이 언어 기능을 "단락 평가"라고 합니다.
식의 오른쪽을 주의 깊게 검토해야 합니다. 적절한 기능에 필요한 할당, 함수 호출, 증가 및 감소 작업과 같은 부작용이 단락 평가의 영향을 받지 않는지 확인합니다.
식(0 && n)은 부작용을 일으키지 않으며 일반적으로 코드 경로를 선택적으로 선택하는 데 사용됩니다.
코드 분석 이름: ZEROLOGICALANDLOSINGSIDEEFFECTS
예시
다음 코드에서는 이 경고를 생성하는 다양한 코드 예제를 보여 줍니다.
#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");
}
}