0%

问题

1
2
3
$ npm -v

env: node: No such file or directory

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ brew uninstall --force node
$ brew uninstall --force npm

$ brew install node

$ brew link --overwrite node

$ npm install hexo-cli

npm ERR! code EACCES
npm ERR! syscall mkdir
npm ERR! path /Users/<user name>/.npm/_cacache/index-v5/a5/25
npm ERR! errno -13
npm ERR!
npm ERR! Your cache folder contains root-owned files, due to a bug in
npm ERR! previous versions of npm which has since been addressed.
npm ERR!
npm ERR! To permanently fix this problem, please run:
npm ERR! sudo chown -R 501:20 "/Users/<user name>/.npm"

npm ERR! A complete log of this run can be found in:
npm ERR! /Users/<user name>/.npm/_logs/<time stamp>-debug.log

$ chown -R 501:20 "/Users/<user name>/.npm"
阅读全文 »

相关背景

模糊测试是非常受欢迎的软件故障发现技术。基于覆盖率的模糊测试工具遇到的关键挑战是如何遍历程序的状态。一些模糊测试工具使用符号执行来解析路径约束,但是符号执行很慢且不能有效地解决多种约束。为了避免模糊测试额外计算量过高的问题,著名的 AFL 放弃了符号执行和任何其它重量级的程序分析技术。它触发程序以观察哪种输入可以发现新的分支状态,并保持这些输入作为之后输入变异的种子。AFL 在模糊测试程序时的额外消耗很低,但大多数变异出的输入都是无效输入(当不断变异却不能触发新状态的时候),因为 AFL 仅仅是盲目的随机变异输入而并没有利用程序的数据流信息。一类模糊测试工具优化 AFL 的方案是使用启发式算法来解决简单的预测问题,如“magic bytes”,但他们不能解决其它类型的路径约束。

主流基线:AFL

AFL 是目前广受欢迎的基于输入变异的灰盒模糊测试工具。AFL 在编译阶段进行轻量级插桩,在变异时使用遗传算法自动发现更可能触发新内部状态的测试用例。作为基于覆盖率的模糊测试器,AFL 通过遍历不同的程序路径触发程序错误。

分支覆盖率

AFL 路径由一系列分支定义。在每次运行过程中,AFL 对每个分支执行了多少次计数。$(I_{prev},I_{cur})$代表一个分支,$I_{prev}$代表分支执行前的基本块ID,$I_{cur}$代表分支语句执行后的基本块ID。AFL 通过轻量级的插桩获取路径信息,其插桩方式为编译时在每个分支点前后注入。每次运行,AFL 分配一个路径跟踪表来对每个分支执行的次数计数,跟踪表的索引是 $hash(I_{prev}, I_{cur})$。

AFL 也在每次运行记录外,保持全局分支覆盖表,每项包含一个 8 位的响亮,记录这个分支在每次运行中执行的次数。b 向量表征一个范围,$b_0 … b_7$ 分别对应着[1],[2],[3],[4,7],[8,15],[16,31],[32,127],[128,$\Inf$]。例如,$b_3$ 被置位,代表该分支被执行了 4 到 7 次。

AFL 通过比较路径追踪表和分支覆盖表,来确定新的输入是否触发了新的内部状态。其两个判定条件是:

  • 程序执行了新分支,即路径追踪表有一个表项,而分支覆盖表中没有
  • 存在一个分支,执行的次数和任何之前的执行轮次都不同,通过比较 b 向量来判定。

变异策略

阅读全文 »

上电前:BIOS chip / boot ROM

BIOS chip 是主板的芯片组的一块芯片,主要有两个值得关注的性质:首先,它(或其中一部分)内存映射到处理器的地址空间,使得处理器可以用和访问内存同样的方式访问 BIOS chip。CPU通过将指令指针指向 BIOS chip 中的代码,执行。其次,BIOS chip 存储了 CPU 上电后最先执行的指令。一个典型的 BIOS 包含 flash 描述符(BIOS chip 的内容表)、BIOS 区(被执行的第一条指令)、Intel ME(Management Engine)和以太网口。BIOS chip 在系统的多个部分间共享,而非在为 CPU 独占。

上电后

现代 Intel 芯片含有 Intel Management Engine。一旦上电,先启动 Intel ME。它执行自身的初始化:

  1. 读取 BIOS 的 flash 描述符,找到 Intel ME 区
  2. 读取代码并设置数据

按下电源键后,CPU 启动。在多核系统中,往往先启动一个 CPU(Bootstrap Processor a.k.a BSP)。刚启动时,CPU 进入 16-bit 实模式,指令指针指向 0xffff:0000(CS:IP的复位向量)。

0xf_fff0 作为 CPU 复位地址,指向 boot ROM 的 BIOS 区。BIOS 区中的固件被称为启动固件,例如 UEFI 实现,legacy 实现。

启动固件要做的第一件事是切换到保护模式,,开启分段并区分分段权限。然而启动固件仅包含一个段,被称为 flat mode。

早期初始化

在开始时,DRAM 还不可用。DRAM 初始化是启动固件的一个主要目标。但是在初始化 DRAM 前需要做些准备。

阅读全文 »

题目

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: [1,2,3,4,5,6,7] 和 k = 3

输出: [5,6,7,1,2,3,4]

解释:

向右旋转 1 步: [7,1,2,3,4,5,6]

向右旋转 2 步: [6,7,1,2,3,4,5]

向右旋转 3 步: [5,6,7,1,2,3,4]

示例 2:

输入: [-1,-100,3,99] 和 k = 2

输出: [3,99,-1,-100]

解释:

向右旋转 1 步: [99,-1,-100,3]

向右旋转 2 步: [3,99,-1,-100]

说明:

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
  • 要求使用空间复杂度为 O(1) 的 原地 算法。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

阅读全文 »