如果在tsan中出现:
ThreadSanitizer: signal-unsafe call inside of a signal (pid=149999)
这一类warrning,那么大概率你是犯了下面的错。
https://man7.org/linux/man-pages/man7/signal-safety.7.html
https://owasp.org/www-community/vulnerabilities/Unsafe_function_call_from_a_signal_handler
下面的signal handler比如是一个pthread_once().
An async-signal-safe function is one that can be safely called
from within a signal handler. Many functions are not async-
signal-safe. In particular, nonreentrant functions are generally
unsafe to call from a signal handler.
The kinds of issues that render a function unsafe can be quickly
understood when one considers the implementation of the stdio
library, all of whose functions are not async-signal-safe.
When performing buffered I/O on a file, the stdio functions must
maintain a statically allocated data buffer along with associated
counters and indexes (or pointers) that record the amount of data
and the current position in the buffer. Suppose that the main
program is in the middle of a call to a stdio function such as
printf(3) where the buffer and associated variables have been
partially updated. If, at that moment, the program is
interrupted by a signal handler that also calls printf(3), then
the second call to printf(3) will operate on inconsistent data,
with unpredictable results.
To avoid problems with unsafe functions, there are two possible
choices:
(a) Ensure that (1) the signal handler calls only async-signal-
safe functions, and (2) the signal handler itself is
reentrant with respect to global variables in the main
program.``
(b) Block signal delivery in the main program when calling
functions that are unsafe or operating on global data that
is also accessed by the signal handler.
Generally, the second choice is difficult in programs of any
complexity, so the first choice is taken.
5万+

被折叠的 条评论
为什么被折叠?



