一、业务层面:除0操作等
应对措施:做除法运算之前,判断被除数是否为0
二、内存问题:操作了空指针、操作了野指针、内存泄漏、内存访问越界(含读和写)、缓冲区溢出等
应对措施:
1、 遵循内存操作的编码规范:
1) 不确定来源的指针入参,进行判空操作;
2) 申请内存后,返回的指针进行判空操作;
3) 合适的场景下,可以考虑使用智能指针
4) 内存释放原则:原则上,在某一层申请的内存,需要在那一层释放;不建议跨层释放内存,容易产生问题;
内存释放具体操作:先进行内存指针判空,如果非空,进行内存释放,然后置NULL;
5) 内存拷贝操作:建议使用安全的内存拷贝接口(能进行源串、目的串、字串长度、边界等的判断及处理);注意边界处理
2、 借助代码静态检测工具(初级点的,比如Sonar、CppCheck等),排查空指针、野指针、内存访问越界等情况
3、 使用Valgrind等工具,进行内存泄露的排查
4、代码交叉检视
三、系统层面问题:资源泄露、资源限制等
应对措施:
1、 遵循资源访问及释放的编码规范
2、 借助代码静态检测工具等,排查资源的泄露情况,包括文件句柄、Socket句柄等
3、 代码交叉检视
四、并发问题:死锁
应对措施:制定好锁操作机制,明确加锁及释放锁的原则。
五、输入/输出错误:程序没有正确处理输入/输出操作,例如读取或写入文件、网络通信或用户输入等
应对措施:进行写入、输入及接口入参等的基本判断
六、依赖项或库:依赖外部库或依赖项出现问题,例如兼容性问题、丢失文件或配置错误
应对措施:检查配置、文件等是否存在,版本是否兼容等
七、不当关闭或退出:如果程序没有正确关闭或终止,例如在系统突然关闭或崩溃期间,可能会导致数据损坏或其他问题,从而导致程序在重新启动时崩溃。
应对措施:使用恰当的关闭或退出接口,优雅退出。