다음을 통해 공유


경고 C6237

('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");
   }
}

참고 항목

C 논리 연산자