• 代码阅读笔记


    【习惯养成】
    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 了解生僻的文档词汇

  • 相关阅读:
    poj 1860 最短路—Bellman-Ford算法
    poj 3083 dfs+bfs最短路
    poj 2049 Finding Nemo(bfs+优先队列)
    Codeforces 685B 树形dp
    Codeforces 679B
    hdu 5695 拓扑排序裸题
    hdu 5690 矩阵快速幂/循环节
    《概率》第一卷( 修订和补充第三版)施利亚耶夫著 周概荣译本 勘误
    HDU 2124 Repair the Wall
    HDU 1198 Farm Irrigation
  • 原文地址:https://www.cnblogs.com/joeat1/p/11354524.html
Copyright © 2020-2023  润新知