You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 13:25:57