pthread_cleanup_push и O2 CFLAGS

У меня есть некоторые предупреждения при компиляции части кода с использованием pthread_cleanup_push/pop с -O2 CFLAGS. Просто удалив флаги O2 в Makefile, вы сможете скомпилировать его без проблем.

Запрещено ли использовать gcc-оптимизацию с этими макросами pthread? Я не смог найти ничего в человеке или документации. Кстати, есть ли альтернатива чистить вещи в конце потока? Также он отлично работает с 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

1 ответ

Решение

Эта проблема уже была зарегистрирована несколько раз в трекере GCC (см. Здесь). Я считаю, что это предупреждает о реальной проблеме в pthread.h (см. Мой комментарий). __cancel_routine не помечен как изменчивый, поэтому его значение действительно не определено после возврата через longjmp что может привести к произвольным последствиям.

Единственное решение - удалить Werror до исправления?

Я предпочел бы пойти с -Wno-clobbered, чтобы другие предупреждения были включены.

Откатиться на предыдущую версию gcc на x86?

Вы должны будете откатиться до времен до 2014 года, что является большим изменением... Я думаю, что если код работает для вас, просто отключите -Wclobbered (с описательным комментарием).

Но я хотел быть уверен, что это не большая проблема, которая может вызвать неожиданное поведение моего кода или ошибок.

Код Glibc выглядит действительно подозрительно. Я бы дождался комментариев от разработчиков GCC и, если их нет, сообщите об этом разработчикам Glibc.

Другие вопросы по тегам