pthread_cleanup_push和O2 CFLAGS

时间:2017-03-18 14:43:15

标签: c gcc pthreads setjmp cflags

我在使用 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

1 个答案:

答案 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

相关问题