Comprendre l’avertissement «comparaison de promu ~ non signé avec non signé»

J’ai rencontré un avertissement que je ne comprends pas vraiment. L’avertissement est généré en comparant ce que je considère être un non signé avec un autre non signé.

Voici la source:

#include  #include  #include  #include  int main() { uint8_t *arr = malloc(8); assert(arr); /* fill arr[] with stuff */ if (arr[3] != (uint8_t)(~arr[2])) { // Warning is here /* stuff */ } return EXIT_SUCCESS; } 

Que je construis en utilisant la procédure suivante:

 user@linux:~ $ gcc -o test -Wall -Wextra test.c test.c: In function 'main': test.c:13:16: warning: comparison of promoted ~unsigned with unsigned [-Wsign-compare] 

J’utilise la version 4.7.2 de gcc 20121109 (Red Hat 4.7.2-8)

Comment puis-je corriger la comparaison ci-dessus?

Oui, je pense que c’est un bug. Lire [Bug c / 38341] Comparaison entre un avertissement incorrect de promu ~ non signé avec non signé et aussi Pourquoi, avertissement: comparaison entre expressions entières signées et non signées? . Cela pourrait vous aider.

J’ai eu le même problème et je l’ai corrigé en utilisant une variable intermédiaire:

 uint8_t check = ~arr[2]; if (arr[3] != check)