在调试某些代码时,这更多是一种假设。假设我有一个应用程序(称为X),该应用程序调出一个库以通过TLS加密的SMTP连接发送电子邮件,而同时X与另一个库进行通信,该库通过同一个libcrypto库建立另一个TLS套接字,在某个特定的(奇怪的)条件下,一个函数调用会因段错误而失败的可能性有多大?
我有点不知所措,直到我们添加了通过TLS连接到Skype服务器的Skype SDK为止,这段代码都可以正常工作,因为从那时起,我们实际上可以使问题重复发生,但是我对为什么会感到困惑。 (我可能会忽略明显的东西,但是我将从最奇怪的可能性开始)
最佳答案
一般而言,这是有可能的-但是编写良好的库应该对多重访问具有鲁棒性。您可能需要浏览文档,以查看其API是否可重入(甚至是安全可靠的)。
如果它是线程安全的,那么(假设libcrypto作者没有犯错误),您可以确定这不是问题的原因。
如果它是可重入的,则在两个(或多个)线程中使用此lib的任何内容都应在访问时进行同步(例如,使用互斥锁),但是如果您未编写部分代码,并且您无权对其进行修改,那么您卡住了。我唯一能想到的就是使用另一个版本的libcrypto,因此系统会为其内部结构创建另一个不相关的实例。这很丑陋,可能在用户计算机上表现怪异。
关于c++ - 使用libssl/libcrypto的Segfault,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7713983/