2017-03-18 2 views
2

j'ai un avertissement lors de la compilation d'un morceau de code à l'aide pthread_cleanup_push/pop avec - O2CFLAGS. Juste en supprimant les cflags O2 dans le Makefile, faites-le compiler sans problème.pthread_cleanup_push et O2 CFLAGS

Est-il interdit d'utiliser l'optimisation gcc avec ces macros pthread? Je n'ai pas pu trouver quoi que ce soit dans l'homme ou la documentation. En passant, y a-t-il une alternative à nettoyer les choses à la fin d'un fil? Aussi, il fonctionne parfaitement avec le bras gcc. Mais pas sur x86 gcc.

Attention:

x/x.c:1292:2: warning: variable ‘__cancel_routine’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Wclobbered] 
    pthread_cleanup_push(x_cleanup, &fd); 

Mon option actuelle CFLAGS:

-W -Wall -Wformat -Wformat-security -Wextra -Wno-unused-result, 
-Wextra -Wno-long-long -Wno-variadic-macros -Wno-missing-field-initializers 
-std=gnu99 -O2 
+2

Je suppose que vous avez vu [BZ 61118] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61118)? – yugr

+0

@yugr Oui, je l'ai déjà vu même si je ne savais pas si c'était la raison. Le bug était rapport sur 2014 ... C'est fou ... La seule solution est de supprimer le Werror jusqu'à une solution? Revenez-vous sur une version précédente de gcc sur x86? Ce n'est pas une impasse pour mon code puisque le problème n'est pas présent avec un compilateur croisé ARM. Mais je voulais être sûr que ce n'était pas un plus gros problème qui peut provoquer un comportement inattendu de mon code ou des bugs. – ArthurLambert

+0

Vous pouvez ajouter '-Wno-clobbered' à votre liste d'avertissements désactivés. – caf

Répondre

2

Ce problème a été signalé à plusieurs reprises maintenant suivi GCC (voir here). Je crois que cela met en garde contre un vrai problème dans pthread.h (voir my comment). __cancel_routine n'est pas marqué comme volatile donc sa valeur est en effet indéfinie après le retour via longjmp ce qui peut entraîner des conséquences arbitraires.

La seule solution est d'enlever le Werror jusqu'à une solution? Je préférerais aller avec -Wno-clobbered, pour garder d'autres avertissements activés.

Restaurer une version précédente de gcc sur x86?

Vous devez rollback à la période pré-2014, qui est tout à fait un changement ... Je pense que si le code fonctionne pour vous, désactiver -Wclobbered (avec un commentaire descriptif). Mais je voulais être sûr que ce n'était pas un plus gros problème qui peut provoquer un comportement inattendu de mon code ou des bogues.

Le code Glibc semble vraiment suspect. J'attendrais les commentaires des développeurs de GCC et s'il n'y en a pas, report this to Glibc developers.