如何用CodeQL查找Go中以make([]byte,0)初始化的变量
正确的CodeQL查询方法
原来的查询无法匹配目标变量,是因为全局变量的初始化属于变量声明语句(DeclStmt),而非普通赋值语句(AssignStmt)。需要通过VarDecl匹配变量声明,再关联其初始化表达式:
from DeclStmt declStmt, VarDecl varDecl, Ident varName, CallExpr makeCall where // 关联声明语句和变量声明 varDecl = declStmt.getDecl() and // 获取变量的标识符(名称) varName = varDecl.getVarName() and // 变量有初始化表达式,且是make调用 varDecl.hasInitializer() and makeCall = varDecl.getInitializer() and // 确认是调用内置的make函数 makeCall.getTarget() = Builtin::make() and // 检查make的第一个参数是[]byte类型 makeCall.getArgument(0).getType() = type([]byte) and // 检查第二个参数的整数值是0 makeCall.getArgument(1).getIntValue() = 0 select declStmt, varName, "该变量使用make([]byte, 0)初始化"
关键调整说明
- 用
DeclStmt和VarDecl替代AssignStmt:全局变量的定义属于变量声明,不是独立的赋值语句,所以要从声明语句入手。 - 直接用
type([]byte)简化类型检查:比手动拆解ArrayType更直观准确,也避免类型转换出错。 - 通过
varDecl.hasInitializer()确保变量有初始化表达式,再关联到makeCall。
内容的提问来源于stack exchange,提问作者E235
相关产品推荐
相关产品推荐

