2016-02-15 4 views
1

(Ma question est la plupart du temps la même chose que this one, mais mes besoins sont différents, je dois donc une autre solution.)Comment supprimer « le nombre de décalage à gauche> = largeur de type » avertissement en g ++

Je tentais d'utiliser le développement piloté par les tests, et je écris une série de tests pour valider le comportement de mon BIT(n) macro:

#define BIT(n) (((uint64_t)1) << (n)) 

Depuis mon test pour le ci-dessus inclut les deux passe-attendu et prévu en cas d'échec des composants, je fais intentionnellement mauvaises choses telles que

MY_TEST_ASSERT(0 == (value64 = BIT(65))); 

qui, s'il y avait un problème avec ma mise en œuvre si BIT(n), serait quelque chose de sortie utile comme

ESSAI ECHEC: '0 == (value64 = BIT (65))' essais (fichier »/ 002 .bit-hackery.cpp », ligne 12))

Tout fonctionne comme prévu, mais je reçois un avertissement gênant lors de la compilation:

../../inc/bit-hackery. hpp: 15: 32: avertissement: nombre de quarts de gauche> = largeur o f de type [activé par défaut]

(Il est en fait gênant pour deux raisons: (1) Je veux supprimé pour ce code de test, car je teste cette situation sur le but, et (2) en temps réel (non-test), je préférerais qu'il soit traité comme une erreur. Mais, cette question concerne l'ancien)

J'ai essayé supprimer avec une directive #pragma, mais je ne peux pas sembler trouver un qui fonctionne.

#pragma GCC diagnostic push 
//#pragma GCC diagnostic ignored "-Wcomparison-fixed" 
//#pragma GCC diagnostic ignored "-Wtype-limits" 
//#pragma GCC diagnostic ignored "-Wextra" 
//#pragma GCC diagnostic ignored "-Wall" 
    MY_TEST_ASSERT(0 != (value64 = BIT(65))); 
#pragma GCC diagnostic pop 

Est-ce que quelqu'un sait comment supprimer cet avertissement particulier?

Ma version du compilateur est g++ (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4

+1

Il convient de souligner que le décalage de la largeur de l'opérande est * undefined behavior *. Ce n'est pas la mise en œuvre définie. Ce code teste le * compilateur *, rien d'autre. Il invoque un comportement indéfini et fait des suppositions sur ce que fait le compilateur. Je ne pense pas qu'il soit raisonnable que les tests unitaires contiennent du code C++ invalide. – Arvid

Répondre

1

Malheureusement g ++ v4.8.x n'a pas un drapeau pour désactiver cet avertissement particulier.

Vous pouvez instruit GCC/G ++ pour indiquer quelle commande option de ligne commande directement chaque diagnostic émis (si une telle option est connue du système de diagnostic) via le drapeau -fdiagnostics-show-option.

Dans le cas spécifique, aucune option -W n'est indiquée.

Pour les versions plus récentes de G ++/CLANG ++, vous avez l'indicateur -Wshift-count-overflow.

Je ne pense pas qu'il existe un moyen de désactiver tous les avertissements g ++ sur une ligne de code (par exemple How to disable all warnings in g++ on a few lines of code).

Le drapeau -w désactive tous les avertissements sur le fichier entier mais il est excessif.


PS la version fonction en ligne de BIT ne déclenche pas l'avertissement:

std::uint64_t BIT(std::uint64_t n) { return UINT64_C(1) << n; } 
+0

Merci, et j'apprécie l'astuce sur l'inline pour éviter cela. –

+0

... bien que, au moins avec ce compilateur, la version inline donne des résultats incorrects pour BIT (65) lors de la compilation avec -O0 (pour les versions debug) au lieu de -O2 ... alors que la version macro est toujours correcte. –

1

Une façon d'éviter un avertissement de compilation est d'abord attribuer votre numéro 65 à une variable et ensuite passer la variable à la macro à la place. Cela cache le problème du compilateur, ce qui en fait un problème d'exécution, ce que vous voulez. En fait, vous devriez probablement le faire pour tous vos cas de test parce que les compilateurs peuvent choisir de simplifier le code résultant pour les macros et les fonctions inline lorsque les constantes sont passées.