其实吧,这玩意,网上教程特别多,但是都有问题,
很多细节说得不清不楚,结果按照教程根本无法完整地安装上,
所以,这里还是重新整理一下 CodeQL 的安装过程。
1:
下载 CodeQL ,地址:https://github.com/github/codeql-cli-binaries
cli,地址,我下载的是当前时刻的最新版:https://github.com/github/codeql-cli-binaries/releases/download/v2.8.4/codeql-win64.zip
2:
下载 CodeQL ,支持库,地址:https://github.com/github/codeql
直接下载就好了
其实,做完以上两步,就可以用了,但是。。。
这个配置,会玩死你。。。
这里先说配置,后面缺东西,再加
配置,先把 codeql-cli 解包,随便放在哪里,可以改名就叫 codeql-cli
再把 CodeQL 支持库解压,随便放在哪里,可以改名叫 codeql-home
比如,放在同一个目录下
两个目录均加入环境变量
加用户变量就好,不用加系统变量,比如这样
然后打开个cmd,看一下效果,
还是有效果的
好了,正常情况下,如果想使用IDE的话,还得弄个VSCode,这个不算插曲,如果想用,就搞,不想用就算了,
这里还是搞一个吧,有界面总比看黑框框强。
当前最新版 vscode
https://az764295.vo.msecnd.net/stable/c722ca6c7eed3d7987c0d5c3df5c45f6b15e77d1/VSCode-win32-x64-1.65.2.zip
下载了之后,直接解压,直接能用,
然后,去vscode里面安装 codeql 插件,这些都很傻瓜,安装方法,别的各种乱七八糟教程上也都有,
最后,配置路径
前面设置了环境变量,这里其实可以不设置的,但是,还是设置吧,重要的位置就这一个。
以上全都设置完,正常的套路也就结束了,
其他教程开始说,需要创建一个数据库了。
codeql 是类似要创建数据库的,然后再在数据库里面查数据的,
这些也都没啥,一般来说,别的教程都会说,这时候用这么个命令,创建数据库,就完了
codeql database create cpptest -l=cpp
对,就完了。
很多教程里面并没有说,敲这条命令的前提条件。
这里我说清楚吧。
首先,codeql 创建数据库,实际上是要编译一次程序的,实际上是还有个参数 -c 来控制编译的。
如果没有输入这个参数,也会编译,但是在 Windows 环境下,编译 C++ 程序,大多会失败,
且提示乱七八糟,乱码满屏飞,中文是完全都不支持吧,可能是utf-8编码的。
所以,如果要顺利创建一个数据库,需要传入一个 -c 参数来做编译操作。就变成了这样
1 codeql database create cpptest -l=cpp -c=“”
然后就是下一个问题,怎么编译,常规方式必然无法处理,
一般来说,Windows上编译软件,大多都是使用VS 系列,比如我这边, vs 从 6 到 2022 全都有。
第二个编译方法,可能少部分人会使用 mingw 安装 gcc 来编译代码,也没问题,
第三个编译的方法,极少数人可能会用 llvm + clang 来做编译,这个,我本地也有。
(其实最后我选择了方法3,因为1不行,2我又不想装,继续)。
OK了,那就一个一个来吧,正常来说,我们用VS来写代码,那么就用vs来编译吧,我还记得有个东西叫 devenv ,能直接编译整个项目,我好聪明,来吧,
先写个devenv 编译的命令吧,其实很简单:
1 devenv VSTest006.vcxproj /rebuild "Release" /Project VSTest006 /ProjectConfig "Release|Win32"
很容易吧,rebuild一个项目,然后build win32版, release 程序,一切都那么完美,这条命令是可以执行的(需要有vs2019 命令行环境),
然后第一条编译命令出现了,
1 codeql database create cpptest -l=cpp -c="devenv VSTest006.vcxproj /rebuild \"Release\" /Project VSTest006 /ProjectConfig \"Release|Win32\"" --overwrite
看着没啥问题,很完美,但是执行的时候,就疯了
什么破逼玩意。
行吧,这么搞,搞不定,那就来个曲线救国,
我把编译命令写个批处理,然年后调用批处理来编译,总可以吧。
1 codeql database create cpptest -l=cpp -c="build.bat" --overwrite
我很高兴地再重新创建数据库,
乱码出现了,不要紧,但是问题怎么解决啊,实际上。。。
可能codeql 工具链里面有个东西调用了这玩意,尴尬,咋整。批处理也不能用了,
还有最后一种方法,就是走自己动手老路,cl 一个一个编译文件,其实,我不想这么干,因为,如果我用cl 这么干的话,后续链接也需要我自己来链,太坑了。
至此 vs 系列,放弃,
我电脑中没有安装mingw,所以直接放弃
但是,我之前用过llvm,我这里还有llvm,所以,可以用llvm的工具 clang 来做相关的事情,试试看。
命令就变成了这样
1 codeql database create cpptest -l=cpp -c="clang VSTest006.cpp" --overwrite
成了
推断 -c 命令还支持 makefile 或者 cmake 之类的,这里是我懒得查,所以放弃了,先趟道,再深究。
数据库有了,然后就是查询了
查询怎么办,好办,
写段查询代码,就查了,比如,我查个函数吧
1 /** 2 * @name Nemesis 3 * @kind problem 4 * @id Zoo 5 */ 6 7 import cpp 8 9 10 from Function f 11 select f, f.getName()
打印函数名
正常查询、打印的命令是这样的
结果是这样的
效果还不错,8行第五个。
但是一般来说,第一次玩的时候,查询都是这样的结果
看说明说,需要有个 qlpack.yml ,然后开始google吧,运气好的话,10~30分钟后,问题可以解决,
运气不好,就看脸了,
强调一下很难么?还是我的脸就黑,我看的那些教程全部都是扯蛋的,全部都没说把它放在指定位置 ,
没人会说,这个代码,必须是放在 codeql 的库里面的,否则 第一行 import cpp 都import 不到,
一切都结束,命令行版就解决了,
非命令行版怎么办呢。
命令行版处理完了,UI版其实更简单了。OK,收工,
夜里饿了,中间炒了个饭,又炖了个汤
个人感觉,这玩意,其实和重构工具类似,都是通过AST树来分析各个元素,然后获取相关的各种信息,加以展示。
可能对那种解释性语言,它算式一个很有用的东西,
对编译性语言来说,它的用途,感觉有限,因为和他功能相近或类似的东西其实不少。
最近的,比如,VAX。。。代码整体重构,不但能各种查还能各种改,只是无法定位参数等信息,但是不重要,因为如果代码整洁规范的话,参数查的时候就找到了