|
想要查看内容赶紧注册登陆吧!
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
目录
序言................................................................................................................................8
真实世界的黑客............................................................................................................9
第 1 章:通常的程序方案..........................................................................................10
方案 1:使代码消失...................................................................................................10
方案 2:让其他人写代码...........................................................................................11
方案 3:为了最大化保护,经常使用 const 关键字................................................ 12
方案 4:将大的参数列表放进结构体.......................................................................13
方案 5: 定义位............................................................................................................15
方案 6:谨慎使用位字段...........................................................................................16
方案 7:记录位图变量...............................................................................................18
方案 8:创建一个不能被复制的类...........................................................................19
方案 9:构建自注册类...............................................................................................20
方案 10:分离接口和实现.........................................................................................23
方案 11:从 Linux 内核的链表函数中学习.............................................................. 24
第二章:安全方案......................................................................................................26
方案 12:消除副作用.................................................................................................26
方案 13:不要将赋值语句放进任何其他的语句。.................................................27
方案 14:当可能的时候使用 const 而不是#define..................................................28
方案 15:如果你必须使用#define,将括号放在值的两边。.................................29
方案 16:尽可能使用内联函数而不是参数化的宏。.............................................29
方案 17:如果你必须使用宏,在参数两边放置圆括号.........................................30
方案 18:不要编写含糊的代码.................................................................................30
方案 19:不要聪明的使用优先级规则.....................................................................31
方案 20:包含属于你的头文件.................................................................................32
方案 21:同步头文件和代码文件名.........................................................................32
方案 22:永不信任用户输入.....................................................................................33
方案 23:不要使用 gets............................................................................................. 35
方案 24:刷新调试.....................................................................................................36
方案 25:使用断言保护数组访问.............................................................................37
方案 26:使用模板创建安全的数组.........................................................................39
方案 27:当什么都不做的时候,使其变得明显。.................................................40
方案 28:将 break 或/*Fall Through*/作为每个 case 的结尾..................................41
方案 29:一个简单的不可能条件的断言语句.........................................................41
方案 30:在 switch 中总是检查不可能的情况........................................................ 42
方案 31:创建可在编译时检查的模糊类型(句柄).............................................43
方案 32:当清零数组时使用 sizeof...........................................................................44
方案 33:在 memset 中使用 sizeof(var)而不是 sizeof(type)....................................45
方案 34:避免重用清零的指针.................................................................................46
方案 35:使用 strncpy 替换 strcpy 避免缓冲区溢出............................................... 47
方案 36:为了安全性使用 strncat 而不是 strcat......................................................48
方案 37:使用 snprintf 构建字符串.......................................................................... 49
方案 38:不要用人为限制设计.................................................................................49
方案 39:总是检查自赋值.........................................................................................51C++黑客指南
Steve Oualline
第 4 页 共 200 页
方案 40:使用哨兵保护类的完整性.........................................................................52
方案 41:使用 valgrind 解决内存问题......................................................................53
方案 42:发现未初始化的变量.................................................................................55
方案 29:valgrind 的发音...........................................................................................56
方案 43:使用 ElectricFence 定位指针问题............................................................. 56
方案 44:处理复杂的函数和指针声明.....................................................................57
第 3 章:文件方案......................................................................................................59
方案 45:只要可行,创建文本文件而不是二进制文件.........................................59
方案 46:使用魔法字符串识别文件类型.................................................................61
方案 47:为二进制文件使用魔法数字.....................................................................61
方案 48:通过魔法数进行自动字节排序.................................................................62
方案 49:编写可移植的二进制文件.........................................................................63
方案 50:使你的二进制文件可扩展.........................................................................64
方案 51:使用魔法数保护二进制文件记录.............................................................65
方案 52:知道什么时候使用_exit.............................................................................67
第 4 章:调试方案......................................................................................................68
方案 53:使用特别的字符标记临时的调试消息.....................................................68
方案 54:使用编辑器分析输出日志.........................................................................68
方案 55:灵活的日志.................................................................................................69
方案 56:使用信号打开和关闭调试.........................................................................70
方案 57:使用一个信号文件打开和关闭调试.........................................................71
方案 58:发生错误时自动启动调试器.....................................................................71
方案 59:启动调试器使断言失败.............................................................................77
方案 60:在正确的地方暂停程序.............................................................................78
第 5 章:注释和导航方案..........................................................................................80
方案 61:创建带有注释的标题.................................................................................80
方案 62:强调句子中的单词.....................................................................................81
方案 63:在注释中放置图.........................................................................................81
方案 64:提供用户文档.............................................................................................82
方案 65:文档化 API.................................................................................................. 83
方案 66:使用 Linux 交叉引用来导航大型代码项目.............................................. 85
第 6 章:预处理方案..................................................................................................89
方案 67:使用预处理器产生名字列表.....................................................................89
方案 68:自动创建单词列表.....................................................................................90
方案 69:保护头文件的双重包含.............................................................................91
方案 70:在 do/while 中封闭多行的宏.................................................................... 91
方案 71:使用#if 0 移除代码.....................................................................................92
方案 72:使用#ifndef QQQ 标识临时代码............................................................... 93
方案 73:在函数上,使用#ifdef,而不是函数调用,来消除多余的#ifdef.......... 93
方案 74:创建代码从函数体中消除#ifdef 语句.......................................................94
第 7 章:构建方案......................................................................................................97
方案 75:不要在没有验证的情况下使用任何“众所周知”的加速.....................97
方案 76:在双核处理器机器上使用 gmake -j 加速................................................. 99
方案 77:通过使用 ccache 编码重复编译..............................................................101C++黑客指南
Steve Oualline
第 5 页 共 200 页
方案 78:不改变你的 Makefiles 的情况下使用 ccache......................................... 102
方案 79:使用 distcc 分配工作负载........................................................................103
第 8 章:优化方案....................................................................................................104
方案 80:除非你真的确实需要,否则不要优化...................................................104
方案 81:使用性能分析器查找要优化的地方.......................................................104
方案 82:避免格式化的输出函数...........................................................................105
方案 83:使用++x 而不是 x++,因为它更快......................................................... 106
方案 84:通过使用 C 的 I/O API 优化 I/O 而不是 C++的 I/O API.......................... 107
方案 85:使用一个本地缓存避免重新计算一样的结果.......................................109
方案 86:使用自定义 new/delete 来加速动态存储分配...................................... 110
对抗方案 87:不必要的建立一个自定义的 new/delete....................................... 112
对抗方案 88:使用移位乘以或除以 2 的倍数.......................................................112
方案 89:使用静态内联而不是内联来节省空间...................................................113
方案 90:当你没有一个浮点数处理器的时候,使用 double 加快操作而不是 float
....................................................................................................................................114
方案 91:告诉编译器打破标准,当做计算时,强制编译器将 float 作为 float.115
方案 92:定点运算...................................................................................................115
方案 93:验证优化代码与未优化代码版本...........................................................120
案例学习:优化位到字节........................................................................................120
第 9 章:g++方案......................................................................................................125
方案 94:特定结构初始化.......................................................................................125
方案 95:检查参数列表的 printf 样式....................................................................126
方案 96:打包结构体...............................................................................................126
方案 97:创建一个函数,返回值不应该被忽略...................................................126
方案 98:建立永远不返回的函数...........................................................................127
方案 99:使用 GCC 堆内存检查函数定位错误...................................................... 129
方案 100:追踪内存使用.........................................................................................130
方案 101:产生一个回溯.........................................................................................132
第 10 章:对抗方案..................................................................................................135
对抗方案 102:变量声明使用”#define extern”......................................................135
对抗方案 103:使用,(逗号)加入语句................................................................137
对抗方案 104:if (strcmp(a,b)).................................................................................138
对抗方案 105:if (ptr).............................................................................................. 139
对抗方案 106:”while ((ch = getch()) != EOF)”方案.................................................140
对抗方案 107:使用#define 增强 C++语法............................................................ 141
对抗方案 108:使用 BEGIN 和 END 而不是{ 和 }................................................. 141
对抗方案 109:变量参数列表.................................................................................142
对抗方案 110:不透明句柄.....................................................................................143
对抗方案 111:微软(匈牙利)表示法.................................................................144
第 11 章:嵌入式程序方案......................................................................................146
方案 112:总是验证硬件规格.................................................................................147
方案 113:使用可以指定整数宽度的可移植类型.................................................148
方案 114:验证结构体大小.....................................................................................148
方案 115:当定义硬件接口的时候验证偏移量.....................................................150C++黑客指南
Steve Oualline
第 6 页 共 200 页
方案 116:打包结构体来消除隐藏的填充.............................................................150
方案 117:理解关键词 volatile 做了什么和如何使用它.......................................151
方案 118:理解优化器可以为你做什么。.............................................................152
方案 119:在嵌入式程序中,尝试没有暂停地处理错误.....................................155
方案 120:检测饥饿.................................................................................................157
第 12 章:Vim 编辑方案.......................................................................................... 159
方案 121:打开语法着色.........................................................................................160
方案 122:使用 Vim 的内部 make 系统..................................................................160
方案 123:自动缩进代码.........................................................................................162
方案 124:缩进错在的代码块.................................................................................163
方案 125:使用标签导航代码.................................................................................164
方案 126:你需要定位你只知道部分名字的过程.................................................166
方案 127:使用:vimgrep 搜索变量或函数............................................................. 168
方案 128:查看大型函数的逻辑.............................................................................169
方案 129:使用 Vim 查看日志文件........................................................................ 170
第 13 章:聪明但是无用..........................................................................................172
方案 130:翻转变量 1 和 2......................................................................................172
方案 131:不使用临时变量交换两个数.................................................................173
方案 132:不用临时变量,在一个字符串中翻转单词.........................................174
方案 133:使用单个指针实现一个双向链表.........................................................176
方案 134:不使用一个锁,访问共享内存.............................................................177
方案 135:回答面向对象的挑战.............................................................................179
附录 A:黑客名言.....................................................................................................181
Grace Hopper............................................................................................................. 181
Linus Torvalds............................................................................................................. 182
附录 B:你知道如果……你是一个黑客.................................................................183
附录 C:黑客罪行.....................................................................................................185
使用字母 O,I,l 作为变量名................................................................................. 185
不分享你的工作........................................................................................................185
没有注释....................................................................................................................185
复制代码(通过剪切和粘贴编程)........................................................................186
附录 D:为黑客准备的开源工具............................................................................ 187
ctags - 函数索引系统............................................................................................... 187
doygen........................................................................................................................187
FlawFinder.................................................................................................................. 187
gcc - GUN C 和 C++编译器套件.................................................................................187
lxr................................................................................................................................187
Perl(对于 perldoc 和相关工具)- 文档系统........................................................ 187
valgrind(内存检查工具).......................................................................................188
Vim(
Vi 升级版)..................................................................................................... 188
附录 E:安全设计模式.............................................................................................189
1. 消除副作用。将++和--放在它们自己的行........................................................ 189
2.不要将赋值语句放在其它语句中.........................................................................189
3.定义常量.................................................................................................................189C++黑客指南
Steve Oualline
第 7 页 共 200 页
4.使用内联函数而不是参数化的宏.........................................................................189
5.使用{}消除含糊的代码.......................................................................................... 189
6.让你做的一切变得明显,即使什么也不做.........................................................190
7.在一个 switch 中总是检查默认的 case................................................................ 190
8.优先级规则.............................................................................................................190
9.头文件.....................................................................................................................190
10.检查用户输入.......................................................................................................191
11.数组访问...............................................................................................................191
12.复制一个字符串...................................................................................................191
13.字符串连接...........................................................................................................191
14.复制内存...............................................................................................................191
15.清零内存...............................................................................................................191
16.查找一个数组中的元素数量...............................................................................191
17.使用 gets............................................................................................................... 191
18.使用 fgets..............................................................................................................192
19.当建立不透明的类型时,使它们可以被编译器检查.......................................192
20.在 delete/free 后清零指针,避免重用.............................................................. 192
21. 总是检查自复制.................................................................................................192
22. 使用 snprintf 建立字符串.................................................................................. 192
Appendix F: Creative Commons License.................................................................... 193
License........................................................................................................................193
回复可见:
|
|