我正在计划使用现成的SMT求解器进行C代码符号执行的一些实验,并想知道要使用哪个求解器。看SMT竞赛参赛者仅采用开源系统,将其范围缩小到Beaver,Boolector,CVC3,OpenSMT,Sateen,Sonolar,STP,Verit;这仍然是一长串。
在尝试进一步缩小范围时,我注意到某些系统宣告了处理位向量算术的能力,而其他系统仅宣告了处理一般整数算术的能力。原则上,前者对于C是正确的,其中变量是机器字,而不是无界整数。在实践中有什么不同?如果您尝试将通用整数系统用于此类工作,会发生什么情况?是否存在以下情况之一?
我尝试过提出一个尽可能具体的问题,但是如果有人可以建议其他任何缩小范围的标准,那就太好了!
最佳答案
我在使用STP进行符号执行方面有丰富的经验。 STP正是为此任务而设计的。另外,有许多符号执行工具已成功地将STP用于此目的,因此有理由相信STP不会烂掉。我绝对会向其他人推荐STP作为此类实验的默认选择。
但是,我还没有尝试过其他系统,所以我不知道STP与它们相比。
我个人认为STP是这种应用程序的基准和默认选择。因此,如果您只有时间尝试一个求解器,那么尝试STP似乎是一个非常合理的选择。
如果我不得不猜测,我的猜测将是支持位向量算法很重要,因为任何大型系统代码都将具有大量执行位运算的代码。另外,我怀疑/担心某些系统代码可能依赖于无符号算术的行为来包装2n模,并且,如果您尝试使用整数对其进行建模,那么您将无法获得C的语义(因为正如您所说,整数对于机器单词算术而言是不正确的),因此,如果您尝试使用仅整数解算器,则可能会遇到一些困难。但是,对于这些怀疑,我都没有确凿的证据。
P.S. Z3可能也是要添加到您的列表中考虑的竞争者。 (只要它是免费的,您是否真的需要您的求解器是开源的?我希望符号执行工具仅将其用作黑盒,而无需进行修改。)