(五)过程间分析
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 之前我们所有的分析都是没有函数调用的,也就是之前考虑的情况都是「过程内」的调用。本章将会考虑函数调用,开始「过程间」分析(Whole Program Analysis 或者 Link-time Analysis)的学习。 基本思路 每个过程内分析对应一个抽象域,然后函数调用时,每个函数都是新的过程内分析。那么,只要考虑两个过程内分析的衔接即可。例如对下面的程序,在函数 A 内调用函数 B 时,其实就是过程间分析,调用和返回时对节点进行转换即可。 1234567891011int B(x,y){ z = x+y; return z;}int A(){ int a = 10; int b = 20; int c = B(a,b); return...
(四)静态单赋值和稀疏分析
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 简介 这一章是对数据流分析的拓展和补充,基本内容如下: 首先从 Def-Use...
(三)Datalog和程序分析
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 前言 笔者在学习 Datalog 之前,已经学习过数据流分析,也学习过一门函数式编程语言,所以能够较为快速地接受新概念。如果读者觉得有些概念比较难以理解,可以搜索关键词学习。 文章引用部分较多中英夹杂,因为没有必要花时间翻译了,我只是在末尾简要用中文提炼我认为的重点,帮助读者理解。笔者没有刻意中英夹杂的意思,提高英文能力对深入最先进的或者较为小领域的知识,是非常重要的。 笔者并没有很扎实的数理逻辑知识,只学过本科计算机专业课离散数学,所以部分概念理解可能不准确。笔者也只是刚入门程序分析,并没有形成整个领域的系统认识,也不了解术语规定。如果发现有任何错误,请不吝斧正。 稳定翻译这篇更加全一些:《Datalog 引擎 Soufflé 指南》 预备知识 逻辑式语言 在之前我们完成了函数式编程 Haskell 的学习之后,开始接触逻辑式编程语言。直接看 wiki...
(二)数据流分析基础
(一)初识软件分析(二)数据流分析基础(三)Datalog和程序分析(四)静态单赋值和稀疏分析(五)过程间分析(六)指向分析(七)抽象解释(八)SMT和符号执行(九)体验静态分析工具(十)Fuzzing 基础 数据流分析 基本思想:程序视作状态和状态的转移两部分组成,忽视状态转移的条件,分析状态转移时的变化。 近似的两种方案: 忽略程序的条件判断,认为程序的所有分支都有可能到达。 **控制流分叉合并。**这会大大的减少计算量。 这些性质在后面会解释。 符号分析 思想:对变量进行抽象,分析输入的符号和输出的符号,得到抽象的结果。在此基础上可自定义分类和类似地拓展,用更加抽象和概括的符号。例如,对于整数类型,我们可以分成零、正、负、未知四种输入和结果,而不考虑具体的数值。 按照状态转移,我们可能有多条执行路径能够到达目的点 A。例如,if 语句是典型的区分执行路径的的方式。由于未知结果的函数 func1 和 func2,a 最终的符号可能是正、负或者未知。那么,我们可以得到 2 条可能的执行路径(0、5、1、未知)或者执行路径(0、-1、1、...
geth源码学习——介绍
交易的签名理解收据receipt理解区块理解交易blockchain核心布隆过滤器原理forkId 解读oracle 原理和实现交易池分析TxList 解读MPT树区块同步geth源码学习——介绍How Geth starts its server 项目地址:https://github.com/learnerLj/geth-analyze 环境准备 为了方便修改源码后进行调试,建议在 Linux 系统运行,阅读源码时用主机系统可能相对方便。 安装虚拟机:建议 Ubuntu20.04,具体安装教程可见其他教程。希望读者有一定的 Linux 基础,熟悉常用命令,理解 Linux 配置文件的思想,会阅读命令行提示信息。安装好虚拟机后可设置代理(学习区块链必须要学会设置代理),自行寻找教程。 准备环境:安装 nodejs、npm、goland、typora、中文输入法(可以用百度输入法)、vscode、goland、git,新手自行寻找教程,很容易找到。 建议使用 godoc,然后输入命令 godoc --http...
乘法逆元
C语言基础乘法逆元信息安全算法基础操作系统基础x86汇编基础信息论与编码 辗转相除法 先温习辗转相除法和裴蜀等式: {ax+by=gcd(a,b)(b mod a)x+ay = gcd(a,b)(a mod(b mod a))x+(b mod a)y = gcd(a,b)((b mod a) mod(a mod(b mod a)))x+(a mod(b mod a))y=gcd(a,b)\begin{cases} ax+by=\mathrm{gcd}\left( a,b \right)\\ \left( b\,\,\mathrm{mod}\ a \right) x+ay\,\,=\,\,\mathrm{gcd}\left( a,b \right)\\ \left( a\,\,\mathrm{mod} \left( b\,\,\mathrm{mod} \ a \right) \right) x+\left( b\,\,\mathrm{mod}\ a \right) y\,\,=\,\,\mathrm{gcd}\left( a,b...
Haskell(二)函数式编程
Haskell(一)入门Haskell(二)函数式编程Haskell(三) MonadHaskell(四)总结和工具链Haskell(五) 总结和展望Haskell(六) Project Euler 练习1-26 首先,我们需要将自己的编程观念从命令式语言转换到函数式语言上面来。这样做的原因并不是因为命令式语言不好,而是因为比起命令式语言,函数式语言更胜一筹。 基本用法 先看一些简单的程序,了解基本用法。 斐波那契数列: 1fab n = if n==1||n==2 then 1 else fab (n-1) + fab (n-2) 也可以利用模式匹配写成下面的样子,这个类似于分支语句,叫做 Guards 1fab n | n==1||n==2 =1 | n>2 = (fab (n-1) + fab (n-2)) 在 Haskell 中,| 被用于定义函数的多重条件分支。它可以用来在函数定义中指定多个条件,并根据不同的条件执行不同的代码。它的基本语法形式如下: 12345functionName pattern1 | condition1 = codeBlock1 ...
Haskell(一)入门
Haskell(一)入门Haskell(二)函数式编程Haskell(三) MonadHaskell(四)总结和工具链Haskell(五) 总结和展望Haskell(六) Project Euler 练习1-26 前言 这个系列主要介绍典型的函数式程序设计语言(Functional programming languages,FP)和逻辑式程序设计语言(Logic programming languages,LP),将会分别以 Haskell 和 datalog(主要是 souffle)作为例子,简单的入门和理解。 理解典型的 FP 对于深入学习程序设计语言挺好处的。我们先从 haskell 开始 参考资料: haskell 官网 Haskell 趣学指南,英文原版也很不错。 快速查阅库文档 最推荐的查阅手册,能够直接点击 Quick Jump 搜索关键词,这也是我最常用的文档 官方 WiKi如果有不懂的术语,那么很推荐先在 wiki 上查找。 可以参考的入门课程 资源汇总 交流学习群、交流学习群...
区块同步
交易的签名理解收据receipt理解区块理解交易blockchain核心布隆过滤器原理forkId 解读oracle 原理和实现交易池分析TxList 解读MPT树区块同步geth源码学习——介绍How Geth starts its server 博主的朋友写的 看到core\blockchain.go的时候大量涉及该部分知识,故在此参考大佬博客加之自己的理解先行总结 本文仅仅是简单总结了一下文件结构和重要函数功能,详细函数分析请参考downloader 同步 文件结构 downloader 模块的代码位于 eth/downloader 目录下。主要的功能代码分别是: downloader.go :实现了区块同步逻辑 peer.go :对区块各个阶段的组装,下面的各个FetchXXX 就是很依赖这个模块。 queue.go :对eth/peer.go的封装 statesync.go :同步state对象 注意: downloader是一个下载器,从远程网络节点中获取 hashes 和...
MPT树
交易的签名理解收据receipt理解区块理解交易blockchain核心布隆过滤器原理forkId 解读oracle 原理和实现交易池分析TxList 解读MPT树区块同步geth源码学习——介绍How Geth starts its server 由于MPT 树不属于core部分所以有些地方并没有详细的解读,仅供参考。 由于该部分网上的解读都差异不大,故该文章大部分是进行整合,并且加上个人阅读源码的一些看法,所有图片都已经上传到个人仓库。 感谢前辈的精湛分析! 前缀树 Trie 前缀树(又称字典树),通常来说,一个前缀树是用来存储字符串的。前缀树的每一个节点代表一个字符串(前缀)。每一个节点会有多个子节点,通往不同子节点的路径上有着不同的字符。子节点代表的字符串是由节点本身的原始字符串,以及通往该子节点路径上所有的字符组成的。如下图所示: Trie 的结点看上去是这样子的: [ [Ia, Ib, … I*], value] 其中 [Ia, Ib, ... I*] 在本文中我们将其称为结点的 索引数组 ,它以 key...