如何自动检查C函数库是否符合重入?

时间:2014-02-18 22:32:33

标签: c multithreading debugging valgrind reentrancy

给定一个C函数库,如果导出的函数是可重入的,有没有办法自动验证?

在运行时(如果需要,在检测之后)或从代码分析。源代码可用。

注意:这不是std-C lib,也不是具有线程安全合同的详细记录的GNU lib。

1 个答案:

答案 0 :(得分:4)

如果函数在执行过程中不能被中断,然后在之前的调用完成执行之前再次安全地调用(“重新输入”),则该函数不被视为“线程安全”。

在C标准库中,某些功能属于此类别。您不需要像Valgrind这样的工具来检查线程安全性,而是应该阅读您关注的特定函数的文档(或手册页)。

通常,但并非总是如此,如果函数不是线程安全的,则C提供线程安全的对应物。

例如,字符串标记生成器函数strtok具有可重入版本strtok_r

char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);

区别在于,您的代码(线程)维护指向最后一个标记化字符串(正在进行的工作)的指针,而不是维护它的函数。这允许多个线程并行调用strtok_r

此外,这是关于SO讨论Threadsafe vs re-entrant行为的另一个链接。

-

编辑:与原始问题更直接相关。我不相信这样的工具可以告诉你函数是否可重入。 ltrace 等工具可以帮助解决此问题。我上面的评论说明了库的文档应该存在,我以C标准库为例。

关于Valgrind,有一个名为Helgrind的工具可以测试同步错误(参见:http://valgrind.org/docs/manual/hg-manual.html,第7.1节)