ThreadSanitizer: обработчик сигнала портится errno - как избежать множества errno - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть немного кода, который обрабатывает сигналы POSIX, и как часть этого (для обеспечения безопасности сигнала) выполняет системный вызов sem_post () (согласно http://man7.org/linux/man-pages/man3/sem_post.3.html 'async signal safe').

Но когда я запускаю этот код - очень редко я получаю жалобу на дезинфицирующее средство потока:

РЕЗЮМЕ: ThreadSanitizer: обработчик сигнала портит errno / home / lewis / Sandbox / Stroika-Build-Dir-Ubuntu1804_x86_64/Library/Sources/Stroika/Foundation/Execution/SignalHandlers.cpp:497 в Стройке :: Foundation :: Execution :: SignalHandlerRegistry :: FirstPassSignalHandler_ (int)

Я полагаю, это связано с вызовом sem_post,который может INDEED перезаписать errno.

И да - это может действительно испортить другой поток, если это произошло в правильное (неправильное?) время.

Я всегда находил 'локальный потокМеханизм errno - удобный способ обработки ошибок, но я только сейчас понимаю, насколько опасно это для кода обработки сигналов.

Есть ли способ вызывать системные вызовы БЕЗ перезаписи errno?Что-нибудь, по крайней мере, смутно переносимое?

Даже http://man7.org/linux/man-pages/man2/syscall.2.html - говорит, что сохраняет результат в errno.

1 Ответ

0 голосов
/ 06 декабря 2018

В Linux вы можете использовать _syscall.Другим способом было бы сохранить errno в начале обработчика сигнала и восстановить перед возвратом.Если вы уверены, что ваша функция безопасна в этом отношении, вы также можете использовать некоторые атрибуты (как в GCC, так и в CLANG), чтобы отключить инструментарий ваших функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...