如何判断一个函数是不是可重入

Posted

技术标签:

【中文标题】如何判断一个函数是不是可重入【英文标题】:How to find if a function is reentrant如何判断一个函数是否可重入 【发布时间】:2015-04-23 13:11:32 【问题描述】:

我正在尝试使用开源库中的函数。这个函数默认不暴露在外面(所以我假设它不是开源库直接提供的实用函数),但是我需要这个函数来解决我的代码中的一些问题,所以我在makefile中做了一些改变来暴露图书馆的功能。

现在的问题是如何确保这个函数是可重入的。

我无法用肉眼发现,因为它在内部调用了许多函数。

确切地说,我很想知道 GDB 中是否有任何可用的工具或任何选项来检查我的函数是否仅使用局部变量而不更改全局变量。

【问题讨论】:

如果不确定并且您可以修改(看起来可以),请使用一些静态互斥体使函数不可重入。 可以查看反汇编代码。不过,这可能不值得付出努力…… 你可以只调用函数,调用中断,然后再次调用函数,看看会发生什么。如果它表现不好。 @Mohit Jain:我无法修改函数。这个函数被许多其他函数调用,并且似乎他们在调用这个函数之前就获得了锁(并不意味着'他们在调用这个函数之前正在锁定,他们可能会为其他一些用例获得锁)。 这非常棘手,因为除此之外,甚至标准 IO 函数也是不可重入的。有 valgrind 插件和其他工具,但它们不能 100% 保证代码是可重入的。 【参考方案1】:

判断一个函数是否可重入的方法是分析它的作用。

1) 除非对全局变量的操作是原子的,否则它不会访问全局变量(例如,无法同时读取和修改全局变量)。这通常意味着避免使用全局变量,或保证对它们的同步访问——例如所有修改和读取全局的代码在完成之前都持有一个互斥锁,因此操作是序列化的。或者代码

2) 代码不是自修改的(幸运的是,自修改代码在标准 C 或 C++ 中比较少见)。

3) 它不调用不是可重入函数(包括标准库中相当数量的函数)或程序(例如多处理通常使确保可重入所需的控制复杂化)的其他函数。

我不知道有任何特定工具可以分析函数以确定可重入性。通常,函数被设计为可重入(或不可重入)。在实践中,如果没有文档说明函数被设计为可重入的,那么可以肯定它不是可重入的。

【讨论】:

以上是关于如何判断一个函数是不是可重入的主要内容,如果未能解决你的问题,请参考以下文章

Linux系统编程可重入和不可重入函数

可重入函数的问题解答

可重入函数和非可重入函数

可重入函数(转)

可重入函数与不可重入函数

函数可重入性及编写规范