concurrency-mt-unsafe

检查针对已知不安全函数黑名单的某些线程不安全函数。通常它们访问没有同步的静态变量(例如 gmtime(3))或以有竞争条件的方式使用信号。要检查的函数集由 FunctionSet 选项指定。

请注意,如果仅使用单个线程,使用一些线程不安全函数在并发编程中可能仍然有效(例如 setenv(3)),但是,一些函数可能会在全局变量中跟踪状态,这将被后续(非并行,但并发)调用到相关函数中覆盖。例如,以下代码存在对全局状态的无保护访问

// getnetent(3) maintains global state with DB connection, etc.
// If a concurrent green thread calls getnetent(3), the global state is corrupted.
netent = getnetent();
yield();
netent = getnetent();

示例

tm = gmtime(timep); // uses a global buffer

sleep(1); // implementation may use SIGALRM
FunctionSet

指定 libc 中哪些函数应该被认为是线程安全的,可能的值是 posixglibcany

posix 表示 POSIX 定义的线程不安全函数。POSIX.1-2001 在“2.9.1 线程安全”中定义,标准中指定的所有函数都是线程安全的,除了预定义的线程不安全函数列表。

Glibc 将其中一些定义为线程安全的(例如 dirname(3)),但添加了非 POSIX 线程不安全的函数(例如 getopt_long(3))。Glibc 的列表是从 GNU 网页文档中编译而来的,搜索了 MT-Safe 标签: https://www.gnu.org/software/libc/manual/html_node/POSIX-Safety-Concepts.html

如果你想要识别至少一个 libc 的线程不安全 API 或不确定将使用哪个 libc,请使用 any(默认值)。