有没有办法标记使用非重入C库调用?

Rav*_*avi 12 c c++ linux multithreading reentrancy

我正在研究一个多线程的项目,并且想知道是否有办法让编译器标记使用对C库的非重入调用(例如strtok_r的strtok intsead)?如果没有,是否有一个不可重入的调用列表,所以我可以定期查看我的代码库?

一个相关的问题是,是否有办法标记3d方库使用非重入调用.

我假设重入意味着线程安全,但不一定反过来.是否有充分的理由在线程项目中使用非重入调用?

pax*_*blo 5

对于源代码,您可能会坚持每个源文件都包含以下行:

#include <beware.h>
Run Code Online (Sandbox Code Playgroud)

在C头之后,然后beware.h头文件包含:

#define strtok   unsafe_function_call_detected_strtok
#define getenv   unsafe_function_call_detected_getenv
Run Code Online (Sandbox Code Playgroud)

或一些其他合适的名称,不太可能是真正的功能.这将导致编译和/或链接器错误.

对于图书馆来说,这有点困难.您可以查看使用nm以提取每个目标文件中的所有未解析的名称,并确保不会调用任何不安全的名称.

这不是编译器所做的,但是很容易将其合并到构建脚本中.请参阅以下记录:

$ cat qq.c
    #include <stdio.h>

    int main (int argc, char *argv[]) {
        printf ("Hello, world.\n");
        return 0;
    }

$ gcc -c -o qq.o qq.c

$ nm qq.o
00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
         U ___main
00000000 T _main
         U _puts
Run Code Online (Sandbox Code Playgroud)

您可以使用标记在该输出中看到未解析的符号U(并且gcc非常偷偷地决定使用puts而不是printf因为我给它一个没有格式化命令的常量字符串).