【问题标题】:pthread_cleanup_push and O2 CFLAGSpthread_cleanup_push 和 O2 CFLAGS
【发布时间】:2017-08-10 02:05:53
【问题描述】:

在使用带有 -O2 CFLAGSpthread_cleanup_push/pop 编译一段代码时,我收到了一些警告。只需删除 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

【问题讨论】:

  • 我想你已经看过BZ 61118?
  • @yugr 是的,即使我不确定这是否是原因,我已经看到了。该错误是在 2014 年报告的......它很疯狂......唯一的解决方案是删除 Werror 直到修复?在 x86 上回滚以前版本的 gcc 吗?这不是我的代码的死锁,因为 ARM 交叉编译器不存在此问题。但我确实想确定这不是一个更大的问题,可能导致我的代码出现意外行为或错误。
  • 您可以将-Wno-clobbered 添加到禁用警告列表中。

标签: c gcc pthreads setjmp cflags


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2014-08-21
    • 2011-07-04
    • 1970-01-01
    • 2018-10-01
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多