市面上代码审计的主流分类:
综合性的代码分析平台
sonar,可支持支持自定义规则,较多的公司使用
IDE辅助功能
xcode、 android studio 阿里巴巴java开发手册ide插件支持
独立的静态分析工具
findbugs、androidlint、 scan-build pmd阿里巴巴java开发手册pmd插件
CodeReview在公司的作用 :
1、生产服务不稳定,火灾频繁。
2、代码债务重,后续入职人员将错就错,项目不受控。
3、bug依赖测试团队发现,质量和效率低下。
4、团队成员年轻,水平参差不齐。项目急任务重没有时间。
代码审计需要关注的指标
代码坏味道
代码规范
技术债评估
![8e46b182b15ac6fccd023ce02e11d1de.png](https://img-blog.csdnimg.cn/img_convert/8e46b182b15ac6fccd023ce02e11d1de.png)
bug和漏洞
代码重复度
单测与集成
单元测试与集成
测试用例数量
覆盖率
静态分析技术分类
代码静态检查
代码分析: lint系列,通过分析语法树和源代码,检查代码规范
编译器分析:借助于编译器获得代码关系
字节码静态分析
分析jar、war、dex 等格式的文件,代表工具: findbugs
sonarqube是什么?
Sonar (SonarQube)是一个开源平台,用于管理源代码的质量。 Sonar 不只是一个质量数据报告工具,更是代码质量管理平台。 支持java, JavaScrip, Scala 等等二十几种编程语言的代码质量管理与检测。 SonarQube®是一种自动代码审查工具,用于检测代码中的错误,漏洞和代码异味。它可以与您现有的工作流程集成,以便在项目分支和拉取请求之间进行连续的代码检查
![e755417ff4151db5300130c7d71bfb7c.png](https://img-blog.csdnimg.cn/img_convert/e755417ff4151db5300130c7d71bfb7c.png)
sonarqube 的架构
![ab0f2918aab3d76f3155e86a5a5788cd.png](https://img-blog.csdnimg.cn/img_convert/ab0f2918aab3d76f3155e86a5a5788cd.png)
1、SonarQube Server 包含3个主要服务进程①WebServer②SearchServer使用elastic search 作为搜索的工具ui ③ComputeEngineServer 分析并且保存到sonar数据库中
2、SonarQube Database ① 配置实例项、插件安装等 ② 项目质量快照视图
3、SonarQube Plugins 各种插件:如 语言插件、认证插件、编程语言检查插件等
![e0e2adfb91ddab3111808927b0ae83cd.png](https://img-blog.csdnimg.cn/img_convert/e0e2adfb91ddab3111808927b0ae83cd.png)
4、SonarQube Scanners 分析项目的工具
sonarqube 集成
1、在IDE中使用sonarlint插件运行本地分析
2、开发人员提交代码到scm工具中
3、持续集成工具触发检查代码执行SonarQube Scanner 上次到sonarqube 通过计算引擎进行分析
4、分析报告传送给sonarqube server进行加工处理
5、进行处理分析、将数据保存到数据库中、将效果通过界面展示出来
6、开发者通过sonarqube ui查看自己的bug和技术债等
7、各人员通过代码报表进行查看管理
![411ab9d14b36d3182f91a24562744582.png](https://img-blog.csdnimg.cn/img_convert/411ab9d14b36d3182f91a24562744582.png)
7.9版本后不支持mysql
sonarqube质量校验的方向
1. 不遵循代码标准(Coding Standards Breach)
sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。
2. 潜在的缺陷(Bugs and Potential Bugs)
sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检 测出潜在的缺陷。
3. 糟糕的复杂度分布(Bad Distribution of Complexity)
文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员 难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。
4. 重复(Duplications)
显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示 源码中重复严重的地方。
5. 注释不足或者过多(Not Enough or Too Many Comments)
没有注释将使代码可读性变差,特别是当不可避免地出现人员变动 时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。
6. 缺乏单元测试(Lack of Unit Tests)
sonar可以很方便地统计并展示单元测试覆盖率。
7. 糟糕的设计
通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测藕合。
sonar 的搭建
临时性部署
#使用java的内存数据库,构建的临时性,临时使用比较方便docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube
![3d90ee0b1a609afa9ffe5607938477cb.png](https://img-blog.csdnimg.cn/img_convert/3d90ee0b1a609afa9ffe5607938477cb.png)
启动成功
![f2a816e947b04d6bf3c48d2ec1051319.png](https://img-blog.csdnimg.cn/img_convert/f2a816e947b04d6bf3c48d2ec1051319.png)
通过find / -name sonar.log 查找到日志所在位置并进行查看
![b3d5ce8546c206d28966397be404281f.png](https://img-blog.csdnimg.cn/img_convert/b3d5ce8546c206d28966397be404281f.png)
启动成功
8.x以上的版本部署 不支持mysql 使用postgresql
docker run -d --privileged=true --name sonarqube_postgres -e POSTGRES_USER=sonarqube -e POSTGRES_PASSWORD=sonarqube -e PGDATA=/var/lib/postgresql/data/pgdata #将当前目录的postgresql映射到 var/lib/postgresql/data 目录 当我们 删除容器时数据是不会丢失的 -v $PWD/postgresql:/var/lib/postgresql/data postgresmkdir sonarqube_data sonarqube_extensions sonarqube_logs#mac无需执行以下命令,linux需执行(修改权限不然root 用户无法启动)chown -R 999:999 sonarqube_data sonarqube_extensions sonarqube_logs#docker启动sonarqubedocker run -d --name sonarqube_hogwarts -p 9000:9000 -p 9092:9092 --link sonarqube_postgres:db -e SONARQUBE_JDBC_USERNAME=sonarqube -e SONARQUBE_JDBC_PASSWORD=sonarqube -e SONARQUBE_JDBC_URL="jdbc:postgresql://db/sonarqube" -v $PWD/sonarqube_data:/opt/sonarqube/data -v $PWD/sonarqube_extensions:/opt/sonarqube/extensions -v $PWD/sonarqube_logs:/opt/sonarqube/logs sonarqube
![ee7047dae2b1eab3ef1dcb1a703a9cd5.png](https://img-blog.csdnimg.cn/img_convert/ee7047dae2b1eab3ef1dcb1a703a9cd5.png)
在root账号下创建sonarqube文件夹,执行第一个命令
![c63b94ecef8b5db91a292dd9e7b5e9db.png](https://img-blog.csdnimg.cn/img_convert/c63b94ecef8b5db91a292dd9e7b5e9db.png)
执行后 会新增一个postgresql 文件夹
![eba468abd80506a86abcb8d1c284d1f3.png](https://img-blog.csdnimg.cn/img_convert/eba468abd80506a86abcb8d1c284d1f3.png)
执行第二个命令
![addb0ddaa59883b662b231c08f2a1673.png](https://img-blog.csdnimg.cn/img_convert/addb0ddaa59883b662b231c08f2a1673.png)
docker logs -f sonarqube_hogwarts 查看日志无异常
![18721ae3c2282e5df8a46768c03f6b8e.png](https://img-blog.csdnimg.cn/img_convert/18721ae3c2282e5df8a46768c03f6b8e.png)
部署成功 使用admin/admin
![7bbff088c215db4f656204e0025cdfe1.png](https://img-blog.csdnimg.cn/img_convert/7bbff088c215db4f656204e0025cdfe1.png)
安装插件
![d453aaf994341936f57d97a1045c7b0f.png](https://img-blog.csdnimg.cn/img_convert/d453aaf994341936f57d97a1045c7b0f.png)