avertissements lors de l’activation des options d’optimisation

J’utilise scanf in ac program pour lire un int de STDIN:

scanf("%d", &n); 

quand je comstack le programme c avec optimisation activée, je reçois des avertissements:

 gcc main.c -lm -lpthread -O2 -o main main.c: In function 'main': main.c:45: warning: ignoring return value of 'scanf', declared with atsortingbute warn_unused_result main.c:50: warning: ignoring return value of 'scanf', declared with atsortingbute warn_unused_result 

mais quand je supprime les options d’optimisation, pourquoi je ne reçois pas ces avertissements?

 gcc main.c -lm -lpthread -o main 

PS: Je n’utilise pas -Wall ou quelque chose de similaire.

La modification des parameters de l’optimiseur modifie la quantité (et la manière dont) le compilateur parsing votre code.

Certaines parsings de stream de programme ne sont pas effectuées lorsque l’optimisation n’est pas activée (ou n’est pas suffisamment élevée), de sorte que les avertissements associés ne sont pas émis.
Vous verrez cela fréquemment pour les avertissements de “variable inutilisée” – ceux-ci nécessitent une parsing du code au-delà de ce qui est nécessaire pour le comstackr simplement, de sorte que vous ne les utiliserez habituellement qu’avec l’optimisation activée.

(Et vous devriez vraiment comstackr avec -Wall .)

-Wunused-result est activé par défaut : comme vous devez activement décorer une fonction avec __atsortingbute__ ((warn_unused_result)) pour déclencher l’avertissement, les faux positifs ne se produisent que lorsqu’il est utilisé de manière trop libérale.

Même sans passer de drapeaux supplémentaires, gcc devrait générer un avertissement. Cependant, comme l’explique Mat, le compilateur ne fait pas l’parsing du stream de contrôle nécessaire sans augmenter les niveaux d’optimisation.

Corrigez votre code ou désactivez l’avertissement en ajoutant -Wno-unused-result . Si la valeur de retour est void sera probablement le cas.

Pour faire taire l’avertissement dans le code, vous devez atsortingbuer la valeur de retour à une variable factice, que vous pouvez ensuite void pour éviter un nouvel avertissement concernant la variable inutilisée. Il est également possible de substituer un littéral composé C99 à la variable explicitement déclarée (testée avec gcc 4.5.3).

Ce n’est en effet pas optimal – je m’attendais vraiment à ce que le void rendu que j’avais initialement proposé à travailler …