版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
静态扫描方法第一页,共三十页,2022年,8月28日控制流与数据流扫描规则
举例静态扫描法第二页,共三十页,2022年,8月28日控制流与数据流有向图DD图基本路径树数据流第三页,共三十页,2022年,8月28日有向图G=(V,E),V是顶点的集合,E是有向边(简称边)的集合。e=(T(e),H(e))E是一对有序的邻接节点,T(e)是尾,H(e)是头。如果H(e)=T(e'),则e和e'是临界边。H(e)是T(e)的后继节点,T(e)是H(e)的前驱节点,indergee(n)和outdegree(n)分别是结点n的入度和出度。
e1e2e3e4e5e6e7e8e9n0n1n2n3n4n6n7第四页,共三十页,2022年,8月28日DD图:G=(V,E)有两个区分的边e0和ek(唯一进入的边和唯一离开的边),e0可以到达E的任何一个边,E的任何一个边都可以到达ek,对任何nV,nT(e0),nH(ek),indegree(n)+outdegree(n)>2indegree(T(e0))=0,outdegree(T(e0))=1,indegree(H(ek))=1,outdegree(H(ek))=0。
e0e1e2e3e4e5e6e7e8e9e10n0n1n2n3n4n6n7DD图路径、完整路径、可达、简单路径、基本路径第五页,共三十页,2022年,8月28日floata,b,c,x1,x2,mid;scanf(“%f%,f%,f”,&a,&b,&c);if(a!=0){mid=b*b-4*a*c;if(mid>0){x1=(-b+sqrt(mid))/(2*a);x2=(-b-sqrt(mid))/(2*a);printf(“tworealroots\n”);}elseif(mid==0){x1=-b/2*a;printf(“onerealroot\n”);}else{x1=-b/(2*a);x2=sqrt(-mid)/(2*a))printf(“twocomplexroots\n”);
}
prinf(“x1=%f,x2=%f\n”,x1,x2);}else
prinf(“invalid”);Main(){}e0e1e2e3e4e5e6e7n0n1n2n3
e0e1e2e3e4e5e6第六页,共三十页,2022年,8月28日e0e6e1e7e2e3e4e5e7e5e7e5e7基本路径树第七页,共三十页,2022年,8月28日变量的定义性出现:若一个变量在程序中的某处出现,使数据与该变量相绑定,则称该出现是定义性出现。变量的引用性出现:若一个变量在程序中的某处出现,使与该变量相绑定的数据被引用,则称该出现是引用性出现。引用一般有两种用途,一是用于计算新的数据或为输出结果、或为中间计算结果,另一个用途是用于计算判断控制转移方向的谓词。数据流main(){intx,y;scanf(“%d%d”,&x,&y);while(x>0&&y>0){if(x>y)x=x-y;elsey=y-x}printf(“%d\n”,x+y);}第八页,共三十页,2022年,8月28日代码扫描规则内存使用故障变量使用故障资源使用故障数据类型使用故障
第九页,共三十页,2022年,8月28日内存是否没有被正确地初始化却被使用1)
扫描所有控制路径中局部指针变量的定义使用链,检查指针变量在引用前是否初始化。2)
扫描所有控制路径中指针参数变量的定义使用链,如果出现变量在引用前没有初始化,则查找所有包含函数调用的控制路径,扫描其中指针变量对应的定义使用链,检查变量在引用前是否初始化。3)
扫描所有控制路径中全局指针变量的定义使用链,如果变量在引用前没有初始化,则查找所有包含全局指针变量的控制路径,扫描全局指针变量的定义使用链,检查变量在引用前是否初始化。内存使用故障第十页,共三十页,2022年,8月28日是否内存被释放后却继续被使用
1)
扫描所有控制路径中局部指针变量的定义使用链,检查指针变量在引用前是否已经释放。2)
扫描所有控制路径中指针参数变量的定义使用链,如果没有出现变量在引用前已经释放,则查找所有包含函数调用的控制路径,扫描其中指针变量对应的定义使用链,检查变量在引用前是否已经释放。3)
扫描所有控制路径中全局指针变量的定义使用链,如果没有出现变量在引用前已经释放,则查找所有包含全局指针变量的控制路径,扫描全局指针变量的定义使用链,检查该变量在引用前是否已经释放。内存使用故障第十一页,共三十页,2022年,8月28日是否存在内存泄漏
1)
扫描所有控制路径中指针变量的定义使用链,如果变量指向的内存在成功分配后没有释放,但是在指针的定义使用链中包含对指针的函数引用,则继续检查调用该变量的函数中的所有控制路径是否释放内存。2)
扫描所有控制路径中指针变量的定义使用链,如果变量指向的内存在成功分配后没有释放,但是在指针的定义使用链中包含对指针的返回引用,则继续检查包含返回变量的所有控制路径是否释放内存。3)扫描所有控制路径中指针变量的定义使用链,如果变量指向的内存在成功分配后没有释放,但是在指针的定义使用链中包含对指针的赋值引用,则继续检查包含被赋值变量的所有控制路径是否释放内存。
内存使用故障第十二页,共三十页,2022年,8月28日内存是否越界
1)
扫描局部指针变量的定义使用链,检查所有引用的内存空间是否超过给指针分配的内存空间。2)
扫描参数指针变量的定义使用链,检查所有引用的内存空间是否超过给指针分配的内存空间。3)扫描全局指针变量的定义使用链,检查所有引用的内存空间是否超过给指针分配的内存空间。
内存使用故障第十三页,共三十页,2022年,8月28日变量是否初始化
1)
扫描所有控制路径中局部变量的定义使用链,检查变量在引用前是否定义。2)
扫描所有控制路径中参数变量的定义使用链,如果变量在引用前没有定义,则查找所有包含函数调用的控制路径,扫描其中参数变量对应的定义使用链,检查变量在引用前是否定义。3)扫描所有控制路径中全局变量的定义使用链,如果变量在引用前没有定义,则查找所有包含全局变量的控制路径,扫描其中全局变量的定义使用链,检查全局变量在引用前是否定义。
变量使用故障第十四页,共三十页,2022年,8月28日变量的值是否可能导致异常1)
扫描所有控制路径中局部变量的定义使用链,检查变量的值是否会导致系统出现异常。2)
扫描参数变量对应的定义使用链,检查变量的值是否会导致系统出现异常。3)扫描所有控制路径中全局变量的定义使用链,检查全局变量的值是否会导致系统出现异常。变量使用故障第十五页,共三十页,2022年,8月28日变量是否发生上溢或下溢
1)
扫描局部数组变量的定义使用链,检查所有的引用位置是否出现上溢或下溢。2)
如果函数的参数变量是数组,扫描参数变量的定义使用链,检查所有的引用位置是否出现上溢或下溢。3)如果全局变量是数组,扫描全局变量在当前函数中的定义使用链,检查所有的引用位置是否出现上溢或下溢。
变量使用故障第十六页,共三十页,2022年,8月28日是否对不存在的或者错误的资源进行操作
1)
扫描所有控制路径中资源变量的定义使用链,检查在引用前是否判断变量的有效性。2)
如果全局变量使用了外部资源,则扫描所有包含全局变量的控制路径,检查在引用前是否判断变量的有效性。3)
如果参数变量使用了外部资源,并且在一条控制路径中在引用前没有判断其有效性,则扫描所有包含参数变量的控制路径,检查在引用前是否判断变量的有效性。资源使用故障第十七页,共三十页,2022年,8月28日是否正确地释放资源
1)
扫描所有控制路径中资源变量的定义使用链,如果变量指向的资源在使用后没有释放,但是在变量的定义使用链中包含对变量的函数引用,则继续检查调用该变量的函数中的所有控制路径是否释放资源。2)
扫描所有控制路径中资源变量的定义使用链,如果变量指向的资源在使用后没有释放,但是在变量的定义使用链中包含对变量的返回引用,则继续检查包含返回变量的所有控制路径是否释放资源。3)扫描所有控制路径中资源变量的定义使用链,如果变量指向的资源在使用后没有释放,但是在变量的定义使用链中包含对变量的赋值引用,则继续检查包含被赋值变量的所有控制路径是否释放资源。
资源使用故障第十八页,共三十页,2022年,8月28日变量的数据类型是否有错误
1)
扫描局部变量的定义使用链,当定义局部变量时,检查数据类型是否与局部变量声明的一致。2)
扫描局部变量的定义使用链,当对局部变量引用(赋值操作)时,检查被赋值变量类型是否与局部变量一致。3)扫描局部变量的定义使用链,当对局部变量引用(比较操作)时,检查被比较变量类型是否与局部变量一致。
数据类型故障第十九页,共三十页,2022年,8月28日是否存在不同数据类型的赋值
1)
扫描参数变量的定义使用链,当定义参数变量时,检查数据类型是否与参数变量声明的一致。2)
扫描参数变量的定义使用链,当对参数变量引用(赋值操作)时,检查被赋值变量类型是否与参数变量一致。3)扫描参数变量的定义使用链,当对参数变量引用(比较操作)时,检查被比较变量类型是否与参数变量一致。
数据类型故障第二十页,共三十页,2022年,8月28日是否存在不同数据类型的比较
1)
扫描全局变量在当前函数中的定义使用链,当定义全局变量时,检查数据类型是否与全局变量声明的一致。2)
扫描全局变量在当前函数中的定义使用链,当对全局变量引用(赋值操作)时,检查被赋值变量类型是否与全局变量一致。3)扫描全局变量在当前函数中的定义使用链,当对全局变量引用(比较操作)时,检查被比较变量类型是否与全局变量一致。
数据类型故障第二十一页,共三十页,2022年,8月28日intmain(){ floata=1.0; floatb=2.0;
… if((a*2–b)==0.0) { return1; } return0;}第二十二页,共三十页,2022年,8月28日voidmain(){ inta=0,b=0;
… switch(a) { case0: b=-1; case1: b=b/a;break; }
…}
第二十三页,共三十页,2022年,8月28日intmain(){ intsum,i; for(i=1;i<30000;i++) { sum=sum+i; } return0;}第二十四页,共三十页,2022年,8月28日voidfunc(){ floata=72.0; floatb=55.0; longresult=0; result=(long)(a*b);return1;}第二十五页,共三十页,2022年,8月28日intfunc(){ charc1=0; c1=145; if(c1>300) { return3; }
if(c1>25) { return2; } return1;}
第二十六页,共三十页,2022年,8月28日voidfunc(){ inti=0;
… for(i=0;i<10;i++) { if(i==5) { break; } }
…return;}第二十七页,共三十页,2022年,8月28日intfoo103(){ int*pi=0; char*pc=0; if(pc==pi) {
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 促销礼品购买合同
- 汽车配件采购合同案例
- 保险代理服务合同协议
- 购房合同范例格式
- 稻谷购销合同格式
- 假期校园守护合同
- 投诉房市买卖合同纠纷
- 标准房屋买卖合同空表
- 电子产品维修服务合同模板
- 电子信息行业智能化电子产品与解决方案
- 2024年独家:国际商标授权使用合同
- 辽宁省部分高中2023-2024学年高二上学期期末考试 物理 含解析
- GB/T 45090-2024塑料再生塑料的标识和标志
- 《工厂垃圾分类》课件
- 6.1 认识经济全球化 课件-高中政治统编版选择性必修一当代国际政治与经济-2
- 2024年《档案工作实务》考试复习题库400题(含答案)
- 2025年1月“八省联考”考前猜想卷历史试题01 含解析
- 眼科练习卷含答案
- 山东省淄博市2023-2024学年高二上学期期末教学质量检测试题 数学 含解析
- 专题23 殖民地人民的反抗与资本主义制度的扩展(练习)
- 大学美育智慧树知到期末考试答案章节答案2024年宁波大学
评论
0/150
提交评论