第一部分 从编写没有漏洞的代码开始 3
第1章 完全没有漏洞是不可能的 3
1.1 证据 4
1.2 调试或者测试都无法找到所有漏洞 5
1.3 这样将变得更糟 8
1.4 开始就必须去除代码漏洞 8
第2章 使用Hatching预防Java漏洞 11
2.1 开发哲学 12
2.1.1 左脑?右脑 12
2.1.2 如何更加富有创造力 14
2.1.3 如何更好地组织 17
2.1.4 程序员创建而测试员破坏 17
2.2 首先编写文档 18
2.2.1 首先是用户手册 18
2.2.2 强有力的结束工作 19
2.2.3 用户手册成为编程规范 19
2.3 学着喜欢Javadoc 20
2.4 危险元素在安全元素之前 22
2.4.1 尽早处理例外 22
2.4.2 避免限期压力 23
第3章 设置Java漏洞中断 25
3.1 指导代码 26
3.1.1 代码工具 26
3.1.2 Java例外的细节 28
3.1.3 例外提高了艺术的境界 30
3.1.4 处理例外的编码 36
3.1.5 嵌套使用try模块 38
3.2 throw模块 38
3.2.1 throws关键词 39
3.3 隐藏在幻象漏洞之后的漏洞 41
3.3.1 练习生成漏洞 42
3.4 自动记录结果 42
第4章 千万不要错过另一个限期!危险因子分析 45
4.1 使用危险因子分析(RFA) 47
4.1.1 如何开始RFA 47
4.1.2 如何使用RFA 47
4.1.3 为什么使用RFA 49
4.2 为什么RFA对于调试Java非常重要? 49
第5章 编写代码避开漏洞 51
5.1 通用文字处理器 52
5.1.1 使用Microsoft Word 55
5.2 使用最好的Java编辑器 65
5.3 编辑窍门 66
5.3.1 使笔误自我显露 69
5.3.2 扩展拷贝/粘贴缓冲区 69
5.3.3 使用自动更正功能清除错误和保存输入 72
5.4 练习拼写检查器 74
5.5 按照先头后尾再中间的顺序书写 75
5.6 QQQ书签 76
5.7 3X5的打孔卡片 77
5.8 使用已知的Java子集 79
5.9 先注释后代码 80
5.10 牢记语言之间的区别 81
5.10.1 Java和C/C++ 81
5.10.2 Java和Visual Basic(VB)之间的主要区别 85
5.11 集成开发环境(IDE) 89
5.11.1 JBuilder 90
5.11.2 JDK Commander 92
5.11.3 Mojo 92
5.11.4 VisualCafe 92
5.12 漏洞类别 94
第二部分 清除Java漏洞 97
第6章 漏洞类别 97
6.1 设计漏洞 98
6.1.1 条件总是以2的幂数成对出现 98
6.2 语法漏洞 100
6.2.1 代码生成器 100
6.2.2 代码生成器的特性 103
6.2.3 类似Lint的检验程序 105
6.3 逻辑漏洞 113
6.3.1 逻辑性实际错误 113
6.4 解决神秘之处 118
6.5 数学漏洞 119
6.5.1 接近边界值的数学问题 120
6.5.2 布尔变量 121
6.5.3 不常用的操作符:移位 124
6.6 罕见的漏洞 129
6.6.1 数据导致的漏洞 130
6.7 副作用漏洞 130
6.8 优化引起的漏洞 131
6.9 假冒的漏洞 132
第7章 心理训练 135
7.1 如何保持思维的一贯性 136
7.1.1 使用纯粹的个人习惯 136
7.2 不要混合使用深度搜索和广度搜索 142
7.3 何时调试 144
7.4 环境 145
第8章 Debugger的可怕威力 147
8.1 免费的JavaDebugger(JDB) 149
8.1.1 安装 149
8.1.2 简介 149
8.1.3 命令参考 150
8.2 第三方Debugger 151
8.2.1 Assure 152
8.2.2 JBuilder 158
8.2.3 JProbe 165
8.2.4 Visual Cafe 171
第9章 调试策略 183
9.1 集成最好资源 184
9.2 分解漏洞 184
9.2.1 开始修改 185
9.2.2 猎枪的方法 186
9.2.3 根据推论调试 186
9.2.4 二进制漏洞搜索 188
9.2.5 测试 191
9.3 卡住时间些问题 193
第10章 测试 195
10.1 定位后击垮漏洞 196
10.1.1 武装你的代码 196
10.1.2 条件编译 197
10.1.3 漏洞在何处? 197
10.1.4 黑盒测试 203
10.1.5 白盒测试 204
10.1.6 全逻辑测试 206
10.2 制造更好的苍蝇拍 206
10.2.1 Macro Recorder 207
10.2.2 Best Practices Analyzer 207
10.2.3 Static Coverage Analyzer 208
10.2.4 Dynamic Coverage Analyzer 208
10.2.5 Bug Tracker 208
10.2.6 Test Data Assistant 210
10.2.7 何时停止测试 210
10.2.8 播撒错误的种子 215
10.2.9 你需要第二台计算机 216
10.3 Java的商业软件工具 219
第11章 线程化环境 223
11.1 回顾古老的并行算法 225
11.2 并行计算漏洞 227
11.2.1 Daemon和user线程 227
11.2.2 Java本身的防护 227
11.2.3 循环并行化 228
11.2.4 处理输入和输出 228
11.2.5 异步任务 230
11.2.6 定时程序 231
11.2.7 对时间敏感的线程漏洞 232
11.3 预防线程崩溃 235
11.3.1 使用循环锁解救 237
11.3.2 使用监督程序和信号量锁定 239
11.3.3 监督程序和信号量的详细内容 242
11.3.4 一些线程使用经验 243
11.3.5 性能问题 245
11.4 线程安全 245
11.5 预防措施 246
第12章 走开的人 247
12.1 用户如何查觉漏洞 248
12.1.1 让你的客户喜欢你 250
12.2 定义造成的漏洞混乱 252
12.3 还有什么可能出错? 253
12.4 组成完美错误信息的元素 253
12.4.1 使用用户的语言描述 253
12.4.2 不要过于简洁 254
12.4.3 小心选择词汇 254
12.4.4 确认是否拼写错误 254
12.4.5 道歉永远不会有害 255
12.4.6 最好完全解密 255
12.4.7 你的用户正处在接近恐慌的状态 255
12.4.8 错误消息必须可以缓和情绪 255
12.4.9 避免使用任何屈尊的语气 256
12.4.10 标准化步骤 256
12.4.11 按钮标题 258
12.5 格式化错误消息 258
12.6 错误消息的内容 259
12.6.1 发生了什么事? 259
12.6.2 为什么发生? 259
12.6.3 其后将发生什么现象? 260
12.6.4 现在用户可做什么? 260
12.6.5 将来用户能做什么? 261
12.6.6 现在用户从何处可以得到帮助? 261
12.6.7 用户如何才能帮助开发人员改善情况? 261
12.6.8 最近在用户的软件中发生过类似问题否? 262
12.6.9 用户应该如何向技术人员描述问题? 264
12.6.10 聊天室和帮助室 265
12.6.11 软件开发人员将为用户提供什么补偿? 265
12.6.12 问题发生时计算机的状态如何? 266
12.6.13 漏洞在客户端还是在服务器端? 266
12.6.14 打开了哪个数据库、表和字段? 266
12.6.15 哪个程序、哪个模块、哪种方法以及哪一行触发了错误? 266
12.6.16 当时哪个线程正在活动? 267
12.6.17 按照计算机支持的精度,问题究竟在何时发生? 267
12.6.18 登录用户是哪一位? 267
12.6.19 屏幕或者报告中应该显示什么内容 268
12.7 永远按照规范保证自己的软件 268
第三部分 性能 271
第13章 使用最佳的测试策略 271
13.1 递增与模块测试 272
13.1.1 递增测试的优点 272
13.1.2 传统模块测试的优点 273
13.1.3 综合测试 273
13.2 从上至下测试与从下至上测试 273
13.2.1 从上至下测试 273
13.2.2 流程图为什么有缺陷 274
13.2.3 从下至上测试 275
13.2.4 协议 275
13.3 原理测试 275
13.4 测试流程图的空白处 276
13.5 自动测试程序 277
13.5.1 自动黑盒测试 281
13.5.2 自动白盒测试 281
13.5.3 自动回归测试 282
13.5.4 自动静态分析 283
13.5.5 自动覆盖分析 289
13.5.6 幻想和神话 292
13.6 清除漏洞所需的费用 293
13.7 其他种类的测试 293
13.8 还剩下多少漏洞? 294
附录A 商业设计 297
A.1 附加项类库 298
A.2 人工智能 298
A.3 浏览器及浏览器工具 299
A.4 代码生成器 299
A.5 协作者 301
A.6 编译程序和解释程序 301
A.7 数据和网络数据 301
A.8 调试程序 305
A.9 文档编写器 306
A.10 电子商务 307
A.11 编辑器 308
A.12 图形开发 308
A.13 帮助文档编写器 310
A.14 IDE和开发工具 310
A.15 安装与配置 313
A.16 国际化 314
A.17 Internet 315
A.18 Java Beans和企业版的Java Beans(EJB) 315
A.19 Java虚拟机 318
A.20 JAR自解压程序 319
A.21 制图程序 319
A.22 消息程序 319
A.23 建模,UML,和CASE工具 320
A.24 Obfuscator和优化程序 323
A.25 对象请求代理程序(ORBs) 324
A.26 Profiler 324
A.27 报表制作程序 324
A.28 安全 326
A.29 服务器和Servlet 326
A.30 软件开发工具包 328
A.31 电子制表软件 328
A.32 测试工具和套件 329
A.33 跟踪器,工程管理器 329
A.34 语音识别 330
A.35 Java文字处理器 330
A.36 XML 330
附录B Java资源 333
B.1 书籍 334
B.2 杂志 334
B.3 电子杂志 335
B.4 新闻组 336
B.5 Web站点 336
B.6 培训 337
附录C 计算机编程的24条法规 341
附录D Java术语表 345
附录E Word宏 355
E.1 书签和跳转 356
E.2 隐藏的文本 357
E.3 个人注释 359
E.4 绿色的关键字 359
E.5 编程帮助 374
E.6 更多的宏 376