《华为C&C++语言安全编程规范》是华为技术有限公司提出的一套针对C和C++编程的安全准则,旨在提高代码质量,防止潜在的安全漏洞。规范涵盖了基础要求、字符串/数组操作、正确使用安全函数、整数处理以及内存管理等多个方面。
1. **基础要求**
- 变量:对指针、资源描述符、BOOL变量等需赋予初值,释放资源后及时更新,类成员变量在构造函数中初始化,避免对指针进行sizeof操作。建议使用const,多线程访问全局变量时需加锁,限制局部变量的内存大小。
- 断言(ASSERT):断言应使用宏定义,避免运行时错误,禁止在断言中改变环境,避免多条语句在同一断言中。
- 函数:数组参数需带长度,公共API不进行ASSERT,对只读参数定义为const。慎用不可重入函数,检查函数参数,特别是字符串和指针。
- 循环:确保循环有明确的退出条件。
- 异常机制:禁用C++异常机制。
- 类:有构造函数则必须有析构函数,构造函数内不做可能失败的操作,不创建线程,禁止`delete this`,返回私有数据需加const修饰。
- 安全退出:禁用特定的退出函数,如atexit,避免非法终止进程,禁用某些线程退出函数。
2. **字符串/数组操作**
- 确保足够的存储空间,字符串结尾需有`\0`,索引在数组范围内,长度校验外部输入,格式化函数的format参数不可控,参数类型与实际一致。
3. **正确使用安全函数**
- 设置destMax参数,不重新定义或封装安全函数,不用宏重命名,不自定义安全函数,检查返回值并妥善处理。
4. **整数处理**
- 避免溢出、反转、除0,整数比较和赋值前转换为更大类型,禁止有符号整数位运算,禁止整数与指针转换,不进行指针逻辑或位运算。
5. **内存管理**
- 内存申请前检查大小,分配后检查是否成功,禁止引用未初始化内存,释放后立即赋予新值,禁用realloc和alloca函数。
遵循这些规范,开发者可以编写更安全、更稳定的C和C++代码,减少因编程错误导致的安全风险。这不仅提高了代码的可靠性,也有助于构建更加健壮和安全的软件系统。