Partager via


C6237

Mise à jour : novembre 2007

C6237

Avertissement C6237 : (<zéro> && <expression>) est toujours zéro. <expression> n'est jamais évalué et peut avoir des effets secondaires

Cet avertissement indique qu'une valeur de constante de zéro a été détectée sur le côté gauche d'une opération logique AND qui se produit dans un contexte de test. L'expression obtenue a toujours la valeur false. Par conséquent, le côté droit de l'opération logique AND n'est pas évalué. C'est ce qu'on appelle une « évaluation de court-circuit ».

Vous devez examiner attentivement le côté droit de l'expression pour vérifier que les effets secondaires, par exemple l'assignation, l'appel de fonction et les opérations d'incrémentation et de décrémentation nécessaires au bon fonctionnement, ne sont pas affectés par l'évaluation de court-circuit.

L'expression (0 && n) ne produit pas d'effets secondaires et est généralement utilisée pour choisir de manière sélective des chemins d'accès de code.

Exemple

Le code suivant présente divers exemples de code qui génèrent cet avertissement :

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

Pour corriger cet avertissement, utilisez le code suivant :

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

Voir aussi

Référence

C Logical Operators

Avertissement du compilateur (niveau 4) C4127