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.