g++ comment obtenir un avertissement en ignorant la valeur de retour de la fonction
Peluches produit un avertissement comme:
foo.c XXX Warning 534: Ignoring return value of function bar()
534 ignorer la valeur de retour de la fonction
'symbole' (comparer avec L'emplacement) A fonction qui renvoie une valeur est appelé juste pour les effets secondaires, pour exemple, dans une instruction par elle-même ou le côté gauche d'une virgule opérateur. Essayez: (void) fonction (); à appelez une fonction et ignorez son retour valeur. Voir Aussi Le fvr, l'OAV et le fdr drapeaux AU §5.5 " drapeau Option".
Je veux obtenir cet avertissement, s'il en existe, lors de la compilation. Est-il une option dans gcc/g++ pour y parvenir? J'avais allumé -Wall
mais cela n'a apparemment pas détecté cela.
5 réponses
Grâce à Tourbillon et paxdiablo pour la réponse et commentaire. Voici ma tentative de mettre les morceaux ensemble dans un (?) réponse.
-Wunused-result
est pertinentes gcc avec l'option. Et , il est activé par défaut. Citation de la page options d'avertissement gcc :
-Wno-unused-result
Ne pas avertir si un appelant d'une fonction marquée avec l'attribut
warn_unused_result
(voir attributs variables ) n'utilise pas son retour valeur. La valeur par défaut est-Wunused-result
Donc, la solution consiste à appliquer l'attribut warn_unused_result
sur la fonction.
Voici un exemple complet. Le contenu du fichier unused_result.c
int foo() { return 3; }
int bar() __attribute__((warn_unused_result));
int bar() { return 5; }
int main()
{
foo();
bar(); /* line 9 */
return 0;
}
Et résultat de compilation correspondant:
$gcc unused_result.c
unused_result.c: In function ‘main’:
unused_result.c:9: warning: ignoring return value of ‘bar’, declared with attribute warn_unused_result
Notez à nouveau que Il n'est pas nécessaire d'avoir-wunused-result car c'est par défaut. On peut être tenté de le mentionner explicitement pour communiquer l'intention. Bien que ce soit une intention noble, mais après avoir analysé la situation, mon choix, cependant, serait contre. Parce que, avoir -Wunused-result
dans les options de compilation peut générer un faux sentiment de sécurité / satisfaction qui n'est pas vrai à moins que toutes les les fonctions de la base de code soient qualifiées avec warn_unused_result
.
Depuis C++17, vous pouvez utiliser le [[nodiscard]]
attribut.
Exemple:
[[nodiscard]] int bar() {
return 42;
}
-Wunused-result
devrait le faire pour vous. Ce n'est pas l'un des avertissements -Mur s'allume:
Http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
La fonction doit avoir l'attribut warn_unused_result appliqué (Merci paxdiablo).
Les réponses sur l'utilisation de __attribute__((warn_unused_result))
sont corrects. GCC n'est pas si bon à cette fonctionnalité, cependant! Soyez conscient: il ne préviendra pas pour les types non-POD. Cela signifie, par exemple, que si vous renvoyez une classe avec un destructeur (ou une classe avec des variables d'instance avec des destructeurs), vous ne verrez jamais d'avertissement d'ignorer le résultat.
Bug pertinent: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66177
Exemple où il échoue:
struct Error {
~Error();
};
__attribute__((warn_unused_result)) Error test();
int main()
{
test();
return 0;
}
Donc, ne comptez pas sur cela pour le retour types qui ne sont pas assez simples.
J'ai résolu le problème comme ceci:
#define ignore_result(x) if (x) {}
Au lieu de (void)foo()
utiliser ignore_result(foo())
Ensuite, le code compile avec -Wall
très bien.