C安全编码标准PDF电子书下载
- 电子书积分:15 积分如何计算积分?
- 作 者:RobertC.Seacord编著
- 出 版 社:北京:机械工业出版社
- 出版年份:2010
- ISBN:9787111284420
- 页数:498 页
第1章 本标准使用说明 1
系统质量 1
自动生成的代码 1
顺应性 2
第2章 预处理器(PRE) 4
建议和规则 4
风险评估汇总 4
相关规则和建议 5
PRE00-C.用内联函数或静态函数代替与函数相似的宏 5
PRE01-C.在宏参数名两边加上括号 9
PRE02-C.宏替换列表应该加上括号 10
PRE03-C.应该使用typedef定义编码类型 11
PRE04-C.不要复用标准头文件名 12
PRE05-C.理解连接标记或执行字符串化时的宏替换 14
PRE05-C.把头文件放在包含防护条件中 15
PRE07-C.避免使用连续的问号 16
PRE08-C.保证头文件名惟一 18
PRE09-C.不要用不安全的函数替换安全函数 19
PRE10-C.在一个do-while循环中包装多条语句的宏 20
PRE30-C.不要通过连接创建统一字符名称 22
PRE31-C.不要在不安全宏的参数中包含赋值、增值、减值、volatile访问或函数调用 22
第3章 声明和初始化(DCL) 25
建议和规则 25
风险评估汇总 25
DCL00-C.用const限定不可修改的对象 26
DCL01-C.不要在子作用域中复用变量名 27
DCL02-C.使用视觉区别明显的标识符 28
DCL03-C.使用静态断言测试常量表达式的值 29
DCL04-C.不要在一个声明中声明超过1个的变量 31
DCL05-C.使用typedef声明提高代码的可读性 33
DCL06-C.使用有意义的符号常量表示程序逻辑中的字面值 33
DCL07-C.在函数声明器中包含适当的类型信息 38
DCL08-C.在常量定义中对关系进行正确的编码 40
DCL09-C.把返回errno错误代码的函数的返回类型声明为errno_ t 42
DCL100-C.维护变参函数的编写者和调用者之间的契约 44
DCL11-C.理解与变参函数相关联的类型问题 46
DCL12-C.使用不透明类型实现抽象数据类型 47
DCL13-C.把不会被函数修改的值指针参数声明为const 49
DCL14.不要对跨翻译单元的全局变量的初始化顺序作出假设 51
DCL15-C.把不需要外部链接的对象声明为static 52
DCL30-C.声明具有正确存储持久期的对象 54
DCL31-C.在使用标识符之前声明它们 56
DCL32-C.保证相互可见的标识符是惟一的 58
DCL33-C.保证函数实参中具有限制性限定的源指针和目标指针不引用重叠的对象 59
DCL34-C.对无法缓存的数据使用volatile 61
DCL35-C.不要使用与函数定义不匹配的类型转换函数 63
DCL36-C.不要声明具有冲突链接属性的标识符 65
第4章 表达式(EXP) 67
建议和规则 67
风险评估汇总 67
相关的规则和建议 68
EXP00-C.使用括号保证操作的优先级 68
EXP01-C.不要用指针的长度确定它所指向类型的长度 69
EXP02-C.注意逻辑AND和OR操作符的短路行为 71
EXP03-C.不要认为结构的长度等于它的各个成员的长度之和 72
EXP04-C.不要在结构之间执行逐字节的比较 74
EXP05-C.不要转换掉const限定 75
EXP06-C.sizeof操作符的操作数不应该包含副作用 77
EXP07-C.不要在表达式中对常量的值作出假设而削弱常量的优点 78
EXP08-C.确保正确地使用指针运算 79
EXP09-C.使用sizeof确定类型或变量的长度 81
EXP10-C.不要依赖子表达式的求值顺序或副作用的发生顺序 82
EXP11-C.不要把期待一种类型的操作符应用于一种不兼容的类型 84
EXP12-C.不要忽略函数的返回值 88
EXP30-C.不要依赖序列点之间的求值顺序 89
EXP31-C.避免断言的副作用 90
EXP32-C.不要转换掉volatile限定 91
EXP33-C.不要引用未初始化的内存 92
EXP34-C.保证不对null指针进行解引用 96
EXP35-C.不要在后续的序列点之后访问或修改一个函数的调用结果中的数组 97
EXP36-C.不要把指针转换为对齐要求更严格的指针类型 98
EXP37-C.调用函数时使用API所指定的参数 99
EXP38-C.不要在位段成员或非法类型上调用offsetof() 101
第5章 整数(INT) 104
建议和规则 104
风险评估汇总 104
相关的规则和建议 105
INT00-C.理解编译器所使用的数据模型 105
INT01-C.使用rsize_t或size_t类型表示所有表示对象长度的整数值 108
INT02-C.理解整数转换规则 111
INF03-C.使用安全的整数库 114
INT04-C.对来自不信任来源的整数值实行限制 115
INT05-C.如果输入函数无法处理所有可能出现的错误就不要用它们转换字符数据 117
INT06-C.使用strtol()或相关函数把字符串标记转换为整数 119
INT07-C.只使用显式的有符号或无符号char类型表示数值 121
INT08-C.验证所有的整数值位于范围内 122
INT09-C.保证枚举常量映射到惟一的值 124
INT10-C.使用%操作符时不要假设余数总是正的 125
INT11-C.把指针转换为整数或者把整数转换为指针时需要小心 127
INT12-C.当普通的整数位段用于表达式时,不要对它的类型作出假设 128
INT13-C.只对无符号操作数使用位操作符 129
INT14-C.避免在同一个数据上执行位操作和算术运算 131
INT15-C.在程序员定义的整数类型的格式化I/O中使用intmax_t或uintmax_t 132
INT30-C.保证无符号整数运算不产生回绕 135
INT31-C.保证整型转换不会丢失或错误解释数据 139
INT32-C.保证有符号整数运算不会产生溢出 142
INT33-C.保证除法和求模运算不会导致除零错误 149
INT34-C.移位的数量不能是负数或大于操作数的位数 150
INT35-C.把整型表达式比较或赋值为一种较大类型之前用这种较大类型对它进行求值 154
第6章 浮点数(FCP) 157
建议和规则 157
风险评估汇总 157
相关规则和建议 157
FLP00-C.理解浮点数的限制 158
FLP01-C.在重新排列浮点表达式时需要注意 159
FLP02-C.需要精确计算时避免使用浮点数 160
FLP03-C.检测和处理浮点错误 163
FLP30-C.不要使用浮点数作为循环计数器 167
FLP31-C.不要用复数调用期望接受实数的函数 169
FLP32-C.防止或检测数学函数中的定义域错误和值域错误 170
FLP33-C.执行浮点运算时把整数转换为浮点数 175
FLP34-C.保证浮点转换位于新类型的范围之内 177
第7章 数组(ARR) 180
建议和规则 180
风险评估汇总 180
相关规则和建议 180
ARR00-C.理解数组的工作方式 181
ARR01-C.获取数组的长度时不要对指针应用sizeof操作符 183
ARR02-C.显式地指定数组的边界,即使它已经由初始化值列表隐式地指定 185
ARR30-C.保证数组索引位于合法的范围之内 186
ARR31-C.在所有源文件中使用-致的数组记法 187
ARR32-C.保证变长数组的长度参数位于合法范围之内 189
ARR33-C.保证复制的目标具有足够的存储空间 190
ARR34-C.保证表达式中的数组类型是兼容的 192
ARR35-C.不允许循环迭代到数组尾部之后 193
ARR36-C.不要对两个并不指向同一个数组的指针进行相减或比较 195
ARR37-C.不要把一个指向非数组对象的指针加上或减去一个整数 196
ARR38-C.如果结果值并不引用合法的数组元素,不要把指针加上或减去一个整数 198
第8章 字符和字符串(STR) 201
建议和规则 201
风险评估汇总 201
相关规则和建议 202
STR00-C.使用适合的类型表示字符 202
STR01-C.采纳和实现一致的字符串管理计划 203
STR02-C.对传递给复杂子系统的字符串数据进行净化 204
STR03-C.不要意外地截断null结尾的字节字符串 207
STR04-C.使用普通char类型表示基本字符集中的字符 209
STR05-C.引用字符串常量时使用const指针 210
STR06-C.不要以为strtok()会使解析的字符串不被修改 211
STR07-C.使用TR 24731修正现在的字符串操纵代码 213
STR08-C.使用托管字符串开发新的字符串操纵代码 216
STR30-C.不要试图修改字符串常量 217
STR31-C.保证字符串的存储具有足够的空间容纳字符数据和null结尾符 218
STR32-C.根据需要将字符串用null结尾 222
STR33-C.正确地判断宽字符串的长度 225
STR34-C.在转换为更大的整型长度时把字符转换为无符号类型 227
STR35-C.不要把未检查边界来源的数据复制到固定长度的数组 228
STR36-C.不要指定用字符串常量初始化的字符数组的边界 232
STR37-C.字符处理函数的参数必须能够用unsigned char表示 233
第9章 内存管理(MEM) 235
建议和规则 235
风险评估汇总 235
相关规则和建议 236
MEM00-C.在同一个模块、同一个抽象层中分配和释放内存 236
MEM01-C.在free()之后立即在指针中存储一个新值 238
MEM02-C.把内存分配函数的调用结果立即转换为指向被分配类型的指针 240
MEM03-C.及时清除存储在可复用资源中的敏感信息 243
MEM04-C.不要执行零长度的分配 247
MEM05-C.避免大型的堆栈分配 249
MEM06-C.保证敏感数据不会被写入到磁盘 251
MEM07-C.保证calloe()的参数相乘后可以用size_ t表示 254
MEM08-C.只把realloc()用于改变动态分配数组的大小 255
MEM09-C.不要假设内存分配函数会对内存进行初始化 257
MEM10-C.定义和使用指针验证函数 259
MEM30-C.不要访问已经被释放的内存 261
MEM31-C.动态分配的内存只应释放一次 263
MEM32-C.检测和处理内存分配错误 264
MEM33-C.使用正确的语法表示灵活数组成员 267
MEM34-C.只释放动态分配的内存 269
MEM35-C.为对象分配足够的内存 270
第10章 输入/输出(FLO) 274
建议和规则 274
风险评估汇总 274
相关规则和建议 275
FIO00-C.在创建格式字符串时应该小心 276
FIO01-C.调用通过文件名标识文件的函数时必须小心 277
FIO02-C.对来自不信任来源的路径名进行标准化 279
FIO03-C.不要对fopen()和文件的创建作出假设 286
FIO04-C.检测和处理输入和输出错误 288
FIO05-C.使用多个文件属性标识文件 290
FIO06-C.创建具有正确访问权限的文件 295
FIO07-C.用fseek()代替rewind() 297
FIO08-C.在打开的文件上调用remove()时应该小心 299
FIO09-C.跨系统传输二进制数据时应该小心 300
FIO10-C.使用rename()函数时应该小心 301
FIO11-C.指定fopen()的mode参数时应该小心 305
FIO12-C.使用setvbuf()代替setbuf() 305
FIO13-C.不要压回多于1个的字符 306
FIO14-C.理解文件流的文本模式和二进制模式的区别 308
FIO15-C.保证文件操作在安全目录中执行 309
FIO16-C.通过创建jail限制对文件的访问 313
FIO30-C.排除格式字符串中的用户输入 315
FIO31-C.不要打开已经被打开的文件 318
FIO32-C.不要在专用于文件的设备上执行操作 320
FIO33-C.检测和处理导致未定义行为的输入输出错误 323
FIO34-C.使用int捕捉字符L/O函数的返回值 328
FIO35-C.当sizeof(int)= =sizeof(char)时使用feof()和ferror()检测文件尾和文件错误 329
FIO36-C.不要假设fgets()会读取换行符 331
FIO37-C.不要假设被读取的是字符数据 332
FIO38-C.不要使用FILE对象的拷贝进行输入和输出 333
FIO39-C.不要在没有干预刷新或定位调用的情况下在一个流中交替地执行输入和输出 334
FIO40-C.在fgets()失败时重置字符串 336
FIO41-C.调用getc()或putc()时不要使用具有副作用的流参数 337
FIO42-C.保证当文件不再需要时及时将它们关闭 339
FIO43-C.不要在共享目录中创建临时文件 342
FIO44-C.只在fsetpos()中使用fgetpos()所返回的值 350
第11章 环境(ENV) 352
建议和规则 352
风险评估汇总 352
相关规则和建议 352
ENV00-C.不要存储指向getenv()返回的字符串的指针 352
ENV01-C.不要对环境变量的长度作出假设 357
ENV02-C.注意具有相同有效名称的多个环境变量 358
ENV03-C.调用外部程序时对环境进行净化 361
ENV04-C.如果不需要命令处理器就不要调用system() 364
ENV30-C.不要修改getenv()所返回的字符串 367
ENV31-C.在可能无效化环境指针的操作之后不能再依赖它 369
ENV32-C.所有的atexit处理函数都不能以除了正常返回之外的其他任何方式终止 373
第12章 信号(SIG) 376
建议和规则 376
风险评估汇总 376
相关规则和建议 376
SIG00-C.屏蔽由不可中断的信号处理函数所处理的信号 376
SIG10-C.理解与信号处理函数的持久性有关的平台特定的细节 379
SIG02-C.避免使用信号实现常规的功能 382
SIG30-C.只在信号处理函数中调用异步安全的函数 386
SIG31-C.不要访问和修改信号处理函数中的共享对象 390
SIG32-C.不要在信号处理函数中调用longjmp() 392
SIG33-C.不要递归地调用raise()函数 395
SIG34-C.不要在不可中断的信号处理函数内部调用signal() 398
第13章 错误处理(ERR) 401
建议和规则 401
风险评估汇总 401
相关规则和建议 401
ERR00-C.采用和实现一致的、全面的错误处理策略 402
ERR01-C.使用ferror()而不是errno检查FILE流错误 404
ERR02-C.避免带内错误指示符 405
ERR03-C.调用TR24731-1所定义的函数时使用运行时约束处理函数 408
ERR04-C.选择一种适当的终止策略 410
ERR05-C.独立于应用程序的代码应该在不提示错误处理的情况下提供错误检测 414
ERR06-C.理解assert()和abort()的终止行为 419
ERR30-C.调用设置errno的库函数之前把errno设置为0,并且在函数返回一个提示失败的值之后检查errno 420
ERR31-C.不要重定义errno 424
ERR32-C.不要依赖errno的不确定值 425
第14章 其他(MSC) 429
建议和规则 429
风险评估总结 429
MSC00-C.在高警告级别进行干净的编译 430
MSC01-C.实现逻辑完整性 430
MSC02-C.避免因为省略所导致的错误 433
MSC03-C.避免因为多余所导致的错误 434
MSC04-C.用一种可读的风格一致地使用注释 435
MSC05-C.不要直接维护time_ t类型的值 437
MSC06-C.处理敏感数据时注意编译器的优化 438
MSC07-C.检测和删除死代码 441
MSC08-C.库函数应该对形参进行验证 443
MSC09-C.字符编码:使用ASCII的子集以保证安全 445
MSC10-C.字符编码:UTF-8相关的问题 447
MSC11-C.使用断言进行诊断测试 450
MSC12-C.检测和删除没有效果的代码 451
MSC13-C.检测和删除未使用的值 452
MSC14-C.不要引入不必要的平台依赖性 454
MSC15-C.不要依赖未定义的行为 455
MSC30-C.不要使用rand()函数产生伪随机数 457
MSC31-C.保证返回值与适当的类型进行比较 459
附录 POSIX(POS) 461
建议和规则 461
风险评估汇总 461
相关的规则和建议 462
POS00-C.避免多线程的竞争条件 462
POS01-C.检查链接是否存在 463
POS02-C.遵循最小特权原则 466
POS30-C.正确地使用readlink()函数 468
POS31-C.不要解锁或销毁另一个线程的mutex 470
POS32-C.在多线程环境中使用位段时包含一个mutex 471
POS33-C.不要使用vfork() 473
POS34-C.不要用一个指向自动变量的指针为参数调用putenv() 475
POS35-C.避免检查符号链接是否存在时的竞争条件 476
POS36-C.在撤消特权时注意正确的撤消顺序 478
POS37-C.保证特权的撤消是成功的 480
词汇表 484
参考资料 486
- 《大学英语四级考试全真试题 标准模拟 四级》汪开虎主编 2012
- 《全国学前教育专业(新课程标准)“十三五”规划教材 简谱手风琴教程 第2版》(中国)杨克勤,王宝庆 2019
- 《AutoCAD 2018自学视频教程 标准版 中文版》CAD/CAM/CAE技术联盟 2019
- 《HSK标准教程 4 上 练习册》姜丽萍主编 2015
- 《标准急救护理速查手册 普及版》美国骨科医师协会 (AAOS) ,美国急诊医师学会 (ACEP) 主编 2018
- 《全国学前教育专业(新课程标准)“十三五”规划教材 硬笔楷书书写训练 图解版》梅军 2019
- 《弦乐队标准化训练教程 1 教师用书》常林编 2014
- 《Dreamweaver CC 2018标准实例教程 中文版》杨雪静,胡仁喜编著 2019
- 《全国学前教育专业(新课程标准)“十三五”规划教材系列 幼儿园创意美术主题活动方案 上学期》程沿彤 2017
- 《新课程标准“十三五”规划教材系列 学前英语教学参考书 第1册 第2版》姚丹 2019
- 《市政工程基础》杨岚编著 2009
- 《家畜百宝 猪、牛、羊、鸡的综合利用》山西省商业厅组织技术处编著 1959
- 《《道德经》200句》崇贤书院编著 2018
- 《高级英语阅读与听说教程》刘秀梅编著 2019
- 《计算机网络与通信基础》谢雨飞,田启川编著 2019
- 《看图自学吉他弹唱教程》陈飞编著 2019
- 《法语词汇认知联想记忆法》刘莲编著 2020
- 《培智学校义务教育实验教科书教师教学用书 生活适应 二年级 上》人民教育出版社,课程教材研究所,特殊教育课程教材研究中心编著 2019
- 《国家社科基金项目申报规范 技巧与案例 第3版 2020》文传浩,夏宇编著 2019
- 《流体力学》张扬军,彭杰,诸葛伟林编著 2019
- 《指向核心素养 北京十一学校名师教学设计 英语 七年级 上 配人教版》周志英总主编 2019
- 《北京生态环境保护》《北京环境保护丛书》编委会编著 2018
- 《高等教育双机械基础课程系列教材 高等学校教材 机械设计课程设计手册 第5版》吴宗泽,罗圣国,高志,李威 2018
- 《指向核心素养 北京十一学校名师教学设计 英语 九年级 上 配人教版》周志英总主编 2019
- 《高等院校旅游专业系列教材 旅游企业岗位培训系列教材 新编北京导游英语》杨昆,鄢莉,谭明华 2019
- 《中国十大出版家》王震,贺越明著 1991
- 《近代民营出版机构的英语函授教育 以“商务、中华、开明”函授学校为个案 1915年-1946年版》丁伟 2017
- 《新工业时代 世界级工业家张毓强和他的“新石头记”》秦朔 2019
- 《智能制造高技能人才培养规划丛书 ABB工业机器人虚拟仿真教程》(中国)工控帮教研组 2019
- 《AutoCAD机械设计实例精解 2019中文版》北京兆迪科技有限公司编著 2019