序言
夜来风雨声,花落知多少。
使用CodeQL为OpenJDK生成数据库,过程中踩了很多坑,写篇博客详细记录一下。
CodeQL数据库生成流程
CodeQL引擎内的Extractor
会对程序中的语义信息进行分析与提取,用来构建后续用来分析的数据库。
编译型语言:在本地编译的过程中,可以将Extractor
视作探针。它监视编译过程,捕获程序语义信息。
解释性语言:直接分析程序源码。
数据库里有什么:源代码src.zip
、语义信息、关系数据。
CodeQL数据库获取途径
LGTM平台对CodeQL做了非常好的数据支持,不仅可以在上面直接编写QL脚本查询,还可以下载到特定组件对应的数据库。
当然,LGTM也支持与用户的GitHub仓库联动的Workflow,具体操作看参考官方文档。
但痛点是,LGTM平台并没有OpenJDK的Database。。。
为了解决它,我去openjdk/jdk8u项目找到对应版本的tag,本地编译了一下,也就有了这篇博客。
过程记录
编译环境
操作系统:ubuntu 16.04
Boot_JDK:jdk 1.7.0_80
Target_OpenJDK:OpenJDK 8u73
准备Boot_JDK
我选择的是直接解压tar.gz
方式进行Boot_JDK的安装,jdk-7u80-linux-x64.tar.gz
1 | 解压 |
准备Toolchain
软件包更新:
1 | apt-get update |
安装编译工具:
1 | apt-get install -y build-essential gdb cmake cpio file unzip zip wget ccache |
1 | apt-get install -y --no-install-recommends libfontconfig1-dev libfreetype6-dev libcups2-dev libx11-dev libxext-dev libxrender-dev libxrandr-dev libxtst-dev libxt-dev libasound2-dev libffi-dev autoconf |
降级cmake到3.81版本:
1 | cd ~/OpenJDK8u73 |
OpenJDK编译环境检查:
1 | chmod 777 configure |
当你看到这个画面,恭喜你,你的编译环境没问题:
编译&数据库生成
到这里,下面这行命令就可以编译了:
1 | make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0 |
但我们想要的是CodeQL数据库,所以需要改一下命令:
1 | codeql database create Openjdk8u73_db --language="java" --command="make all DISABLE_HOTSPOT_OS_VERSION_CHECK=OK ZIP_DEBUGINFO_FILES=0" |
编译成功之后,cd到build/linux-x86_64-normal-server-slowdebug/jdk/bin
目录下:
编译好的OpenJDK在build目录下,对应的CodeQL数据库在源码目录下:
CodeQL查询
有了Database,导入到VSCode插件中,写个脚本简单查询一下:
后记
- MacOS上面Xcode,clang那一套编译工具实在是头大,为了省事,选择了Toolchain更简单清晰的Linux;
- 下载Linux版本的CodeQL CLI以及CodeQL Lib,构建数据库之前,别忘了修改环境变量;
- 降级make是为了保证稳定编译;
- Boot_JDK一定要选择比Target_JDK版本低的JDK;
- 目前闭源第三方Jar包依然是CodeQL痛点;