Skip to content

Исправление undefined behavior в обработчике сигналов#5

Open
drewrukin wants to merge 1 commit intofreemind001:mainfrom
drewrukin:fix/signal-handler-ub
Open

Исправление undefined behavior в обработчике сигналов#5
drewrukin wants to merge 1 commit intofreemind001:mainfrom
drewrukin:fix/signal-handler-ub

Conversation

@drewrukin
Copy link
Copy Markdown

Описание

  • Удалён вызов std::cout из signal_handler() в main.cpp

std::cout не является async-signal-safe (POSIX.1-2017 §2.4.3). Если сигнал
приходит в момент, когда основной поток уже находится внутри std::cout
(например, при отладочном выводе в input_handler), это приводит к undefined
behavior: deadlock на мьютексе stdio, порча данных или краш.

loop.stop() пишет в eventfd, что является async-signal-safe, поэтому
достаточно одного этого вызова. Пользовательское сообщение не теряется —
процесс и так завершается.

Тестирование

  • Собрать проект (mkdir build && cd build && cmake .. && make)
  • Запустить с --debug, отправить SIGINT (Ctrl+C) — убедиться в чистом завершении
  • Запустить с --debug, отправить SIGTERM (kill <pid>) — убедиться в чистом завершении

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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants