有没有什么方法可以测试C++API(在ubuntu-linux上)是否是重新集中的(线程安全的)

Is there any way to test if a C++ API (on ubuntu linux) is re-entrant (thread safe)?

本文关键字:是否是 新集中 集中 安全 线程 ubuntu-linux 方法 什么 测试 有没有 C++API      更新时间:2023-10-16

我从长期离开公司的开发人员那里继承了大量代码。是否存在可以让我测试代码是否是可重入的,而不是通读的方法?

我想在多个线程中运行api,但不能100%确定代码是否是可重入的。

编辑:更改标题以添加线程安全作为理想目标

否。通过执行来证明重新进入通常是很难的。

通常,由于外部依赖关系,您无法自动推断可重入性和线程安全性,但无论如何,有一些工具可以提供帮助:

有哪些开源C++静态分析工具可用?

Clang线程安全性分析。

1)可重入性测试

重新执行意味着:您可以在函数执行完成之前中断它,然后在第一个insance挂起时安全地再次调用它,然后恢复第一个实例Re entrency不一定与线程相关:它也与单线程相关,尤其是与硬件/软件中断/信号相关的回调函数。

没有能够检测到特定可重入性问题的黑盒测试因为重新进入问题可能只会根据您中断执行的位置而出现。验证它是重新进入的需要你分析源代码。

有几个提示有助于发现风险(尽管不是通过测试):

  • 如果一个函数使用静态或全局变量,那么它就有不可重入的风险(这也是建议尽可能避免这些风险的原因之一)。

  • if函数依赖于以前对函数的调用,但不传输可以保存执行上下文的数据结构。这表明了一些隐藏的静态(典型的例子是strtok())。

  • 如果在头中定义了一些extern

但这些指标并不能确定。获得确定性的唯一方法是代码分析。

2)线程安全

线程安全性甚至比可重入性问题更难验证。因为API的多个调用可以并行进行,每个调用都以不同的速度执行,并且问题可能只会出现,这取决于线程之间读写的顺序。如何测试同步机制在所有情况下都能工作?

同样,唯一的方法是对代码进行深入分析。这甚至比重新进入更困难,因为你必须考虑复杂的同步问题(例如:死锁)、对共享变量的访问,以及潜在的硬件问题,如处理器内存缓存。