Исправление undefined behavior в обработчике сигналов#5
Open
drewrukin wants to merge 1 commit intofreemind001:mainfrom
Open
Исправление undefined behavior в обработчике сигналов#5drewrukin wants to merge 1 commit intofreemind001:mainfrom
drewrukin wants to merge 1 commit intofreemind001:mainfrom
Conversation
Remove std::cout call from signal_handler(). iostream functions are not async-signal-safe (POSIX.1-2017 §2.4.3). If a signal arrives while another thread or the main flow is already inside std::cout, this causes undefined behavior: potential deadlock on the internal stdio mutex, data corruption, or crash. loop.stop() writes to an eventfd, which is async-signal-safe, so it is sufficient on its own. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Описание
std::coutизsignal_handler()вmain.cppstd::coutне является async-signal-safe (POSIX.1-2017 §2.4.3). Если сигналприходит в момент, когда основной поток уже находится внутри
std::cout(например, при отладочном выводе в
input_handler), это приводит к undefinedbehavior: deadlock на мьютексе stdio, порча данных или краш.
loop.stop()пишет в eventfd, что является async-signal-safe, поэтомудостаточно одного этого вызова. Пользовательское сообщение не теряется —
процесс и так завершается.
Тестирование
mkdir build && cd build && cmake .. && make)--debug, отправить SIGINT (Ctrl+C) — убедиться в чистом завершении--debug, отправить SIGTERM (kill <pid>) — убедиться в чистом завершении