注重体验与质量的电子书资源下载网站
分类于: 计算机基础 其它
简介
C安全编码标准(原书第2版): 开发安全、可靠、稳固系统的98条规则 豆 0.0分
资源最后更新于 2020-08-19 16:09:20
作者:Robert C. Seacord
译者:姚军
出版社:机械工业出版社
出版日期:2015-01
ISBN:9787111509820
文件格式: pdf
简介· · · · · ·
本书是业界最广泛采纳的编程指导原则汇编,它紧扣各个版本的C语言标准,分门别类地介绍了各种可能引发可利用安全漏洞的未定义行为、未指定行为,提出了安全编码的规则和建议,在每条规则和建议上都用现实的相容及不相容代码示例加以说明,在第2版中,加入了对最新的C11标准的支持,对于所有有志于C语言软件开发的技术人员来说,都是不可或缺的参考书。
全书共14章,包括98条编码规则,每条规则都由一个标题、一段说明和不相容/相容的代码示例组成。第1章讲述与预处理器相关的规则;第2章介绍的规则与声明和初始化相关;第3章介绍的是与表达式相关的规则;第4-7章讲述的规则分别与整数、浮点数、数组及字符和字符串相关;第8章介绍与内存管理相关的规则;第9章讲解的规则与输入/输出相关;第10章介绍的规则与环境相关;第11—13章分别讲解与信号、错误处理和并发性有关的规则;第14章讲述...
目录
译者序
前言
贡献者简介
第1章 预处理器(PRE)
1.1 PRE30-C. 不要通过连接创建通用字符名称
1.2 PRE31-C. 避免不安全宏参数的副作用
1.3 PRE32-C. 不要在类函数的宏调用中使用预处理器指令
第2章 声明和初始化(DCL)
2.1 DCL30-C. 声明具有正确存储持续期的对象
2.2 DCL31-C. 在使用前声明标识符
2.3 DCL36-C. 不要声明具有冲突链接类别的标识符
2.4 DCL37-C. 不要声明或者定义保留标识符
2.5 DCL38-C. 使用正确语法声明灵活数组成员
2.6 DCL39-C. 避免在结构填充中泄露信息
2.7 DCL40-C. 不要创建相同函数或者对象的不兼容声明
2.8 DCL41-C. 不要在switch语句第一个条件标签之前声明变量
第3章 表达式(EXP)
3.1 EXP30-C. 不要依赖求值顺序以避免副作用
3.2 EXP32-C. 不要通过非易失性引用访问易失性对象
3.3 EXP33-C. 不要读取未初始化的内存
3.4 EXP34-C. 不要对null指针进行解引用
3.5 EXP35-C. 不要修改具有临时生命期的对象
3.6 EXP36-C. 不要将指针转换为更严格对齐的指针类型
3.7 EXP37-C. 用正确数量和类型的参数调用函数
3.8 EXP39-C. 不要通过不兼容类型的指针访问变量
3.9 EXP40-C. 不要修改常量对象
3.10 EXP42-C. 不要比较填充数据
3.11 EXP43-C. 使用restrict限定的指针时避免未定义行为
3.12 EXP44-C. 不要向sizeof、_Alignof或者_Generic传递有副作用的操作数
3.13 EXP45-C. 不要在选择语句中执行赋值
第4章 整数(INT)
4.1 INT30-C. 确保无符号整数运算不产生回绕
4.2 INT31-C. 确保整数转换不会造成数据丢失或者错误解释
4.3 INT32-C. 确保有符号整数的运算不造成溢出
4.4 INT33-C. 确保除法和余数运算不会造成0除数错误
4.5 INT34-C. 不要用负数或者不小于操作数位数的位数对表达式进行移位
4.6 INT35-C. 使用正确的整数精度
4.7 INT36-C. 将指针转换为整数或者将整数转换为指针
第5章 浮点数(FLP)
5.1 FLP30-C. 不要使用浮点变量作为循环计数器
5.2 FLP32-C. 避免或者检测数学函数中的定义域和值域错误
5.3 FLP34-C. 确保浮点数转换在新类型的范围内
5.4 FLP36-C. 将整数值转换为浮点指针类型时保持精度
第6章 数组(ARR)
6.1 ARR30-C. 不要形成或者使用超限的指针或者数组下标
6.2 ARR32-C. 确保变长数组的大小参数在有效范围内
6.3 ARR36-C. 不要进行两个不引用相同数组的指针之间的减法或者比较
6.4 ARR37-C. 不要在指向非数组对象的指针上加或者减一个整数
6.5 ARR38-C. 保证库函数不形成无效指针
6.6 ARR39-C. 不要在指针上加或者减一个按比例调整的整数
第7章 字符和字符串(STR)
7.1 STR30-C. 不要企图修改字符串字面量
7.2 STR31-C. 保证字符串存储有足够的空间容纳字符数据和null结束符
7.3 STR32-C. 不要向要求字符串参数的库函数传递非null结束字符序列
7.4 STR34-C. 在转换为更大的整数尺寸之前将字符转换为unsigned char类型
7.5 STR37-C. 字符串处理函数的实参必须可以表示为unsigned char
7.6 STR38-C. 不要混淆窄和宽字符串及函数
第8章 内存管理(MEM)
8.1 MEM30-C. 不要访问已释放内存
8.2 MEM31-C. 在不再需要时释放动态分配的内存
8.3 MEM33-C. 动态分配和复制包含灵活数组成员的结构
8.4 MEM34-C. 只释放动态分配的内存
8.5 MEM35-C. 为对象分配足够的内存
8.6 MEM36-C. 不要通过调用realloc()修改对象的对齐方式
第9章 输入/输出(FIO)
9.1 FIO30-C. 从格式字符串中排除用户输入
9.2 FIO31-C. 不要打开已经打开的文件
9.3 FIO32-C. 不要在只适合文件的设备上执行操作
9.4 FIO34-C. 区分从文件读入的字符和EOF/WEOF
9.5 FIO37-C. 不要假定fgets()或者fgetws()在成功时返回非空字符串
9.6 FIO38-C. 不要复制FILE对象
9.7 FIO39-C. 不要在没有中间刷新或者定位调用的情况下在一个流中交替输入和输出
9.8 FIO40-C. 在fgets()或者fgetws()失败时重置字符串
9.9 FIO41-C. 不要用有副作用的流作为实参调用getc()、putc()、getwc()或者putwc()
9.10 FIO42-C. 在不再需要时关闭文件
9.11 FIO44-C. 对fsetpos()只使用fgetpos()返回的值
9.12 FIO45-C. 避免访问文件时出现TOCTOU竞争条件
9.13 FIO46-C. 不要访问已关闭文件
9.14 FIO47-C. 使用有效格式字符串
第10章 环境(ENV)
10.1 ENV30-C. 不要修改某些函数返回值引用的对象
10.2 ENV31-C. 在可能使某个环境指针无效的操作之后不要依赖该指针
10.3 ENV32-C. 所有退出处理程序必须正常返回
10.4 ENV33-C. 不要调用system()
10.5 ENV34-C. 不要保存某些函数返回的指针
第11章 信号(SIG)
11.1 SIG30-C. 在信号处理程序中只调用异步安全函数
11.2 SIG31-C. 不在信号处理程序中访问共享对象
11.3 SIG34-C. 不在可中断的信号处理程序中调用signal()
11.4 SIG35-C. 不从计算性异常信号处理程序中返回
第12章 错误处理(ERR)
12.1 ERR30-C. 在调用已知设置errno的库函数之前,将errno设置为0,只在函数返回表示故障的值之后才检查errno
12.2 ERR32-C. 不要依赖不确定的errno值
12.3 ERR33-C. 检测并处理标准库错误
第13章 并发性(CON)
13.1 CON30-C. 清理线程特定存储
13.2 CON31-C. 不要在互斥体被锁定时删除它们
13.3 CON32-C. 从多个线程访问位域时避免数据竞争
13.4 CON33-C. 使用库函数时避免竞争条件
13.5 CON34-C. 用正确的存储持续期声明线程间共享的对象
13.6 CON35-C. 以预定义顺序加锁,避免死锁
13.7 CON36-C. 将可能不合逻辑地唤醒的函数包装在一个循环中
13.8 CON37-C. 不要在多线程程序中调用signal()
13.9 CON38-C. 使用条件变量时保持线程安全性和活性
13.10 CON39-C. 不要加入或者断开之前已经加入或者断开的线程
13.11 CON40-C. 不要在一个表达式中两次引用同一个原子变量
13.12 CON41-C. 将可能不合逻辑地失败的函数包装在一个循环中
第14章 杂项(MSC)
14.1 MSC30-C. 不要使用rand()函数生成伪随机数
14.2 MSC32-C. 正确地设置伪随机数生成器的种子
14.3 MSC33-C. 不要向asctime()函数传递无效的数据
14.4 MSC37-C. 确保控制永远不会到达非void函数的结束位置
14.5 MSC38-C. 如果预定义标识符只能以宏的形式实现,不要将其当作对象处理
14.6 MSC39-C. 不要在va_list的值不确定时调用va_arg()
14.7 MSC40-C. 不要违反约束
附录A 词汇表
附录B 未定义行为
附录C 未指定行为
参考文献
前言
贡献者简介
第1章 预处理器(PRE)
1.1 PRE30-C. 不要通过连接创建通用字符名称
1.2 PRE31-C. 避免不安全宏参数的副作用
1.3 PRE32-C. 不要在类函数的宏调用中使用预处理器指令
第2章 声明和初始化(DCL)
2.1 DCL30-C. 声明具有正确存储持续期的对象
2.2 DCL31-C. 在使用前声明标识符
2.3 DCL36-C. 不要声明具有冲突链接类别的标识符
2.4 DCL37-C. 不要声明或者定义保留标识符
2.5 DCL38-C. 使用正确语法声明灵活数组成员
2.6 DCL39-C. 避免在结构填充中泄露信息
2.7 DCL40-C. 不要创建相同函数或者对象的不兼容声明
2.8 DCL41-C. 不要在switch语句第一个条件标签之前声明变量
第3章 表达式(EXP)
3.1 EXP30-C. 不要依赖求值顺序以避免副作用
3.2 EXP32-C. 不要通过非易失性引用访问易失性对象
3.3 EXP33-C. 不要读取未初始化的内存
3.4 EXP34-C. 不要对null指针进行解引用
3.5 EXP35-C. 不要修改具有临时生命期的对象
3.6 EXP36-C. 不要将指针转换为更严格对齐的指针类型
3.7 EXP37-C. 用正确数量和类型的参数调用函数
3.8 EXP39-C. 不要通过不兼容类型的指针访问变量
3.9 EXP40-C. 不要修改常量对象
3.10 EXP42-C. 不要比较填充数据
3.11 EXP43-C. 使用restrict限定的指针时避免未定义行为
3.12 EXP44-C. 不要向sizeof、_Alignof或者_Generic传递有副作用的操作数
3.13 EXP45-C. 不要在选择语句中执行赋值
第4章 整数(INT)
4.1 INT30-C. 确保无符号整数运算不产生回绕
4.2 INT31-C. 确保整数转换不会造成数据丢失或者错误解释
4.3 INT32-C. 确保有符号整数的运算不造成溢出
4.4 INT33-C. 确保除法和余数运算不会造成0除数错误
4.5 INT34-C. 不要用负数或者不小于操作数位数的位数对表达式进行移位
4.6 INT35-C. 使用正确的整数精度
4.7 INT36-C. 将指针转换为整数或者将整数转换为指针
第5章 浮点数(FLP)
5.1 FLP30-C. 不要使用浮点变量作为循环计数器
5.2 FLP32-C. 避免或者检测数学函数中的定义域和值域错误
5.3 FLP34-C. 确保浮点数转换在新类型的范围内
5.4 FLP36-C. 将整数值转换为浮点指针类型时保持精度
第6章 数组(ARR)
6.1 ARR30-C. 不要形成或者使用超限的指针或者数组下标
6.2 ARR32-C. 确保变长数组的大小参数在有效范围内
6.3 ARR36-C. 不要进行两个不引用相同数组的指针之间的减法或者比较
6.4 ARR37-C. 不要在指向非数组对象的指针上加或者减一个整数
6.5 ARR38-C. 保证库函数不形成无效指针
6.6 ARR39-C. 不要在指针上加或者减一个按比例调整的整数
第7章 字符和字符串(STR)
7.1 STR30-C. 不要企图修改字符串字面量
7.2 STR31-C. 保证字符串存储有足够的空间容纳字符数据和null结束符
7.3 STR32-C. 不要向要求字符串参数的库函数传递非null结束字符序列
7.4 STR34-C. 在转换为更大的整数尺寸之前将字符转换为unsigned char类型
7.5 STR37-C. 字符串处理函数的实参必须可以表示为unsigned char
7.6 STR38-C. 不要混淆窄和宽字符串及函数
第8章 内存管理(MEM)
8.1 MEM30-C. 不要访问已释放内存
8.2 MEM31-C. 在不再需要时释放动态分配的内存
8.3 MEM33-C. 动态分配和复制包含灵活数组成员的结构
8.4 MEM34-C. 只释放动态分配的内存
8.5 MEM35-C. 为对象分配足够的内存
8.6 MEM36-C. 不要通过调用realloc()修改对象的对齐方式
第9章 输入/输出(FIO)
9.1 FIO30-C. 从格式字符串中排除用户输入
9.2 FIO31-C. 不要打开已经打开的文件
9.3 FIO32-C. 不要在只适合文件的设备上执行操作
9.4 FIO34-C. 区分从文件读入的字符和EOF/WEOF
9.5 FIO37-C. 不要假定fgets()或者fgetws()在成功时返回非空字符串
9.6 FIO38-C. 不要复制FILE对象
9.7 FIO39-C. 不要在没有中间刷新或者定位调用的情况下在一个流中交替输入和输出
9.8 FIO40-C. 在fgets()或者fgetws()失败时重置字符串
9.9 FIO41-C. 不要用有副作用的流作为实参调用getc()、putc()、getwc()或者putwc()
9.10 FIO42-C. 在不再需要时关闭文件
9.11 FIO44-C. 对fsetpos()只使用fgetpos()返回的值
9.12 FIO45-C. 避免访问文件时出现TOCTOU竞争条件
9.13 FIO46-C. 不要访问已关闭文件
9.14 FIO47-C. 使用有效格式字符串
第10章 环境(ENV)
10.1 ENV30-C. 不要修改某些函数返回值引用的对象
10.2 ENV31-C. 在可能使某个环境指针无效的操作之后不要依赖该指针
10.3 ENV32-C. 所有退出处理程序必须正常返回
10.4 ENV33-C. 不要调用system()
10.5 ENV34-C. 不要保存某些函数返回的指针
第11章 信号(SIG)
11.1 SIG30-C. 在信号处理程序中只调用异步安全函数
11.2 SIG31-C. 不在信号处理程序中访问共享对象
11.3 SIG34-C. 不在可中断的信号处理程序中调用signal()
11.4 SIG35-C. 不从计算性异常信号处理程序中返回
第12章 错误处理(ERR)
12.1 ERR30-C. 在调用已知设置errno的库函数之前,将errno设置为0,只在函数返回表示故障的值之后才检查errno
12.2 ERR32-C. 不要依赖不确定的errno值
12.3 ERR33-C. 检测并处理标准库错误
第13章 并发性(CON)
13.1 CON30-C. 清理线程特定存储
13.2 CON31-C. 不要在互斥体被锁定时删除它们
13.3 CON32-C. 从多个线程访问位域时避免数据竞争
13.4 CON33-C. 使用库函数时避免竞争条件
13.5 CON34-C. 用正确的存储持续期声明线程间共享的对象
13.6 CON35-C. 以预定义顺序加锁,避免死锁
13.7 CON36-C. 将可能不合逻辑地唤醒的函数包装在一个循环中
13.8 CON37-C. 不要在多线程程序中调用signal()
13.9 CON38-C. 使用条件变量时保持线程安全性和活性
13.10 CON39-C. 不要加入或者断开之前已经加入或者断开的线程
13.11 CON40-C. 不要在一个表达式中两次引用同一个原子变量
13.12 CON41-C. 将可能不合逻辑地失败的函数包装在一个循环中
第14章 杂项(MSC)
14.1 MSC30-C. 不要使用rand()函数生成伪随机数
14.2 MSC32-C. 正确地设置伪随机数生成器的种子
14.3 MSC33-C. 不要向asctime()函数传递无效的数据
14.4 MSC37-C. 确保控制永远不会到达非void函数的结束位置
14.5 MSC38-C. 如果预定义标识符只能以宏的形式实现,不要将其当作对象处理
14.6 MSC39-C. 不要在va_list的值不确定时调用va_arg()
14.7 MSC40-C. 不要违反约束
附录A 词汇表
附录B 未定义行为
附录C 未指定行为
参考文献