Symbolic Exectuion with Mixed Concrete-Symbolic Solving
Symbolic Exectuion with Mixed Concrete-Symbolic Solving
(掺杂了具体符号求解的符号执行)
概述:
这篇文章分析了传统的静态符号执行的局限性(也就是决策过程或约束求解器不完善,以及不能处理外部库调用),并将其与基于DART(Directed Automatic Random Testing)的动态符号执行方法进行了一系列的比较。在此之上,提出了一种方法,来克服传统静态符号执行的局限,同时保留可以进行回溯处理的优点(避免大量代码的重复执行;支持增量式约束求解)。
这种方法的核心思想是:
1)将生成的PC中的路径约束分为SimplePC和ComplexPC两种。所谓SimplePc就是可以被约束求解器或者决策过程直接求解的,而ComplexPc则表示不能被约束求解器处理的路径约束,比如非线性的整数运算(如开方、幂运算),内部以及外部函数调用等。
2)先求解SimplePc,并用求得的解对ComplexPc进行具体化,然后一块构成新的PC,再进行约束求解。
可能存在这种情况,路径本来是可达的,但是无法求得有效解,也就是会认为不可达。这种情况的原因是,我们是利用对SimplePC求解的值来具体化简化ComplexPC,而正是因为SimplePC求解值的不恰当,导致整个PC无法求解。为了保证这种方法的有效性,文中还提出了两种启发式思想,即
1)Incremental Solving Heuristic
即对SimplePC多次求解(增量式指SimplePC元素个数越来越多,因为它要将上次 SimplePC求解结果取反,再并入到SimplePC中),这样就可以获得多个值,并依次用 这些值来简化ComplexPC,并对生成的多个新的PC进行约束求解。
2)Partitioning Heuristic
这种思想是,将Uninterpreted functions(属于ComplexPC)的参数的域在有趣的点进行 划分,从而得到一个额外的约束列表,然后依次将约束列表中的每个约束,连同原来的 PC一块,组成新的PC,再进一步的求解。
存在的问题以及将来的工作:
1.因为传统的静态符号执行,路径的搜索和生成是利用了模型检测器,而JPF支持路径的随机搜索,那么如果使用随机搜索,同时使用随机求解(即当SimplePC中不包含ComplexPC中变量的约束时,就为不受约束的变量赋予一个随机值),是否就能享有DART的所有优点,同时保留传统符号执行原有的优点?无法理论证明,需通过大量实验验证。
2.开发新的启发式思想。比如有些求解器(如Choco)对SimplePC的求解结果可能是一个区间范围,这就需要使用随机抽样技术,来具体化简化ComplexPC。
3.这些新的启发式思想,可能在实际使用时花销很大。这需要进行实验证实,并对算法进行微妙的调整。
4.上述提出的方法,仅对于那些Pure(无副作用)的外部 methods,或者有副作用,但副作用对于分析无影响的methods有效。