CodeSaw


  • Home

  • Archives

  • Categories

  • Tags

  • Algorithm

  • About

  • Search

NJU静态程序分析(4-Taint-Analysis)

Posted on 2021-06-02 | In Java
Words count in article 2.2k | Reading time 8

Abstract

同符号执行一样,Taint-Analysis也是分析代码安全漏洞,检测攻击方式的重要手段。对于Web应用程序中存在着的大量安全漏洞,如跨站脚本攻击,SQL注入等~污点分析都可以进行有效地检测。而污点传播技术是当前Taint-Analysis领域的重要课题,通过和静态程序分析技术相结合,在不运行代码且不修改代码的前提下通过分析程序变量之间的相互依赖关系以此获得更高效,更精确的分析结果。

Taint analysis tracks how tainted data flow through the program and observes if they can flow to locations of interest(call sinks).

比如通过利用静态指针分析算法完成简化的显式流explicit flow分析,不讨论路径爆炸和其他动态漏洞分析技术。

Read more »

NJU静态程序分析(3-Pointer-Analysis)

Posted on 2021-05-13 | In Java
Words count in article 7k | Reading time 28

Abstract

过程间分析需要基于程序的Call Graph来完成。由于CHA Analysis过度追求速度造成误报——而false positive对于常量传播这样的must分析来说是不可接受的。因此指针分析在POPL'1980被第一次提出Interprocedural Data Flow Analysis in the Presence of Pointers, Procedure Variables, and Label Variables。

Pointer Analysis computes an over-approximation of the set of which memory-locations(objects) a pointer can point to.

指针分析除了可以构建Call Graph等程序基本信息之外,还可以用于编译优化,程序鲁棒性和安全等各个领域,是最基础的静态分析算法之一——比如流行的别名分析Alias Analysis就是从指针分析中派生出来的:Alias information can be derived from points-to relations.在指针分析的输出指向关系中是否有两个指针可以指向同一个对象。

Read more »

NJU静态程序分析(2-CHA-Analysis)

Posted on 2021-05-10 | In Java
Words count in article 2.2k | Reading time 9

Abstract

根据safe-approximation,过程内数据流分析Intraprocedural对所有的函数调用method call做出过度保守的假设——即所有分析结果必须safe,而根据Lattice理论这种处理会使must和may分析都变的less precise。所以引入过程间数据流分析Interprocedural Analysis,通过Call Graph来实现过程间的数据流传递,从而进一步提高分析的精度。因此如何构造这些call-graph就是过程间分析的关键环节。

For Better precision, we need Interprocedural Analysis:propagate data-flow information along interprocedural control-flow edges i.e., call and return edges

Class hierarchy analysis是用来构造Call Graph的一种经典方法——也是过程间分析的基础。

Read more »

NJU静态程序分析(1-Data Flow Analysis)

Posted on 2021-05-03 | In Java
Words count in article 7.2k | Reading time 29

Abstract

编译器中大部分机器无关的全局优化是基于Data-flow Analysis实现的。数据流分析技术从代码中收集程序语义相关的信息,是程序分析的基础。

In each data-flow analysis application, we associate with every program point a data-flow value that represents an abstraction of the set of all possible program states that can be observed for that point.

在工业界的主流编译器中,C系的LLVM,Java系的HotSpot都是基于SSA做数据流分析而不是传统的lattice。南大这节课中是基于Lattice来讲解过程内Intra-procedural,无别名no aliases的经典数据流分析框架。

Read more »

NJU静态程序分析(0-Introduction)

Posted on 2021-05-01 | In Java
Words count in article 1.2k | Reading time 4

Abstract

编译器作为工业界对PL理论的部分实现——和编程语言,运行时环境一样只是机器解释世界的一个角度。而当我解锁了从更加PL的方式看待计算这件事情之后,又打开了一扇通往新世界的大门。过去的几十年里Programming Language的内核并没有变化多少——但是程序本身却随着应用需求变的更加庞大和复杂。而静态程序分析作为PL的重要应用,其目的就在于在编译期确保程序的可靠性,安全性等各种性质。

​ Static Analysis analyzes a program P to reasono about its behaviors and determines whether it satisfies some properties before running P.

​ 主要的学习资源是NJU-PASCAL团队的静态分析课程以及龙书和鲸书中的部分章节。

Read more »

函数式编程(Ocaml)

Posted on 2021-04-18 | In Ocaml
Words count in article 1.9k | Reading time 8

Abstract

最近在实验室实习的过程中学到了很多有意思的东西,对Programming Languages也有了更深的了解,Ocaml是一门支持多范式的函数式编程语言。程序描述计算,但是又不仅仅是计算。Ocaml的学习带给我的不仅仅是语言本身,这个系列记录了其中的部分心得:

  • 关于scripting/imperative/object-oriented/functional PL的基本概念
    • Higher-order Functions
    • State-Full vs State-Free Computation
    • Modelling Objects and Closures
    • Exceptions/Continuations to Defer Control
    • Polymorphism
    • Partial Evaluation/Lazy Programming/Modules
  • 关于reason about programs的方法
    • Type Checking
    • Induction
    • Operational Semantics
    • QuickCheck
  • 关于设计一门语言的基本规则
Read more »

Lisp语言和Emacs

Posted on 2021-02-16 | In Lisp
Words count in article 125 | Reading time 1

Abstract

​ 第一次接触EMACS是大二的时候,当时只顾着新奇的界面和强大的功能却忽视了其背后真正的理论。后来我写代码也一直不喜欢IDE这种东西,但现在回过头来看,这貌似也只是一种浮于表面而无关原理的执拗。

​ 这次重新回归到Spacemacs,我希望仔细从Lisp的角度理解这款编辑器,不管是其插件特性还是语言本身。

Read more »

WebAssembly和Wabt

Posted on 2020-11-12 | In JavaScript
Words count in article 937 | Reading time 3

Abstract

最近参加deeplang的的过程中,接触到了一些编译领域的新技术,总结一下希望有时间了可以进一步的深入了解。参考资料是WebAssembly标准入门。

Read more »

LLVM漫谈(2-Implementing a Language)

Posted on 2020-07-06 | In C++
Words count in article 185 | Reading time 1

Abstract

基于LLVM实现简单的编程语言kaleidoscope,来源于LLVM9.0.0 tutorial。

LLVM的官方文档还是很不错的,阅读完其中的tutorials就能大致上手LLVM了。实现的代码对C++11要求比较高,我放在了Github上。

实现共分为10部分:

  • 实现词法分析器Lexer
  • 使用递归下降和运算符优先级解析实现语法分析器Parser
  • 将AST转化成LLVM-IR
  • 添加JIT即时编译和优化器的支持
  • 扩展——控制流,这一章会引入SSA概念
  • 扩展——用户定义运算符
  • 扩展——自动变量,深入SSA
  • 目标代码生成
  • 扩展——添加调试器
  • 深入——GC,异常等
Read more »

LLVM漫谈(1-LLVM编译框架)

Posted on 2020-06-25 | In C++
Words count in article 1.8k | Reading time 7

Abstract

LLVM,这个星球最牛逼的编译器。

其核心设计理念就是统一的底层中间表达以及模块化的软件工程化方法。LLVM采用了前端-优化器-后端的组织形式,只是不同的前端和后端都采用统一的底层中间表示格式(LLVM IR)来最大可能复用优化器的代码。

在Chris Lattner将其开源后,LLVM逐渐发展成为了成熟的编译框架,具有大量库和编译链工具。

我使用的平台是macOS Mojave 10.14,在编译的时候要注意版本是否兼容。

一般系统会通过打印二进制文件名称和无法加载的动态库的名称来发现链接错误。当屏幕上打印动态库名称时要予以注意,这说明系统动态链接器和加载器无法加载该库,因为该程序与当前系统不兼容。

我编译LLVM 10.0.0的时候出错如下:

后来发现这个版本的Xcode工具链最高只支持LLVM 9.0.0版本,然后换了版本最后编译成功。

Read more »
1234
HaotianMichael

HaotianMichael

Under The Hood

33 posts
11 categories
25 tags
RSS
GitHub Cnblogs Zhihu
HaotianMichael © 2023