TinyOS论文10:Bug Hunting in Sensor Network Applications
2015-12-15 16:56
381 查看
与safety TinyOS有关;
论文提出了KleeNet工具,一个独立平台的传感网程序bug检测工具,他能对所有可能的输入来测试应用程序,主要监测的是传感网程序内存安全的bug;
KeelNet识别某个bug之后会生成一个触发这个bug的测试用例;
将KeelNet集成到了TinyOS中;
KleeNet的基本原理(与Avrora中-monitor插桩程序的实现有点类似):指定一个变量作为跟踪对象,获得该变量执行的路径和操作,如果产生了bug,再生成一个导致这个bug的测试用例。
将KeelNet集成到了TinyOS中。
KeelNet识别某个bug之后会生成一个触发这个bug的测试用例;
将KeelNet集成到了TinyOS中;
WSNs的常见bug有:数组内存越界 + 空指针异常 + 错误的类型转换(特别是指针与结构体之间的转换)
现有的对C语言的测试工具不适用于测试WSNs应用程序的原因是:
1、WSNs程序与操作系统集成在一起运行,人工的代码修改很耗时;
2、很多工具有限地支持C语言语义的静态代码分析,而WSNs程序主要是从周围环境获得数据,所以这些工具不能检测动态运行时的bug;
3、现有bug 测试对开发人员来讲很难使用;
论文主要是找出确定的WSNs错误,且自动化,开销小。
Safe TinyOS在编译时冬天内存检测来捕获非安全的指针和数组操作,当然也会增加代码量和CPU的额外开销 + 软件部署之后进行相关测试;
KleeNet使用动态的代码植入技术来进行离线的bug检测,这样不用耗费任何系统资源 + 通过检测所有可能的程序输入来保证内存安全;
KleeNet解释虚拟指令集为KleeNet的核心引擎,因此它不能检测依赖硬件平台的汇编级bug,也不适用于运行时的内存安全的检测
论文贡献:
1、将KleeNet继承到TinyOS检测WSNs程序bug;
2、容易扩展;
3、开销小;
Klee是一个C程序的符号执行工具,Klee以符号作为输入。开发人员只需要指定代码中哪一个内存位置是有输入的;代码执行过程中,所有的符号变量的执行路径和操作会被跟踪;如果找到一个bug,Klee会自动生成一个导致这个bug的测试用例。例如:
Klee的输出:
目前Klee只支持内存引用错误和除0错误,之后会被扩展成支持非类型安全错误例如指针转化错误;
2、Automatic code instrumentation
论文的一个目标是:提供一个很容易使用的WSNs程序bug检测工具,并且能很好地继承到WSNs成虚执行的生命周期中。实现方法是:自动的代码植入。
自动代码植入的实现方法:通过扩展基于GNU C语言编译器的解析器工具ANTLR,使他能自动插入符号注解(例如标记内存位置),用户只需要提供一个待检测变量高级配置。
也可以插入注解的配置方式来进行额外的检测,这种方式是可选的。
3、结构体类型检测
结构体类型与指针类型之间的转换很有可能出错。
一开始传感器结点接收到的数据时位流数据,之后指向改数据的指针会转换成特定的结构体类型
TinyOS是基于事件驱动,为了覆盖所有的程序控制流路径,将我们的平台扩展成自动事件信号量机制,一旦程序启动,所有实现了的事件都信号化然后执行。
如图显示了KleeNet构建过程:
1、指定配置文件:代码中哪个变量要符号化(klee_make_symbolic函数一斤更实现了);
2、所有接收到的数据报缓存自动符号化;
3、植入的代码传入Klee中,并且构建C对象文件
4、最后Klee解释这个C对象文件,有bug的话会自动生成产生这个bug的测试用例
KleeNet的优点:可用性 + 覆盖率高 + 集成到了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、KleeKlee是一个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
除0bugKleeNet的优点:可用性 + 覆盖率高 + 集成到了TinyOS + 有效性。
Conclusion
相关文章推荐
- Xcode7版本以后app无法联网问题解决
- 基于 Android NDK 的学习之旅-----Android.mk 介绍
- Activity跳转生命周期变化
- 【Cocos2d-x源码分析】 Cocos2d-x内存管理解析
- Android NDK开发之HelloWorld
- Android之ListView分页获取网路数据(服务器端)(一)
- conn.getInputStream 显示为空指针
- Android沉浸式状态栏(二)
- Uncaught ReferenceError while loading asset file on android 4.4
- android之遍历所有文件夹和子目录搜索文件
- iOS中为导航栏的右上方添加各种按钮
- webview几种缩放总结
- Swift 设置navigationbar属性相关
- IOS_3DTouch实现
- 【微信开发】上传下载多媒体文件
- Scheme白名单问题(无法判断手机是否安装微信等)
- Swift中的Function
- iOS开发之Runloop(转)
- 微信红包
- 在学习过程中总结的LoaderManager的LoaderCallbacks刷新数据以使onLoadFinished回调方法能被执行的两种方式