Share via


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

참고 항목

참조

C Logical Operators