读《编程匠艺——编写卓越的代码》:防御性编程

田纳西.威廉斯(Tennessee Williams):
我们彼此猜忌,实属情非得已。这是我们防止背叛的唯一武器

一、编写优秀代码:

《程序设计原理》中M.A.Jackson写道:
软件工程师的智慧,就在于他们是否开始意识到:使程序能用和使程序正确,这两者之间有什么样的差别

  1. 可用的代码:提供常规输入集,代码给出常规输出;一旦有意外输入,代码崩溃。
  2. 正确的代码:对于所有输入集,有正确的输出;
  3. 优秀的代码:一定是正确的代码;逻辑容易理解;代码自然;容易维护。

产品级的代码,面对不常见的输入时不会崩溃,也不会出现错误的结果;同时,满足其他要求,包括『可重入』、『线程安全』、时间约束等

二、一种防止代码漏洞百出的手段——防御性编程

墨菲定律(Murphy's Law):
凡是可能出错的事,准会出错

防御性编程通过预见到(至少预先推测到)问题所在,断定代码中每个阶段可能出现的问题,并做出相应的防范措施,来防止这类意外产生

三、防御性编程技巧

  1. 使用好的编码风格和合理的设计
    命名合理;审慎地使用括号;
    编码前,设计好接口

  2. 避免闪电式编程
    每敲一个字,都想清楚你输入的是什么
    进入下一个环节之前,完成上一个代码段的所有任务

  3. 不要相信任何人
    任何人,包括你自己,都可能把缺陷引入你的程序逻辑中
    用怀疑的眼光审视所有的输入和所有的输出,直到确保正确为止。
    在程序各处添加安全检查

  4. 保持代码简单
    将复杂的代数运算拆分为一些列单独的语句,使逻辑清晰。

  5. 不要让任何人做他们不该做的修补工作
    面向对象语言中,将属性设置为private,并提供public函数操作它们;
    如果变量可以声明为函数内局部变量,不要在文件范围内声明;
    如果变量可以声明为循环体内局部变量,不要在函数范围内声明。

  6. 编译时开启所有警告开关
    编译器的警告能捕捉到许多愚蠢的编码错误;

  7. 使用静态分析工具
    编译器只能对代码进行有限的静态分析;
    静态分析工具:C语言的lint;.NET的FxCop

  8. 使用安全的数据结构
    最常见的安全隐患为缓冲溢出,缓冲溢出是由于不正确地使用固定大小的数据结构而造成的;
    避免的方法:
    使用更安全的不允许破坏程序的数据结构——使用类似C++的string类
    对不安全的数据结构使用更安全的操作

  9. 检查所有的返回值
    大多数难以察觉的错误都是因为程序员没有检查返回值而出现的

  10. 重视所有稀有资源,审慎地管理它们的获取和释放
    显式地终止那些不再使用或不会被自动清除的对象的引用
    不要循环引用(A引用B,B引用A)

  11. 在声明时对变量初始化

  12. 尽可能推迟变量的声明
    使变量声明的位置和使用它的位置尽量接近,从而防止干扰其他代码
    不要在多个地方重用同一个临时变量

  13. 使用标准化语言工具,写标准化语言

  14. 使用好的诊断信息日志工具

  15. 审慎地使用强制转换
    数据的强制转换会影响代码的可移植性

  16. 细则
    提供默认行为:如同switch语句都带default一样,写一个不带else的if语句应当深思;
    遵从语言习惯
    检查数值上下限:防止数值型变量上溢和下溢;确保每次运算可靠稳定(被除量不能为0)。
    正确的设置常量:尽可能把可以设置为常量的都设置为常量。

  17. 约束
    前置条件:输入一段代码前必须为真的条件,一般对参数作限定;
    后置条件:编写一段代码后必须为真的条件,一般对结果作判断;
    不变条件:每当程序执行到达特定点(循环中、方法调用等)时为真的条件,防止逻辑错误;
    断言:任何关于程序在给定位置状态的陈述;

  18. 约束的内容
    检查所有的数组访问是否都在边界内
    在废弃指针之前断言指针是非零的
    确保函数参数有效
    在函数结果返回之前对其进行充分检查

  19. 移除约束
    通常在程序构建的开发和调试阶段,才需要约束检验;确保程序逻辑正确后,理论上可以移除。
    C/C++标准库提供了公共机制——断言;指定为NDEBUG编译,可移除断言
    Java通过JVM启动或禁用断言机制
    .NET在框架Debug中提供断言机制

内容相关:

可重入代码:允许被多个进程同时访问和使用的一段代码,而且无论哪个进程调用它,所得到的结果都是一样。为了防止某一个进程的修改而导致不同进程的结果不同,可重入代码中一般采用局部变量不使用全局变量或静态变量。

线程安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,表示你的代码是线程安全的。

静态分析:程序运行前,执行代码检查

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 刚过去不久的七月,火辣辣的热,在这份热辣中却也有一份略显冰凉的愁绪。一批刚毕业的学生刚告别了校园,进入了职场,一个...
    A_先生阅读 221评论 0 0
  • 给家里打电话对在外拼搏的年轻人来说,是一件很尴尬的事情。心里惦记着家人,却又要硬挺着报喜不报忧。我给家里打电话还有...
    鲍尔至金的包阅读 549评论 0 0
  • 长风浩荡,拂面微醺,吹来淡淡的青草香。循着那沁人心脾的香气远望,映入眼帘的是一汪清浅的河水啊!波光粼粼的水面,摇曳...
    安言靜语阅读 374评论 0 0