Basic query for Java code
内容提要
本文介绍如何使用LGTM编写并运行一个简单的CodeQL查询,用于查找Java代码中冗余的if语句(即空then分支)。内容包括查询步骤、查询结构解析(import、from、where、select),以及通过添加条件排除带else分支的假阳性结果,提升查询准确性。
延伸解读
查询结构解析
CodeQL查询由import、from、where、select四部分组成,与SQL的FROM、WHERE、SELECT类似。import导入标准库,from定义变量,where设置条件,select定义输出。理解这一结构有助于编写更复杂的查询。
假阳性与查询优化
初始查询可能产生假阳性,例如带有else分支的if语句,其空then分支可能是有意为之。通过添加`not exists(ifstmt.getElse())`条件,可以排除这类情况,提高查询准确性。这体现了查询编写的迭代过程。
运行环境与结果查看
查询在LGTM.com的查询控制台中运行,针对所选项目的最新提交。结果以表格形式展示,点击链接可查看源代码中的匹配位置,并高亮显示。注意结果可能不完整,需点击省略号查看更多。
Q&A
如何使用LGTM编写并运行一个简单的CodeQL查询来查找Java代码中冗余的if语句?
在LGTM.com上搜索项目,点击项目进入查询控制台,选择Java语言,复制查询代码(import java; from IfStmt ifstmt, Block block where ifstmt.getThen() = block and block.getNumStmt() = 0 select ifstmt, "This 'if' statement is redundant.")到文本框中,点击Run运行。
CodeQL查询中import、from、where、select各部分的作用是什么?
import导入标准库;from定义变量;where定义条件;select定义要报告的内容。
如何排除带有else分支的if语句,以减少假阳性结果?
在where子句中添加条件:and not exists(ifstmt.getElse()),这样就会忽略有else分支的if语句。
CodeQL查询中如何表示一个空的then分支?
使用block.getNumStmt() = 0,其中block是then分支的Block对象,表示该块中没有语句。
在LGTM查询控制台中,如何选择要查询的项目?
可以通过点击项目页面上的“Query this project”按钮,或者直接进入查询控制台,在语言下拉列表中选择Java,然后从项目下拉列表中选择一个或多个项目。
查询结果如何显示?
查询结果以两列显示,第一列是ifstmt,链接到源代码位置;第二列是警报信息。匹配的if语句在代码查看器中以黄色背景高亮。