我在使用 pthread_cleanup_push / pop 编译一段代码时遇到一些警告 - O2 CFLAGS 。只需删除Makefile中的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选项:
-W -Wall -Wformat -Wformat-security -Wextra -Wno-unused-result,
-Wextra -Wno-long-long -Wno-variadic-macros -Wno-missing-field-initializers
-std=gnu99 -O2
答案 0 :(得分:2)
此问题已在GCC跟踪器中多次报告(请参阅here)。我相信这会在pthread.h中警告真正的问题(参见my comment)。 __cancel_routine
未标记为volatile,因此在通过longjmp
返回后,其值确实未定义,这可能会导致任意后果。
唯一的解决方案是删除Werror直到修复?
我宁愿选择-Wno-clobbered
,以启用其他警告。
在x86上回滚以前版本的gcc?
你必须回滚到2014年之前的时间,这是一个很大的改变...我认为如果代码适合你,只需禁用-Wclobbered
(带有描述性评论)。
但我确实想确定它不是一个更大的问题,可能导致我的代码或错误的意外行为。
Glibc代码看起来很可疑。我等待GCC开发者的评论,如果没有,report this to Glibc developers。