与safety TinyOS有关;
- 论文提出了KleeNet工具,一个独立平台的传感网程序bug检测工具,他能对所有可能的输入来测试应用程序,主要监测的是传感网程序内存安全的bug;
- KeelNet识别某个bug之后会生成一个触发这个bug的测试用例;
将KeelNet集成到了TinyOS中; - KleeNet的基本原理(与Avrora中-monitor插桩程序的实现有点类似):指定一个变量作为跟踪对象,获得该变量执行的路径和操作,如果产生了bug,再生成一个导致这个bug的测试用例。
- 将KeelNet集成到了TinyOS中。
Abstract
- 论文提出了KleeNet工具,一个独立平台的传感网程序bug检测工具,他能对所有可能的输入来测试应用程序,主要监测的是传感网程序内存安全的bug;
- KeelNet识别某个bug之后会生成一个触发这个bug的测试用例;
- 将KeelNet集成到了TinyOS中;
Introduce
- WSNs应用程序:内存限制 + CPU资源有限 + 低级、非类型安全的语言且没有动态监测和内存保护 + 高度地面向数据流 + 导读分布特特点 + 缺乏内存保护;
- WSNs的常见bug有:数组内存越界 + 空指针异常 + 错误的类型转换(特别是指针与结构体之间的转换)
- 现有的对C语言的测试工具不适用于测试WSNs应用程序的原因是:
1、WSNs程序与操作系统集成在一起运行,人工的代码修改很耗时;
2、很多工具有限地支持C语言语义的静态代码分析,而WSNs程序主要是从周围环境获得数据,所以这些工具不能检测动态运行时的bug;
3、现有bug 测试对开发人员来讲很难使用; - 论文主要是找出确定的WSNs错误,且自动化,开销小。
Related work
- WSNs的内存安全上的相关工作有:Safe TinyOS;
- Safe TinyOS在编译时冬天内存检测来捕获非安全的指针和数组操作,当然也会增加代码量和CPU的额外开销 + 软件部署之后进行相关测试;
- KleeNet使用动态的代码植入技术来进行离线的bug检测,这样不用耗费任何系统资源 + 通过检测所有可能的程序输入来保证内存安全;
- KleeNet解释虚拟指令集为KleeNet的核心引擎,因此它不能检测依赖硬件平台的汇编级bug,也不适用于运行时的内存安全的检测
- 论文贡献:
1、将KleeNet继承到TinyOS检测WSNs程序bug;
2、容易扩展;
3、开销小;
System overview
1、Klee
- Klee是一个C程序的符号执行工具,Klee以符号作为输入。开发人员只需要指定代码中哪一个内存位置是有输入的;代码执行过程中,所有的符号变量的执行路径和操作会被跟踪;如果找到一个bug,Klee会自动生成一个导致这个bug的测试用例。例如:
. . .
call Timer1. startPeriodic (500);
. . .
int a[10];
unsigned i ;
klee make symbolic name(&i , sizeof( i ) , ”i ”);
event void Timer1. fired ()
{
call Leds. led1Toggle ();
// here we violate memory safety
// on the 11th signal of this event
if ( i < 11)
a[ i++] = 1;
}
. . .
Klee的输出:
$ make kleenet test
KLEE: ERROR: memory error : out of bound pointer
$ make kleenet display
BlinkFailC$i : ’10 ’
- 目前Klee只支持内存引用错误和除0错误,之后会被扩展成支持非类型安全错误例如指针转化错误;
2、Automatic code instrumentation
- 论文的一个目标是:提供一个很容易使用的WSNs程序bug检测工具,并且能很好地继承到WSNs成虚执行的生命周期中。实现方法是:自动的代码植入。
- 自动代码植入的实现方法:通过扩展基于GNU C语言编译器的解析器工具ANTLR,使他能自动插入符号注解(例如标记内存位置),用户只需要提供一个待检测变量高级配置。
- 也可以插入注解的配置方式来进行额外的检测,这种方式是可选的。
3、结构体类型检测
- 结构体类型与指针类型之间的转换很有可能出错。
- 一开始传感器结点接收到的数据时位流数据,之后指向改数据的指针会转换成特定的结构体类型
Integeration into TinyOS
- 通过网TinyOS平台中增添一个虚拟的KleeNet平台,这个方法很容易实现网平台中增加不同模块,能够自动将传感网结点的输入值和接收的数据报标记为符号。
- TinyOS是基于事件驱动,为了覆盖所有的程序控制流路径,将我们的平台扩展成自动事件信号量机制,一旦程序启动,所有实现了的事件都信号化然后执行。
- 如图显示了KleeNet构建过程:
1、指定配置文件:代码中哪个变量要符号化(klee_make_symbolic函数一斤更实现了);
2、所有接收到的数据报缓存自动符号化;
3、植入的代码传入Klee中,并且构建C对象文件
4、最后Klee解释这个C对象文件,有bug的话会自动生成产生这个bug的测试用例
Evaluation
- 除0bug
- KleeNet的优点:可用性 + 覆盖率高 + 集成到了TinyOS + 有效性。