机缘
不知不觉已经在CSDN创作了6年,还记得写第一篇博客的时候,生怕写的不好误导别人,所以花了很长时间写了第一篇博客,当然内容很简单,但是也算是我的起点。从第一篇博客开始,我陆陆续续写了500+篇博客(截至目前),值得骄傲的是,这么多的博客全都是自己原创,记录了我在计算机这一领域学习的整个过程。未来,我将继续在这里记录自己的学习过程,也希望能结识更多志同道合的同学!
收获
写博客最大的收获就是通过帮助他人来获得正反馈,后台经常收到来自粉丝的留言,有的是咨询问题,有的是对我的博客表示肯定与赞赏,还有时看到大家收藏我的博客并点赞、留言和分享我的代码块,真的感觉自己的记录是有价值的!
日常
创作博客现在已经是我学习和工作中的一部分了,当我接触到一个新的事物的时候,会在本地形成一份初稿,再总结到CSDN形成终稿博客,整个博客都会经过我的“精雕细琢”,力求达到完美。
成就
虽然自己确实写过不少代码,但是我并不觉得自己写的代码是十分完美的,反而我会去阅读其他人的代码。比如之前在学习Syzkaller的时候,阅读其源码,学到了很多知识,感觉高手写的代码真的美观、优雅,值得我反复学习。比如下面这段代码:
var mutateDataFuncs = [...]func(r *randGen, data []byte, minLen, maxLen uint64) ([]byte, bool){// TODO(dvyukov): duplicate part of data.// Flip bit in byte.func(r *randGen, data []byte, minLen, maxLen uint64) ([]byte, bool) {if len(data) == 0 {return data, false}byt := r.Intn(len(data))bit := r.Intn(8)data[byt] ^= 1 << uint(bit)return data, true},// Insert random bytes.func(r *randGen, data []byte, minLen, maxLen uint64) ([]byte, bool) {if len(data) == 0 || uint64(len(data)) >= maxLen {return data, false}n := r.Intn(16) + 1if r := int(maxLen) - len(data); n > r {n = r}pos := r.Intn(len(data))for i := 0; i < n; i++ {data = append(data, 0)}copy(data[pos+n:], data[pos:])for i := 0; i < n; i++ {data[pos+i] = byte(r.Int31())}if uint64(len(data)) > maxLen || r.bin() {data = data[:len(data)-n] // preserve original length}return data, true},// Remove bytes.func(r *randGen, data []byte, minLen, maxLen uint64) ([]byte, bool) {if len(data) == 0 {return data, false}n := r.Intn(16) + 1if n > len(data) {n = len(data)}pos := 0if n < len(data) {pos = r.Intn(len(data) - n)}copy(data[pos:], data[pos+n:])data = data[:len(data)-n]if uint64(len(data)) < minLen || r.bin() {for i := 0; i < n; i++ {data = append(data, 0) // preserve original length}}return data, true},// Append a bunch of bytes.func(r *randGen, data []byte, minLen, maxLen uint64) ([]byte, bool) {if uint64(len(data)) >= maxLen {return data, false}const max = 256n := max - r.biasedRand(max, 10)if r := int(maxLen) - len(data); n > r {n = r}for i := 0; i < n; i++ {data = append(data, byte(r.rand(256)))}return data, true},// Replace int8/int16/int32/int64 with a random value.func(r *randGen, data []byte, minLen, maxLen uint64) ([]byte, bool) {width := 1 << uint(r.Intn(4))if len(data) < width {return data, false}i := r.Intn(len(data) - width + 1)storeInt(data[i:], r.Uint64(), width)return data, true},// Add/subtract from an int8/int16/int32/int64.func(r *randGen, data []byte, minLen, maxLen uint64) ([]byte, bool) {width := 1 << uint(r.Intn(4))if len(data) < width {return data, false}i := r.Intn(len(data) - width + 1)v := loadInt(data[i:], width)delta := r.rand(2*maxDelta+1) - maxDeltaif delta == 0 {delta = 1}if r.oneOf(10) {v = swapInt(v, width)v += deltav = swapInt(v, width)} else {v += delta}storeInt(data[i:], v, width)return data, true},// Set int8/int16/int32/int64 to an interesting value.func(r *randGen, data []byte, minLen, maxLen uint64) ([]byte, bool) {width := 1 << uint(r.Intn(4))if len(data) < width {return data, false}i := r.Intn(len(data) - width + 1)value := r.randInt64()if r.oneOf(10) {value = swap64(value)}storeInt(data[i:], value, width)return data, true},
}
这段代码是Syzkaller中一组用于对数据进行变异的函数列表。每个函数接受一个随机数生成器r
、一个字节切片data
、最小长度minLen
和最大长度maxLen
作为输入,并返回一个修改后的字节切片以及一个布尔值,表示是否应该停止变异。具体来说,这些变异函数包括:
- 翻转字节中的一个比特。
- 插入随机字节。
- 移除字节。
- 添加一些字节。
- 用随机值替换int8类型、int16类型、int32类型或int64类型的值。
- 对int8类型、int16类型、int32类型或int64类型的值进行增减操作。
- 将int8类型、int16类型、int32类型或int64类型的值设置为一个有趣的值。
憧憬
十年饮冰,难凉热血。