有没有什么方法可以测试C++API(在ubuntu-linux上)是否是重新集中的(线程安全的)
Is there any way to test if a C++ API (on ubuntu linux) is re-entrant (thread safe)?
我从长期离开公司的开发人员那里继承了大量代码。是否存在可以让我测试代码是否是可重入的,而不是通读的方法?
我想在多个线程中运行api,但不能100%确定代码是否是可重入的。
编辑:更改标题以添加线程安全作为理想目标
否。通过执行来证明重新进入通常是很难的。
通常,由于外部依赖关系,您无法自动推断可重入性和线程安全性,但无论如何,有一些工具可以提供帮助:
有哪些开源C++静态分析工具可用?
Clang线程安全性分析。
1)可重入性测试
重新执行意味着:您可以在函数执行完成之前中断它,然后在第一个insance挂起时安全地再次调用它,然后恢复第一个实例Re entrency不一定与线程相关:它也与单线程相关,尤其是与硬件/软件中断/信号相关的回调函数。
没有能够检测到特定可重入性问题的黑盒测试因为重新进入问题可能只会根据您中断执行的位置而出现。验证它是重新进入的需要你分析源代码。
有几个提示有助于发现风险(尽管不是通过测试):
-
如果一个函数使用静态或全局变量,那么它就有不可重入的风险(这也是建议尽可能避免这些风险的原因之一)。
-
if函数依赖于以前对函数的调用,但不传输可以保存执行上下文的数据结构。这表明了一些隐藏的静态(典型的例子是
strtok()
)。 -
如果在头中定义了一些
extern
但这些指标并不能确定。获得确定性的唯一方法是代码分析。
2)线程安全
线程安全性甚至比可重入性问题更难验证。因为API的多个调用可以并行进行,每个调用都以不同的速度执行,并且问题可能只会出现,这取决于线程之间读写的顺序。如何测试同步机制在所有情况下都能工作?
同样,唯一的方法是对代码进行深入分析。这甚至比重新进入更困难,因为你必须考虑复杂的同步问题(例如:死锁)、对共享变量的访问,以及潜在的硬件问题,如处理器内存缓存。
- C++LDAP检查用户是否是特定组的成员
- 检查某些类型是否是模板类 std::optional 的实例化
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 如何检查模板专用化是否是基本模板的子类?
- 如何检查变量是否是C++中的地图?
- C++ Chrono 确定一天是否是周末?
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- MFC 中的窗口消息管理:添加基类调用是否是强制性的?
- 检查 n2 是否是 n1 的倍数后结果错误,但根本没有错误
- C ++:检查它是否是类中的数字
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- 是新的(&*p)双倍;一个无操作。因此,uninitialized_default_construct是否也变得无操作?
- 找出当前时间是否是新秒的开始
- 如何知道TStringList是否是新的
- 使用可变参数模板创建传递新对象的更安全方式是否是个好主意
- 有没有什么方法可以测试C++API(在ubuntu-linux上)是否是重新集中的(线程安全的)