Compartilhar via


C6237

Aviso C6237: (<zero>&& <expressão>) é sempre zero.<expressão>nunca é avaliado e pode causar efeitos colaterais

Este aviso indica que um valor constante de zero foi detectado no lado esquerdo de uma lógica- e a operação ocorre em um contexto de teste.A expressão resultante sempre é avaliado como false.Portanto, o lado direito da lógica- E a operação não será avaliada.Isso é chamado de "avaliação de circuito curto."

Você deve examinar o lado direito da expressão cuidadosamente para Certifique-se de que quaisquer efeitos colaterais, sistema autônomo atribuição, telefonar de função, incrementar e decrementar operações necessárias para a funcionalidade adequada não são afetadas pela avaliação de circuito curto.

A expressão (0 && n) produz sem efeitos colaterais e é normalmente usado para escolher seletivamente os caminhos de código.

Exemplo

O código a seguir mostra vários exemplos de código que geram este aviso:

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

Para corrigir esse aviso, use o seguinte código:

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

Consulte também

Referência

C operadores Logical

Compilador C4127 de aviso (nível 4)