介绍
vscode安装和使用
如果你想分析自己的代码仓库,你需要安装完整的codeql CLI, 推荐使用vscode扩展。
1.安装CLI工具和相应的库
整体工具组成如下:
~/codeql-home
|
|
-- codeql
| |
| ---codeql codeql可执行文件
|
-- codeql-repo code的代码仓库 git clone --depth 1 https://github.com/github/codeql codeql-repo
|
-- codeql-go go分析器 git clone --depth 1 https://github.com/github/codeql-go
# 下载
# 解压到~/codeql-home
mkdir ~/codeql-home
cd ~/codeql-home
git clone --depth 1 https://github.com/github/codeql codeql-repo
git clone --depth 1 https://github.com/github/codeql-go
# 下载codeql-macosx.zip
unzip ~/Downloads/codeql-macosx.zip # 解压到 ~/codeql-home/codeql目录
~/codeql-home/codeql/codeql version # 输出版本号
在vscode中安装codeql插件,并配置codeql的路径为:$HOME/codeql-home/codeql/codeql
(不要使用~
,而是使用$HOME
)
2.创建ql database
# codeql-database 为将要生成的目录,用于存放codeql分析生成的结果
~/codeql-home/codeql/codeql database create codeql-database --language=go
这个过程会持续很久(取决于仓库依赖的包数量)
3.在vscode中添加database
创建完database之后,在生成的目录上右键,选择设置为当前数据库:
4.查询示例
cmd+shift+p
执行命令:CodeQL: Quick Query
示例:找到所有对结构体作为Receiver的方法:
import go
from Method m, Variable recv
where
recv = m.getReceiver() and
not recv.getType() instanceof PointerType
select m, "This method has non-pointer receiver:"+ recv
结果:
5.注意事项
可以不加 @kind problem
, select
返回两列仍然是有效的。
注意,并不是所有的元素都能被提供定位,比如:
import go
from Type t,string pkgName
where t.hasQualifiedName(pkgName, "MultiPackUserHandler")
select t,"it's a problem"
在这个例子中,能够提供定位的是t.getEntity()
import go
from Type t,string pkgName
where t.hasQualifiedName(pkgName, "MultiPackUserHandler")
select t.getEntity(),"it's a problem"
ql文件
基本组成
/**
*
* Query metadata
*
*/
import /* ... CodeQL libraries or modules ... */
/* ... Optional, define CodeQL classes and predicates ... */
from /* ... variable declarations ... */
where /* ... logical formula ... */
select /* ... expressions ... */
返回两列
输出包含:element,message
前者用于定位具体节点,后者用于显示消息。