腾讯C/C++安全编码指南

版权申诉
0 下载量 76 浏览量 更新于2024-09-07 收藏 46KB MD 举报
“tencent-C,C++安全指南.md”是一份由腾讯提供的C和C++代码安全指南,旨在帮助开发人员遵循安全编码规范,避免在API层面上出现安全风险。这份指南基于DevSecOps理念,强调将安全融入开发过程,用开发者易于理解的方式介绍安全编码实践。 **通用安全指南** 1. **C/C++使用错误** - **1.1 不得直接使用无长度限制的字符拷贝函数**:避免使用`strcpy`, `strcat`等可能导致缓冲区溢出的函数,应使用`strncpy`, `strncat`等有长度限制的版本。 - **1.2 创建进程类的函数的安全规范**:使用`fork`, `exec`等创建进程时,要注意参数的安全性,避免命令注入等风险。 - **1.3 尽量减少使用 _alloca 和可变长度数组**:这些可能导致栈溢出,建议使用动态内存分配。 - **1.4 printf系列参数必须对应**:确保格式字符串与参数列表匹配,防止格式化字符串漏洞。 - **1.5 防止泄露指针(包括%p)的值**:打印指针时要谨慎,防止敏感信息泄露。 - **1.6 不应当把用户可修改的字符串作为printf系列函数的“format”参数**:这可能导致格式字符串攻击。 - **1.7 对数组delete时需要使用delete[]**:正确释放动态分配的数组,避免内存泄漏。 - **1.8 注意隐式符号转换**:避免可能导致意外行为的类型转换。 - **1.9 注意八进制问题**:处理八进制数时要确保正确的解析和转换。 **不推荐的编程习惯** - **2.1 switch中应有default**:添加default分支,避免未预期的代码执行路径。 - **2.2 不应当在Debug或错误信息中提供过多内容**:减少敏感信息的暴露。 - **2.3 不应该在客户端代码中硬编码对称加密秘钥**:秘钥管理应安全且灵活,避免硬编码造成的信息泄露。 - **2.4 返回栈上变量的地址**:返回栈上的地址是不稳定的,可能导致悬挂指针。 - **2.5 有逻辑联系的数组必须仔细检查**:确保数组操作的正确性和边界。 - **2.6 避免函数的声明和实现不同**:保持函数签名的一致性,防止类型不匹配的错误。 - **2.7 检查复制粘贴的重复代码**:消除冗余代码,提高代码质量。 - **2.8 左右一致的重复判断/永远为真或假的判断**:审查并优化不必要的条件判断。 - **2.9 函数每个分支都应有返回值**:确保所有可能的执行路径都有明确的返回值。 - **2.10 不得使用栈上未初始化的变量**:初始化变量以避免未定义行为。 - **2.11 不得直接使用刚分配的未初始化的内存(如realloc)**:分配后立即初始化,防止敏感信息遗留。 - **2.12 校验内存相关函数的返回值**:如`malloc`, `calloc`, `realloc`等,检查返回值是否为NULL以防止空指针异常。 - **2.13 不要在if里面赋值**:避免混淆逻辑,将赋值操作移到if语句外。 - **2.14 确认if里面的按位操作**:确保按位操作符的意图清晰,防止逻辑错误。 **多线程** - **3.1 变量应确保线程安全性**:使用锁、信号量等同步机制保护共享资源,防止竞态条件。 - **3.2 注意signalhandler导致的条件竞争**:信号处理函数应考虑线程安全,避免信号与普通函数的交织。 - **3.3 注意Time-of-checkTime-of-use条件竞争**:确保在检查状态和使用状态之间没有其他线程改变状态。 **加密解密** - **4.1 不得明文存储用户密码等敏感数据**:使用安全的加密方法存储敏感信息,如哈希加盐。 这份指南还涵盖了其他方面的安全实践,例如网络编程、输入验证、错误处理等方面,旨在帮助开发者编写更安全、可靠的C和C++代码。通过遵循这些指导原则,可以降低软件漏洞的发生率,提升整体代码质量和安全性。