我有一个变量被设置为包中的全局变量(不在函数内):
var myArr []byte = make([]byte, 0)
我想找到所有用
make([]byte, 0)
初始化变量的地方。
这就是我尝试做的:
from AssignStmt assign, Ident id, CallExpr make
where
assign.getLhs().(Ident) = id and
make = assign.getRhs().(CallExpr) and
make.getTarget() = Builtin::make() and
make.getArgument(0).getType().(ArrayType).getElementType().hasQualifiedName("", "byte") and
make.getArgument(1).getIntValue() = 0
select assign, id, "This variable is assigned with make([]byte, 0)."
但它没有找到任何东西,尽管我在代码中有这样的行。
根据文档,我似乎需要使用
DeclStmt
来搜索声明的变量。我还在想办法。Owen Mansel-Chan 在 Slack 上回答我:
from VarDecl vd, ValueSpec vs, CallExpr rhs
where
vs = vd.getASpec() and
vs.getNumInit() = 1 and
rhs = vs.getInit(0) and
rhs.getTarget() = Builtin::make() and
rhs.getArgument(0).getType().(SliceType).getElementType() = Builtin::byte().getType() and
rhs.getArgument(1).getIntValue() = 0 and
not exists(rhs.getEnclosingFunction())
select vd, vs, rhs
我检查了一下,它有效。