Basic query for Java code

💡 原文中文,约6400字,阅读约需16分钟。
📝

内容提要

本文介绍如何使用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语句在代码查看器中以黄色背景高亮。

🏷️

标签

➡️

继续阅读