-
改写后:利用Matlab进行一维条形码的检测
资源介绍
北京大学博士学位论文 第四章 校验和感知的模糊测试技术
(b==4 && x==y) ||
(b==0 && x!=y && y==0) ||
(b==1 && x!=y && y==1) ||
(b==2 && x!=y && y==2) ||
(b==3 && x!=y && y==3)
符号化地址精确推理是混合符号执行的一个难题。在符号执行过程中,一旦
索引值是符号变量,那么对数组的访问就涉及到符号地址的推理。由于数组是高
级编程语言的基本数据类型,符号化地址是面向源代码的符号执行工具无法回避
的问题。在约束求解器社区和程序分析领域的推动下,数组推理有了一定发展,
很多面向源代码的符号执行工具(例如EXE[50]、Klee[49])逐渐支持符号索引。
很多约束求解器提供了数组读/写谓词,为符号执行系统收集数组约束条件提供
了方便。例如,在求解器具有数组推理能力时,上述对图4.11中变量b的取值就可
以描述为:
A = write(A, x, 4) && b = read(A, y)。
这里,write原语描述向数组(A)的索引位置(x)写下指定的值(4);read原
语描述从数组(A)读取索引位置(y)的值。求解器会推理x和y之间不同关系下
变量b的不同取值。
在二进制程序层进行符号化地址精确推理尤为困难。数组推理的重要前提是
知道数组的起始地址和长度。高级语言中程序变量是对内存地址的抽象描述,为
程序分析提供了很多便利。例如,面向高级语言的程序分析可以在数组变量的声
明或创建过程中,获悉数组的起始地址和长度。然而,在二进制程序层,程序直
接对内存地址访问,已经没有高级语言中所谓的“变量”概念[27]。高级语言中,不
同的变量就代表不同的内存区域,实现了对内存区域的抽象划分;但是,二进制
程序中,整个内存空间是一个“超大”数组,变量之间没有明确的边界信息。
文献 [77]尝试在二进制层实现精确指针推理,但是只能通过劫持内存分配函
数,获取堆对象起始地址和大小,依然无法处理局部变量;BitBlaze[41]是最早在
二进制程序层实现符号地址推理的系统。其核心思想在每次符号化内存读写时,
– 59 –