Avertissement C6290

Opération au niveau du bit sur le résultat logique : ! a une priorité supérieure à &. Utiliser &&& ou ( !( x &y)) à la place

Cet avertissement indique une confusion possible dans l’utilisation d’un opérateur ou d’une priorité d’opérateur.

Notes

L’opérateur ! génère un résultat booléen et a une priorité plus élevée que le &. L’opérateur bitwise-and-(&) prend deux arguments arithmétiques. Par conséquent, l’une des erreurs suivantes a été détectée :

  • L’expression est mal entre parenthèses :

    Étant donné que le résultat est ! booléen (zéro ou un), une tentative de test que deux variables ont des bits en commun finira seulement par tester que le bit le plus bas est présent dans le côté droit : ((!8) & 1) == 0.

  • L’opérateur ! est incorrect et doit être à ~ la place :

    L’opérateur ! a un résultat booléen, tandis que l’opérateur ~ a un résultat arithmétique. Ces opérateurs ne sont jamais interchangeables, même en cas d’exploitation sur une valeur booléenne (zéro ou un) : ((!0x01) & 0x10) == 0x0alors .((~0x01) & 0x10) == 0x10

  • L’opérateur & binaire est incorrect et doit être à la place &&:

    Bien qu’il & puisse parfois être échangé avec &&, il n’est pas équivalent, car il force l’évaluation du côté droit de l’expression. Certains effets secondaires de ce type d’expression peuvent être terminals.

Il est difficile de juger de la gravité de ce problème sans examiner le code. Le code doit être inspecté pour s’assurer que le test prévu se produit.

Nom de l’analyse du code : LOGICALNOTBITWISEAND

Exemple

Le code suivant génère cet avertissement :

void f(int x, int y)
{
  if (!x & y)
  {
    // code ..
  }
}

Pour corriger cet avertissement, utilisez l’exemple de code suivant :

void f(int x, int y)
{
  /* When testing that x has no bits in common with y. */
  if (!(x & y))
  {
    // code
  }

  /* When testing for the complement of x in y. */
  if ((~x) & y)
  {
    // code ...
  }
}
#include <windows.h>
void fC(int x, BOOL y )
 {
  /* When y is a Boolean or Boolean result. */
  if ((!x) && y)
  {
    // code ...
  }
}

Avertissement C6317 est signalé si l’opérateur ! se trouve sur le côté droit de l’opérateur & .

Voir aussi