stanford cs110l lec1
1.1 gets函数与栈帧
- gets函数不安全
- 启动gdb
rip
寄存器存放的是下一条指令要执行的地址,rbp寄存中
1.1 内存安全问题与解决方式
- gets函数在栈区留有的buffer,存在数据越界的问题,即使是专业的工程师也会出现类似的问题。
如何找到或者避免类似的安全问题?
- 动态分析,也就是测试程序,但是难以保证测试到全部的边界情况
- 静态分析,数学上可以证明,难以发现所有问题
- 写出不一样的代码,也就是创造一些框架与习惯,使得错误出现的机率大大降低。这就是rust的设计哲学,虽然这可能会增加学习rust的学习成本
- 沙盒,承认这些错误会发生,但是将后果最小化,比如将程序放在浏览器中运行
课程主要内容
- 用rust编程
- 如何找到或者避免C/C++中的错误
- Rust的类型系统如何避免常见的内存安全问题
- 如何建造好的代码
- 避免多线程陷阱
- 避免多处理器陷阱
- 付诸实践,实现一个网络系统
1.2 GC
- GC的坏处
- 消耗资源,不论gc如何优化,总是要有不小的内存开销
- 破坏性,一般GC需要停下当前的程序
- 非确定性,无法知晓下一次GC的时机
- 阻止了手动优化,有些时候你需要使得你将使用的数据,实现高缓存性能。但是这个时候GC会按照一般的处理,回收相关内存。
- 不只是性能问题,GC并没有完全隔绝race condition,内存安全问题仍然存在