2

使用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
4

1 回答 1

2

这个问题现在已经在 GCC 跟踪器中报告了好几次了(见这里)。我相信这会警告 pthread.h 中的实际问题(请参阅我的评论)。__cancel_routine没有被标记为 volatile 所以它的值在返回后确实是未定义的,longjmp这可能会导致任意后果。

唯一的解决方案是删除 Werror 直到修复?

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

在 x86 上回滚以前版本的 gcc 吗?

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

但我确实想确定这不是一个更大的问题,它可能导致我的代码或错误的意外行为。

Glibc 代码看起来非常可疑。我会等待 GCC 开发人员的评论,如果没有,请向 Glibc 开发人员报告

于 2017-03-19T09:09:47.110 回答