在平时的开发中经常发现总有做不完的需求、解不完的bug,所以如何在快速完成开发需求的情况下,保证高质量的代码成为一个头疼的难题。
什么是高质量的代码,对此整理了一份脑图:
如何能提升代码质量呢,除了自身过硬的codeing能力外,还需要代码检查流程,常见的流程有:
代码检查需要检查的问题有:
上述所说需要检查的各种问题中,代码和需要背离问题与代码是否符合设计需要人工进行review,花费的人力成本较高,还有部分问题可以通过工具检测。
常见检测工具
检测工具主要分为静态代码分析工具和动态代码检测工具。
静态代码分析工具主要用于静态代码分析,关于静态代码分析,它能够根据规则帮助检查代码缺陷,然而,对于检查规则能够覆盖的代码,工具能够工作的挺好,但对于规则没有覆盖的代码,它却无能为力,而且可能存在误报问题。
静态代码分析是保证代码质量的重要手段,据说软件开发中大概30%-70%的代码逻辑设计和编码缺陷都可以通过静态代码分析来发现和修复。它会扫描程序代码,找出代码中隐藏的错误,如参数不匹配、有歧义的嵌套语句、错误的递归、非法计算、空指针问题、越界问题、未初始化问题、内存泄漏问题等。
静态代码分析工具的优势有:
-
自动执行静态代码分析,快速定位代码隐藏错误和缺陷
-
帮助代码设计人员更专注于分析和解决代码设计缺陷
-
减少在代码人工检查上花费的时间,提高软件可靠性并节省开发成本
这里推荐一个常用的代码质量管理平台SonarCube,SonarQube是一个管理代码质量的平台(社区版免费),用于管理代码的质量,它会从多个角度维护检测代码质量,通过插件形式支持多种语言的代码质量管理和检测。它可以安装sonar-cxx插件,内置了一系列C/C++代码检查工具,还可以应用在CI/CD流程中,和Jenkins打通,可以在提交代码后检查代码是否有坏味道,不符合规范的代码就拒绝被合入master。
还有一个很好用的静态代码检测工具是Facebook的infer,它最大的优势是可以静态检测代码内隐藏的内存泄漏问题,而且免费支持Android、C、OC语言。
静态代码分析工具可以在运行前帮助我们检测缺陷,只有30%-70%,但不是所有缺陷,很多缺陷需要在运行时才会被发现。
其实我们还可以使用一些动态分析工具,通过动态分析工具可以准确定位问题,而且误报率低,但这与测试用例强绑定,查找缺陷的比例与测试用例的覆盖率有关,覆盖率对于衡量代码质量有很大意义。
代码覆盖率的意义:
● 帮助我们找到未覆盖部分的代码,分析测试用例设计的是否充分,之后视情况决定是否可以补充测试用例。
● 检测出代码的坏味道,提示我们修改代码,理清代码逻辑关系,提升代码质量。
● 代码覆盖率高不能代表代码质量一定好,但代码覆盖率低,代码质量估计不会高到哪去,可以作为我们衡量代码质量的重要手段之一。
● 对于没有覆盖到的错误,动态分析工具也无能为力。在实际工作中,我们可以动静结合,多种检查手段全都用上,可以更有效的提升代码质量。
动态分析工具可以在程序运行时发现代码的缺陷,例如内存问题、数据竞争、未定义行为等。
常用工具有GCC&Clang的Santizer系列:
● Asan-Address Sanitizer:缓存区溢出,内存泄漏
● Tsan-Thread Sanitizer:并发问题
● Msan-Memory Sanitizer:未初始化内存
● Ubsan-Undefined Behavior Sanitizer:未定义行为
● 编译选项添加fsanitize=address/memory/thread/undefined
还有Valgrind工具:
● memchek:内存问题,包括Asan和Msan
● helgrind:线程和并发问题
● cachegrind、callgrind、massif:帮助进行性能优化
使用各种工具与单元测试、功能测试、系统测试结合,提高覆盖率,可以帮助我们发现更多缺陷。
性能优化
这里收藏了一些好用的工具,这里重点介绍一下:
gprof:gprof是GNU工具之一,编译的时候,它在每个函数的出入口加入了profiling的代码,运行时统计程序在用户态的执行信息,可以得到每个函数的调用次数,执行时间,调用关系等信息,简单易懂。适合于查找用户级程序的性能瓶颈,然而对于很多耗时在内核态执行的程序,gprof不适合。
Oprofile:Oprofile也是一个开源的profiling工具,它使用硬件调试寄存器来统计信息,进行profiling的开销比较小,而且可以对内核进行profiling。它统计的信息非常多,可以得到cache的缺失率,memory的访存信息,分支预测错误率等等,这些信息gprof得不到,但是对于函数调用次数,它无能为力。
简单来说,gprof简单,适合于查找用户级程序的瓶颈,而Oprofile稍微有点复杂,但是得到的信息更多,更适合调试系统软件。
gperftools:Google出品,值得信赖,提供整个程序的热点分布图,找到性能瓶颈,然后可以针对性的进行性能优化。
参考了“程序喵大人”微信公众号