【习惯养成】
1. 养成有目的的阅读高质量代码的习惯,学习新的模式、编程风格、或者实现某些需求(如了解功能实现原理,发现bug)
2. 养成阅读相关文档了解库函数库元素的习惯,提高代码编写和阅读能力
3. 养成编程写注释的好习惯;
【阅读要求】
1. 重视代码中的一些特殊的非功能性需求,了解代码风格特点
2. 向系统增加新功能时,最好寻找类似的功能实现代码作为备用实现模板,不要为了效率牺牲代码的可读性。
3. 充分利用调试器、编译器、系统调用的跟踪器、数据库查询日志、操作系统信息内容;在移植代码或修改接口时可以直接通过编译器定位问题范围,减少阅读量。
4. 通过浏览项目的源代码树(包含项目源代码的目录层次结构,规格说明,用户和开发者文档,测试脚本,资源库,编译工具,样本,本地化文件,修订历史,安装过程和许可信息)来分析项目的组织方式。源代码树常常能够反映项目在架构上的结构,在接触大项目时,要花一些时间来熟悉项目的目录树结构。
5. 大型项目中,makeflie常常由配置步骤动态生成,早分析makefile之前需要先执行项目特定的配置。检查大型编译过程的各步骤时,可以使用make程序的-n选项推演。
6. 阅读代码时,尽可能利用可用的文档内容,使用系统的规格说明文档,了解代码的运行环境;阅读软件规格说明,了解代码结构的路线图,指导阅读具体代码;功能性描述和用户手册可以提供使用背景,理解上下文;了解文档中的底层描述与符号说明;了解部分已知漏洞信息。文档并不完善。,以一种批判的角度看待源代码和相关介绍。
【阅读技巧】
1. 检查注释或关键变量,循着字符串信息或使用关键字来搜索代码区域或相关文档
2. 阅读代码先从系统的框架开始,然后逐步细化。第一次分析一个程序,main函数时好起点
3. 理解代码一部分,有助于理解余下的代码,解决困难的代码需要从简单的开始。
4. 根据运行效果猜测代码功能,这要比阅读源码更快;根据局部命名约定,猜测变量和函数的功能用途;
5. 使用diff分析程序的修订历史,常常使用-w选项忽略空白差异
6. return goto break continue语句和异常都会影响结构化的执行流程,要特别注意
7. 识别并归类使用指针的理由:指针一般用来创建链式数据结构,引用动态分配的数据结构,实现引用调用,访问和遍历数据集合,传递数组参数,函数应用,别名,访问系统内存等。
8. 在代码中存在的 XXX、FIXME、TODO的序列,一般存在错误,要注意。
9. 比较版本变更信息,可以跟踪bug位置,找到相关问题范围;可以找到特定的变更如何实现
10. 了解给定的代码库所遵循的文件组织方式,就能更有效的浏览源代码
11. 源码数通常会反映一个应用程序的部署结构,例如web服务器中src,include,lib等文件夹的专用特点
【阅读工具】
1. 使用词法工具(程序编辑器,正则表达式搜索),高效的对文件内容进行模式搜索
2. 使用编辑器的大纲视图,了解源码基本结构;使用编辑器的语法颜色,使源码更可读。
3. grep ^[function name] 可以定位函数定义代码行; grep -l keyword *.c *.h 列出包含关键字的文件名
4. 使用grep对多个文件进行搜索,定位某些符号的声明,定义和使用;可以使用grep结合命令通道符|进行结果多次过滤
5. grep "[a-z0-9]_[a-z0-9]" *.c *.h 获取标识符
6. fgrep 在文件中查找固定的字符串
7. 对层次复杂的目录,使用find获取符合要求的文件列表,再使用`| xargs`传给grep `find . -name '*.c' -print |xargs grep 'rmdir('
8. diff 工具分析修改点
9. 使用自动化工具对代码进行分析
10. 对需要理解的内容进行画简图(类似于IDA)
【代码编写要求】
1. 可以使用空格、临时变量和括号提高表达式的可读性,可以使用德摩根率简化逻辑表达式;
2. 使用好的易理解的变量名称和缩进提高程序可读性;常量应使用大写字母命名,单词用下划线分割。
3. 使用匈牙利记法确定前缀标志。
4. typede声明增进抽象,增加代码的易读性
5. 通过引用方式传递参数并返回,减少参数复制的开销
6. 使用联合体,用于优化存储空间的利用,实现多态,以及访问数据的不同内部表示形式
7. 定制编译工具实现配置,编译管理,代码生成,测试和文档生成的工作
8. 数据流架构适用于自动化数据处理环境;面向对象架构用图表进行建模;分层架构可以堆积具有标准接口的软件组件。
9. 使用状态转移图帮组了解状态机的运行
【分析源码漏洞】
1. 相关文档中会标明故障点和错误信息
2. 出现在源码不同位置的相似错误意味着时容易被忽视的问题,在其他类似的地方也可能存在
3. 在代码中存在的 XXX、FIXME、TODO的序列,一般存在错误
4. 调试分析程序动态执行的每一个细节
The New hacker's Dictionary 了解生僻的文档词汇