CodeQL查询未捕获Lambda表达式变量赋值的问题咨询
CodeQL查询未捕获Lambda表达式变量赋值的问题咨询
嗨,我来帮你捋捋这个问题~ 你遇到的情况是因为CodeQL对Java代码里的赋值场景做了明确区分,你当前的查询只覆盖了已声明变量的直接赋值,但没包含变量声明时的初始化赋值——而你提到的Runnable r = () -> {...}就属于后者。
先给你理清楚CodeQL Java库中的类型逻辑:
AssignExpr对应的是像s = "test2"这种,给已经存在的变量赋值的场景;- 而像
public String s = "test"或者Runnable r = () -> {...}这种,在变量声明阶段直接初始化的场景,对应的是VariableDeclarator类型,Lambda表达式作为初始化值是它的子节点,不会被单纯的AssignExpr查询覆盖到。
如果你想同时捕获这两种赋值场景(包括Lambda作为右值的变量初始化),可以调整你的查询,同时包含AssignExpr和带初始化表达式的VariableDeclarator,示例如下:
import java from Expr assignment, Variable v where (assignment instanceof AssignExpr and (assignment as AssignExpr).getTarget() = v.getAccess()) or (assignment instanceof VariableDeclarator and (assignment as VariableDeclarator).getVariable() = v and exists((assignment as VariableDeclarator).getInitializer())) select assignment, "这是一个赋值操作(包含带Lambda的变量初始化)"
如果你的需求更精准,只想抓右值是Lambda表达式的赋值/初始化,可以用这个针对性的查询:
import java from Expr assignment, LambdaExpr lambda where (assignment instanceof AssignExpr and (assignment as AssignExpr).getRValue() = lambda) or (assignment instanceof VariableDeclarator and (assignment as VariableDeclarator).getInitializer() = lambda) select assignment, "右值为Lambda表达式的赋值操作"
用这两个查询跑你的代码,就能成功捕获到Runnable r = () -> {...}这个变量初始化了。另外你还可以根据需求细化筛选条件,比如只看局部变量的话,加个v instanceof LocalVariable(对应第一个查询)就能缩小范围啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

