"华为C&C++最新安全编程规范V3.1.pdf"是华为技术有限公司发布的一份针对C和C++编程的安全规范文档,旨在提升编程人员的安全意识,培养攻击者思维,确保编写的代码安全可靠。该规范适用于所有使用C/C++语言进行编程的开发人员。
规范的核心内容涵盖了多个方面,包括变量、断言、函数、循环、异常机制、类、以及安全退出等基础要求。以下是对这些内容的详细解释:
1. 变量:
- 规则1.1.1强调指针变量、资源描述符变量和BOOL变量必须初始化,以防止使用未定义的值。
- 规则1.1.2指出释放资源后,应立即为指向资源句柄的变量赋予新值,以避免空悬指针。
- 规则1.1.3要求类的成员变量在构造函数中初始化,以确保对象状态的正确性。
- 规则1.1.4禁止对指针进行sizeof操作,防止获取不准确的内存大小。
- 建议使用const关键字来增强代码的稳定性,并对全局变量的多线程访问进行加锁保护。
2. 断言(ASSERT):
- 规则1.2.1提倡使用宏定义断言,而不是直接调用assert函数,以便于控制和调试。
- 规则1.2.2强调运行时可能出错的情况不应依赖断言,而应使用错误处理机制。
- 规则1.2.3禁止在断言中更改运行环境,确保断言不影响程序的正常流程。
- 建议避免在一个断言中放置多条语句,以提高可读性和定位问题的准确性。
3. 函数:
- 规则1.3.1规定数组作为参数传递时,应同时传递长度信息,防止缓冲区溢出。
- 规则1.3.2禁止在公共接口API函数中对参数进行ASSERT,以保持API的稳定性和兼容性。
- 对内容不修改的指针参数,建议声明为const,体现不可修改的意图。
- 提醒谨慎使用不可重入函数,以防止并发问题。
- 在函数开始时进行参数ASSERT检查(API除外),以尽早发现无效输入。
4. 循环:
- 规则1.4.1要求所有循环都有明确的退出条件,避免无限循环。
5. 异常机制:
- 规则1.5.1禁止使用C++异常机制,鼓励使用错误码或其他方式处理异常情况。
6. 类:
- 规则1.6.1要求有构造函数的类也应有析构函数,保证资源的正确释放。
- 规则1.6.2指出构造函数中不应执行可能失败的操作,确保构造过程的成功。
- 规则1.6.3禁止在构造函数中创建线程,以防止线程生命周期与对象生命周期不匹配的问题。
- 规则1.6.4严禁使用`delete this`,以防对象自我销毁。
- 如果类的公共接口返回私有数据地址,应加const类型,防止意外修改。
7. 安全退出:
- 规则1.7.1禁止使用atexit函数,以避免程序结束时的不确定性。
- 规则1.7.2严禁使用kill、TerminateProcess等函数终止其他进程,以维护系统稳定。
- 规则1.7.3禁止使用pthread_exit、ExitThread函数,确保线程的正常退出。
- 建议避免使用exit、ExitProcess函数,除非在main函数中,以保证资源的清理。
遵循这些规范,可以显著减少代码中的安全隐患,提高软件的可靠性,并有助于构建更加安全的软件系统。