Rav*_*avi 12 c c++ linux multithreading reentrancy
我正在研究一个多线程的项目,并且想知道是否有办法让编译器标记使用对C库的非重入调用(例如strtok_r的strtok intsead)?如果没有,是否有一个不可重入的调用列表,所以我可以定期查看我的代码库?
一个相关的问题是,是否有办法标记3d方库使用非重入调用.
我假设重入意味着线程安全,但不一定反过来.是否有充分的理由在线程项目中使用非重入调用?
对于源代码,您可能会坚持每个源文件都包含以下行:
#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
因为我给它一个没有格式化命令的常量字符串).