• Windows 环境下,CodeQL 安装教程


    其实吧,这玩意,网上教程特别多,但是都有问题,

    很多细节说得不清不楚,结果按照教程根本无法完整地安装上,

    所以,这里还是重新整理一下 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。。。代码整体重构,不但能各种查还能各种改,只是无法定位参数等信息,但是不重要,因为如果代码整洁规范的话,参数查的时候就找到了

    其实,针对 devenv无法被codeql调用的情况,微软给了一个例子

    C:\codeql-home\codeql\codeql.cmd database create -l=cpp -s=C:\codeql-home\drivers\kmdf -c "msbuild /t:rebuild "C:\codeql-home\drivers\kmdf\kmdfecho.sln" /p:UseSharedCompilation=false" "C:\codeql-home\databases\kmdf" -j 0

    需要直接用msbuild,

    命令稍作修改,就可以编译了

    1 codeql.cmd database create -l=cpp -c "msbuild /t:rebuild \"E:\Code\visual studio 2019\VsTest001\VsTest001\VSTest006\VSTest006.vcxproj\" /p:UseSharedCompilation=false" msbuilds -j 0
  • 相关阅读:
    Saiku相关异常处理(十五)
    Saiku登录源码追踪.(十三)
    Saiku调用WS接口(十四)
    Saiku本地编译运行后Debug调试(十二)
    Windows查看Java内存使用情况
    Saiku免登录嵌入其他系统使用(十一)
    Saiku更改源代码实现默认查询一天的数据(十)
    Saiku关于MDX过滤的使用-默认显示最近一周的数据(九)
    Saiku部分函数解析(八)
    Saiku缓存处理(七)
  • 原文地址:https://www.cnblogs.com/suanguade/p/16080015.html
Copyright © 2020-2023  润新知