把静态检查引入代码中
1. 为什么要这么做
最初起因是我在实习的时候,我们组的开发给我指导的,一定要开启代码静态检查,我当时觉得也挺新鲜,在我写qbdi-tracer的时候,开启了所有错误视为检查,但是遇到了成百上千个错误,根本改不完,改到最后程序功能都出问题了
2. 为什么今天又感觉需要重启这个
现在接手的代码比较棘手,里面的风格比较随意,需要有一些规范限制,并且当我们把所有的warning都作为error处理后,代码的稳定性和保障性自己都是信得过的。
3. 源头视频
https://www.youtube.com/watch?v=7_nSywhw_E8
作者讲述了,我们可以首先修复一种警告类型,逐渐的扩散到所有的警告类型,作者也提到了一次性开启所有的是不可能的,引发了我很强的共鸣
那么我们使用哪些flag是比较好的呢?
1 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-unused-variable -Wno-unused-const-variable -Wno-unused-function -Werror=return-type") |
-Wall: 启用大部分常用警告
-Wno-unused-variable: 忽略未使用变量警告
-Wno-unused-const-variable: 忽略未使用常量警告
-Wno-unused-function: 忽略未使用函数警告
-Werror=return-type: 将返回类型错误视为编译错误 (这里我们就可以逐渐的往里加错误了)
还有哪些比较不错的flag能够保护我们的代码质量?
金丝雀栈溢出检测
1 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector-all") |
包体积缩减
1 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions -fno-rtti") |
不处理c++错误,只做异常性处理,一般空指针等c++错误是没法捕获的,我们又没有自定义抛出错误,所以编译这个错误捕获没必要
-fno-rtti 禁用运行时类型信息,提高性能并减少二进制大小
顺便记录下比较优秀的内存检测框架
1 | if (BUILD_WITH_ASAN) |
其中 hwaddress 是arm64特定的硬件检测