深入codeql

介绍

关于Codeql,参考之前的文章:placeholder

这里将会基于codeql-go的源码来探索codeql的原理。

准备工作

extractor

trap文件

trap文件是一个流文件,每次通过Emit调用往其中写入下列数据之一:

  • 全局key和id的映射,例如: id=key, 其中,id是从10000自增的整数; key的例子有:
    • universe;scope,表示全局的scope所对应的id;
    • encoding/json;package则表示encoding/json这个包的id;
    • {scopeID},name;object scope中声明的对象
    • {id},methodName;method 表示某个类型的方法所对应的id;
    • 1;basictype 对应types.BasicKind,基本类型,如1=bool,2=int...;
    • 2,{elemTypeID};arraytype, 数组类型,2表示长度;
    • {elemTypeID};slicetype slice类型
    • field0Name,{field0TypeID},field0Tag,field1Name,{field1TypeID},field1Tag...;structtype 结构体类型
    • {elemTypeID};pointer 指针类型
    • method0Id,{method0TypeID},method1Id,{method1TypeID}...;interfacetype interface类型,注意,如果两个interface具有完全一样的方法,则它们的ID是相同的
    • {type0},{type1}...;tupletype Tuple类型,即返回多个值的函数
    • {paramType0},{paramType1}...;{retType0},{retType1}...;signaturetype 函数签名
    • {keyTypeID},{valueTypeID};maptype map类型
    • Dir,{elemTypeID};chantype chan类型
    • {underlyingTypeID};namedtype 使用type关键子定义的类型;type X struct{}, type Kind int
    • path;folder 目录
    • path;sourcefile 源文件
  • 表的一行,例如: tableName(1,"2","3")
    内容参考: trap文件示例

在一次解析的过程中,存在一个trap文件的根目录,每个包都会在这个根目录下生成对应的trap文件。

extractor/dbscheme/tables.go

表结构定义:

// extractor/dbscheme/dbscheme.go

// A Table represents a database table
type Table struct {
   
   
	name    string
	schema  []Column
	keysets [][
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值