有界字符串变量的约束求解
1. 引言
字符串约束在许多实际问题中广泛存在,如测试用例生成、程序分析、模型检查和网络安全等。以字符串操作程序的符号执行为例,程序的控制流图上的路径对应着路径约束,求解这些约束可以得到具体输入或证明路径不可行。
例如,有如下 JavaScript 代码及对应的控制流图:
0 function doSomething(s) {
1
y = s.len();
2
while (y mod 2 != 0)
3
{ x += s[y-1]; y = y/2; }
4
if (s.match(/^(a*b)c\1$/))
5
x = s.substr(1,s.len()/2);
6
return x;
7 }
对于路径 π = 1 - 2 - 4 - 5 - 6,其路径约束为:
$PC_{\pi}: y = |s| \land y \mod 2 = 0 \land s \in L((a^*b)c\1) \land x = s_{1:y/2}$
该约束是不可满足的,因为第 4 行的表达式要求字符串长度为奇数,所以此路径不可行。
这个例子表明,软件验证所需的字符串约束语言应足够丰富,能对编程语言中常见的字符串操作符进行建模。当前的字符串约束求解方法可根据对字符串长度的处理方式大致分为两类:无界长度字符串求解器和固定长度字符串求解器。前者通过形式语言内涵地定义满足条件的字符串集合,约束推理主要是语言交集问题;后者则逐个生成解。本文关注有界长度字符串变量的约束求解问题。
超级会员免费看
订阅专栏 解锁全文
19

被折叠的 条评论
为什么被折叠?



