pthread_cleanup_push 和 O2 CFLAGS

pthread_cleanup_push and O2 CFLAGS

我在使用 pthread_cleanup_push/pop 和 -O2 CFLAGS 编译一段代码时收到一些警告。只需删除 Makefile 中的 O2 cflags 即可顺利编译。

是否禁止对这些 pthread 宏使用 gcc 优化?我无法在 man 或文档中找到任何内容。顺便说一下,有没有其他方法可以在线程末尾清理东西?它还与 gcc arm 完美配合。但不是在 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

此问题已在 GCC 跟踪器中多次报告(参见 here). I believe that this warns about real issue in pthread.h (see my comment)。 __cancel_routine 未标记为易失性,因此它的值在 return 之后通过 longjmp 确实未定义,这可能会导致任意后果。

The only solution is to remove the Werror until a fix ?

我宁愿选择 -Wno-clobbered,以启用其他警告。

Roll back on a previous version of gcc on x86 ?

你必须回滚到 2014 年之前的时间,这是一个很大的变化......我认为如果代码适合你,只需禁用 -Wclobbered(带有描述性注释)。

But I did want to be sure that its was not a bigger issue which can cause unexpected behavior of my code or bugs.

Glibc 代码看起来很可疑。我会等待 GCC 开发人员的评论,如果有 none、report this to Glibc developers.