ThreadSanitizer: signal-unsafe call inside of a signal

如果在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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值