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()

Du manuel lint

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.

24
demandé sur iammilind 2010-05-20 05:38:06

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.

24
répondu Arun 2017-05-23 11:47:02

Depuis C++17, vous pouvez utiliser le [[nodiscard]] attribut.

Exemple:

[[nodiscard]] int bar() {
  return 42;
}
11
répondu Jyaif 2017-05-01 01:25:18

-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).

6
répondu WhirlWind 2010-05-20 02:50:11

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.

4
répondu Jonah 2016-03-23 15:21:24

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.

-1
répondu Sasha Pachev 2017-10-18 19:30:57