如何确定一个函数是否可重入

9

我正在尝试使用开源库中的一个函数,这个函数默认情况下不对外公开(因此我认为它不是由开源库直接提供的实用函数),但是我需要这个函数来解决我的代码中的一些问题,所以我已经在makefile中进行了一些更改以公开该函数。

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

我无法通过肉眼找到答案,因为它内部调用了许多函数。

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


6
如果不确定并且您能够进行修改(似乎是可以的),请使用一些静态互斥锁使函数不可重入。 - Mohit Jain
1
你可以检查反汇编代码。虽然可能不值得这么做... - Karoly Horvath
你可以直接调用函数,然后调用中断,再次调用函数并观察结果。如果它表现不佳,那就需要进行修复。 - Daniel Lopez
@Mohit Jain:我无法修改这个函数。许多其他函数调用了此函数,似乎它们在调用此函数之前获取了锁(并不意味着它们刚调用此函数之前进行了锁定,它们可能是为了某些其他用例而获取了锁)。 - Banu Prakash
这非常棘手,因为除了其他事情之外,即使是标准IO函数也是不可重入的。虽然有valgrind插件和其他工具,但它们无法百分之百地保证代码是可重入的。 - alecco
@alecco 您是正确的,没有了解源代码将会非常困难。一个可重入函数可能会调用另一个不可重入函数,依此类推。 - MCG
1个回答

2
确定函数是否可重入的方法是分析它所做的事情。
  1. 它不访问全局变量,除非对这些全局变量的操作是原子的(例如没有同时读取和修改全局变量的方式)。这通常意味着避免使用全局变量,或者保证对它们进行同步访问 - 例如修改和读取全局变量的所有代码都持有互斥锁,直到完成,因此操作是串行的。
  2. 代码不是自修改的(幸运的是,在标准C或C ++中,自修改的代码相对较少)。
  3. 它不调用其他可重入函数(包括标准库中的相当数量的函数)或程序(例如多处理通常会使需要确保可重入性的控制复杂化)。
我不知道有任何特定的工具来分析函数以确定其可重入性。通常情况下,一个函数被设计成可重入(或不可重入)。实际上,如果没有文档说明一个函数被设计为可重入,那么它很可能不可重入。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接