2017-03-18 12 views
2

は、pthread_cleanup_push /ポップを使用してコードの一部をコンパイルするとき、私はいくつかの警告を持っている - O2CFLAGS。 Makefile内のO2のcflagsを削除するだけで問題なくコンパイルできます。は、pthread_cleanup_pushとO2 CFLAGS

これらのpthreadマクロでgcc最適化を使用することは禁じられていますか?私は人や文書で何かを見つけることができませんでした。ちなみに、スレッドの最後には何かをクリーンにする代替手段がありますか?また、gccアームと完全に連携しています。しかし、x86 gcc上ではありません。

警告:

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

私の現在のCFLAGSオプション:この問題は、GCCトラッカーに今何回か報告されている

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

あなたは[BZ 61118](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61118)を見たことがありますか? – yugr

+0

@yugrはい、それが理由であるかどうかわからなくても、私はすでにこれを見ました。バグは2014年のレポートでした...その狂った...唯一の解決策は修正までWerrorを削除することですか?以前のバージョンのgcc(x86版)をロールバックしますか?この問題はARMクロスコンパイラには存在しないため、私のコードのデッドロックではありません。しかし、私はコードやバグの予期しない動作を引き起こす大きな問題ではないことを確かめたいと思っていました。 – ArthurLambert

+0

無効な警告リストに '-Wno-clobbered'を追加することができます。 – caf

答えて

2

hereを参照してください)。私はこれがpthread.hの本当の問題について警告していると信じています(my comment参照)。 __cancel_routineはvolatileとマークされていませんので、値はlongjmpで返された後は実際には定義されていません。

唯一の解決策は、修復までWerrorを削除することですか?

他の警告を有効にするには、-Wno-clobberedというよりはむしろ-Wno-clobberedとしてください。

x86のgccの以前のバージョンをロールバックしますか?

あなたはかなり変更され、プリ2014倍にロールバックする必要があります...私はコードがあなたのために働く場合には、単に(説明コメント付き)-Wclobberedを無効にすることを考えます。

しかし、コードやバグの予期しない動作を引き起こす大きな問題ではないことを確認したいと思います。

Glibcコードは本当に疑わしいようです。私はGCCの開発者からのコメントを待っていたし、もし誰もいなければ、report this to Glibc developers

関連する問題