Avertissement C6237

('zero' && 'expression') est toujours égal à zéro. 'expression' n’est jamais évaluée et peut avoir des effets secondaires

Cet avertissement indique qu’une valeur constante de zéro a été détectée sur le côté gauche d’une opération logique et qui se produit dans un contexte de test. L’expression résultante prend toujours la valeur false. Par conséquent, le côté droit de l’opération logique-AND n’est pas évalué. Cette fonctionnalité de langage est appelée « évaluation en court-circuit ».

Notes

Vous devez examiner attentivement le côté droit de l’expression : assurez-vous que les effets secondaires tels que l’affectation, l’appel de fonction, l’incrémentation et les opérations de décrémentation nécessaires pour les fonctionnalités appropriées ne sont pas affectés par l’évaluation de court-circuit.

L’expression (0 && n) ne produit aucun effet secondaire et est couramment utilisée pour choisir sélectivement des chemins de code.

Nom de l’analyse du code : ZEROLOGICALANDLOSINGSIDEEFFECTS

Exemple

Le code suivant présente différents 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

Opérateurs logiques C