P16
2021-05-05 12:16:10 2 举报
AI智能生成
南大软件分析P16
作者其他创作
大纲/内容
Soundness and Soundiness
Soundness
保守近似:
分析会捕获所有程序行为,
或,分析结果为程序的所有可能执行建模。
分析会捕获所有程序行为,
或,分析结果为程序的所有可能执行建模。
我们可以对实际程序进行完全合理的分析吗?
学术界
几乎所有已发布的全程序分析都不适用于实际的编程语言。
工业界
几乎所有现实的全程序静态分析工具(例如,错误检测,安全分析等)都必须做出unsound choices。
Hard Language Features for Static Analysis
//静态分析难以分析的语言特征
//静态分析难以分析的语言特征
Java
Reflection(反射), native code(本机代码), dynamic class loading(动态类加载), etc.
JavaScript
eval, document object model (DOM)(文档对象模型), etc.
C/C++
Pointer arithmetic(指针算术), function pointers(函数指针), etc.
Hard-to-analyze features
难以分析的特征:对这些特征采取激进的保守处理可能会使分析过于不精确而无法扩展,从而使分析无用。
对这些特征采取激进的保守处理造成的结果
一般来说,
声称的sound的静态分析,
在实施过程中拥有完善的核心。
也就是说,大多数语言功能都过于近似,
而一些特定的 and/or 困难的被低估了。
声称的sound的静态分析,
在实施过程中拥有完善的核心。
也就是说,大多数语言功能都过于近似,
而一些特定的 and/or 困难的被低估了。
难以分析的语言特征的处理,
通常被省略,
或仅在论文的某些实施/评估部分中以随意的态度被提及。
通常被省略,
或仅在论文的某些实施/评估部分中以随意的态度被提及。
无法正确处理某些难以分析的语言特征(例如Java反射)可能会对分析结果产生深远影响。
然后声称论文的合理性可能会误导读者
对于非专家,他们可能会错误地得出结论,认为分析是正确的并且自信地依赖于分析结果。
对于专家来说,他们仍然很难解释分析结果(分析的sound,速度,精确度如何),而又没有明确说明他们如何对待那些重要且难懂的语言特征。
Soundiness
真相(Truthiness):某人的“真相(truth)” 在没有任何事实或证据的情况下,凭直觉相信自己是真实的.
良好的(soundy)分析通常意味着该分析大部分是正确的(sound),
并且针对困难的/特定的(hard/specific)语言特征具有公认的(well-identified)不正确(unsound)处理。
并且针对困难的/特定的(hard/specific)语言特征具有公认的(well-identified)不正确(unsound)处理。
Soundness, Soundiness and Unsoundness
sound
正确的(sound)分析需要捕获所有动态行为。
soundy
合理的(soundy)分析旨在捕获具有某些分析困难的语言特征的所有动态行为,这些特征在合理的范围内被不合理地(unsoundly)处理。
unsound
不合理的(unsound)分析故意忽略其设计中的某些行为,以提高效率,精度或可访问性。
Hard Language Feature: Java Reflection
Java静态分析臭名昭著的特征
公开的难题
“反射使静态分析变得困难。”[1]
“面向对象代码的静态分析是一个令人兴奋,持续且具有挑战性的研究领域,动态语言功能(也称为反射)尤其具有挑战性。”[2]
“反射的使用……很难将指向分析扩展到现代Java程序。”[3]
“根据我们的经验[4],分析Android应用程序的最大挑战是对反射的使用。”[5]
Java Reflection
为什么我们需要分析Java反射
如何分析Java反射?
String Constant analysis + Pointer Analysis
//字符串常量分析+指向分析
//字符串常量分析+指向分析
//Java的反射分析
问题:如果字符串值静态未知,则无法解析反射目标。
//配置文件、互联网、命令行、复杂的字符串操作、动态生成、加密
//配置文件、互联网、命令行、复杂的字符串操作、动态生成、加密
Type Inference + String analysis + Pointer Analysis
//类型推断+字符串分析+指向分析
//类型推断+字符串分析+指向分析
//Java的自推论反射解决方案
当字符串参数不能静态解析时,请在其使用点(usage points)推断反射目标!
//第175行的反射目标方法必须具有一个参数,并且其声明的类型必须为FrameworkCommandInterpreter或其子/超类型。
//推断出50种反射目标方法和48种方法是正确的!
//推断出50种反射目标方法和48种方法是正确的!
//理解和分析Java反射
Assisted by Dynamic Analysis
//动态分析辅助
//动态分析辅助
//驯服反射:在存在反射和自定义类加载器的情况下帮助进行静态分析
Hard-to-analyze features
难以分析的特征:对这些特征采取激进的保守处理可能会使分析过于不精确而无法扩展,从而使分析无用。
Hard Language Feature: Native Code
What Happens When Print in Java?
Java Native Interface (JNI)//Java本机接口(JNI)
What is JNI?
//JVM的功能模块,允许Java和本机代码(C / C ++)之间进行互操作。
Why we need JNI?
需要平台相关的功能(与操作系统互操作)
重用现有的库(主要是用C / C ++编写)
Why Native Code is Hard to Analyze?
How to Handle Native Code?
目前的做法
手动建模关键本机代码
本机代码建模(示例)
Recent work
//通过二进制扫描识别本机代码中的Java调用
0 条评论
下一页